以前、Oracle の一般的な問題のリストを集めましたが、その出典は忘れました。一部のネットユーザーは、特定のデータ行の選択に関する問題について繰り返し相談し、次のような簡単な説明を書きました。ここで説明する SELECT N には次の状況が含まれます: 1. TOP N 行のレコードを選択する 2. N1 ~ N2 行のレコードを選択する 3. FOOT N 行のレコードを選択する もちろん、ORDER BY 句があるかどうかを考慮する必要があります。以下のように、インタビューではシステム ビュー CAT を例としてそれぞれ説明します。 注: A. ORDER BY を使用しない場合 B. ORDER BY を使用する場合 1. TOP N 行のレコードを選択する A. SELECT * FROM CAT WHERE ROWNUM ( SELECT COUNT(*)-N FROM CAT ) B. SELECT TABLE_NAME,TABLE_TYPE FROM ( SELECT ROWNUM ROWSEQ,TABLE_NAME,TABLE_TYPE FROM CAT ORDER BY TABLE_TYPE) WHERE ROWSEQ > ( SELECT COUNT(*)-N FROM CAT ) または SELECT * FROM ( SELECT TABLE_NAME,TABLE_TYPE FROM CAT ORDER BY TABLE_TYPE DESC) WHERE ROWNUM select tables , empty_blocks from dba_tables where table_name='テーブル名; BLOCKS EMPTY_BLOCKS ---------- ---------- -- 1575 1524 SQL> select bytes,blocks,extents from dba_segments wheresegment_name=テーブル名; - --------- ------- --- 6348800 3100 1 これは、最初のデータベース ビュー DBA_TABLES の BLOCKS 列が、実際に使用されている BLOCK の数を参照しているためです。一部の BLOCK は占有されていますが、データは存在せず、その中に含まれていません。 DBA_SEGMENTS データベース ビューの BLOCKS 列は、データのあるブロックとデータのないブロックの合計数を含む、このテーブルが占有するブロックの合計数を指します。最初のビューの BLOCKS と EMPTY_BLOCKS の合計を合計すると、2 番目のビューの BLOCKS 列のサイズとまったく同じになります。 8. データベース内の 1 つまたは複数のテーブルを通常のテキスト ファイルとして保存するにはどうすればよいですか? SQL*Plus で SPOOL コマンドを使用すると、選択したデータを SPOOL で指定されたファイルに保存できます。9. テーブルから重複レコードを削除する方法 SQL> SELECT * FROM EMP; EMP_ID OFFICE_ID EMPNAME 305 12 ELLISON, GEORGE 305 12 MERCURIO, JASON 128 17 SIMPSON, LINDA 305 22 JACKSON, DREW これらの重複レコードを特定するには、次の SQL ステートメントを使用します。 > SELECT COUNT(*), EMP_ID, OFFICE_ID FROM EMP GROUP BY EMP_ID, OFFICE_ID HAVING COUNT(*) > 1; 結果は次のようになります: COUNT(*) EMP_ID OFFICE_ID 2 305 12 重複する値を含むテーブルの例: SQL> SELECT * FROM EMP; EMP_ID OFFICE_ID EMPNAME 305 12 ELLISON、GEORGE 305 12 MERCURIO、JASON 128 17 SIMPSON、LINDA 305 22 JACKSON、DREW 重複レコードを削除するには、次のステートメントを使用します。 SQL> DELETE FROM EMP A WHERE (EMP_ID, OFFICE_ID, 2 ) IN (SELECT EMP_ID, OFFICE_ID, decode(count(*),1,1,2) FROM EMP B WHERE A.EMP_ID=B.EMP_ID AND A.OFFICE_ID = B.OFFICE_ID GROUP BY EMP_ID, OFFICE_ID); SQL*PLUS でデータベースに特殊文字を挿入するにはどうすればよいですか? CHR機能が使えます。 11. 列を削除するにはどうすればよいですか? Oracle8i では、列を直接削除できます。構文は alter table table_name drop column_name; ですが、initsid.ora で COMPATIBILE=8.1.0 以降を設定するように注意してください。 12. 列の名前を変更するにはどうすればよいですか? 1 alter table "table_name" add (new_column_name data_type); 2 update table_name set new_column_name = old_column_name where rowid=rowid; 3 alter table table_name drop column old_column_name; テーブルを素早く片づけるにはどうすればよいでしょうか?テーブル table_name を切り詰めます。 トランザクションに大規模なロールバック セグメントを指定するにはどうすればよいですか?トランザクション使用ロールバック セグメント rbs_name を設定します。 テーブルに対するアクセス許可を誰が持っているか、またそのユーザーにどのようなアクセス許可が与えられているかをどのようにして知ることができますか? select * from dba_tab_privs where table_name=テーブル名; 必要なテーブルを誰がロックしたかを確認するにはどうすればよいですか? Select object_id from v$locked_object; Select object_name, object_type from dba_objects where object_id=''; テーブルがクリアされるたびに (truncate を使用して)、このテーブルのストレージ パラメータ NEXT は最後に削除されたエクステントのサイズに自動的にリセットされます。同様に、テーブルから領域が明示的に解放された場合、NEXT パラメータは最後に解放されたエクステントのサイズに自動的に設定されます。 SQL*Plus では、トランザクションのロールバック セグメントを指定できます。これは、大規模なトランザクションが発生しようとしているときに非常に役立ちます。このトランザクションのロールバック セグメントを指定するには、次の文を使用します。 SQL>SET TRANSACTION USE ROLLABCK SEGMENT ロールバック セグメント名 PL/SQL でトランザクションのロールバック セグメントを指定することもできます (動的 SQL 文を使用しない)。これには、Oracle が提供するパッケージを使用する必要があります。 DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('ロールバック セグメント名'); 一部のプラットフォームでは、起動時にこのファイルを使用してインスタンスが存在するかどうかを確認できます。このファイルには、メモリ内の SGA のアドレスが含まれています。データベースが閉じられると、Oracle はこのファイルを自動的に削除します。しかし、Oracle8i では、このファイルは存在しません。インスタンスが実行されているかどうかを判断するには、新しい判断方法を使用する必要があります。たとえば、PS コマンドです。 Oracle7ではデータファイルが自動展開できるかどうかを知りたい場合はsys.fileext$テーブルから確認する必要がありましたが、Oracle8ではdba_data_filesからデータファイルが自動展開できるかどうかを知ることができます。 Oracle8i 以降では、データベースの起動と停止、ユーザーのログイン、ログアウト、その他のトランザクションなど、別のタイプのデータベース レベルのトリガーを作成できます。これにより、このイベントの発生をトリガーして、特定のレコードを作成できます。データベース レベルで定義されたトリガーは、すべてのユーザーに対して対応するイベントが発生したときにトリガーされますが、スキーマ レベルで定義されたトリガーは、特定のユーザーに対して対応するイベントが発生したときにのみトリガーされます。 Oracle8i 以降、データベースをシャットダウンする追加の方法、SHUTDOWN TRANSACTIONAL が追加されました。このアプローチにより、すべてのユーザーが自分の作品を送信できるようになります。ただし、送信されると、すべてのユーザーがそれぞれのトランザクションを完了すると、接続はすぐに切断され、シャットダウンが開始されます。 Oracle8 以降、一時テーブルの定義はユーザーのすべてのセッションに表示されますが、各セッションでクエリ、挿入、削除されるデータは、他のセッションでクエリ、挿入、削除されるデータと同じです。セッションは関係ありません。セッションごとにこのようなテーブルがあるようです。 Oracle8i 以降、パーティション化されていない表は、IMP/EXP を使用せずに迅速に再編成できるようになりました。ただし、これにはテーブル容量の 2 倍のテーブルスペースが必要です。このステートメントは次のとおりです。 ALTER TABLE TB_NAME MOVE TABLESPACE TS_NAME; 逆索引は Oracle8i で作成できます。 (CREATE INDEX i ON t (a,b,c) REVERSE;)。逆引きインデックスの隣接キー値は物理的に隣接する場所に格納されないため、これらのインデックスを効果的に利用できるのはフルインデックススキャンまたはシングルカラムなどのステートメントのみです。このタイプの逆順インデックスを使用すると、Oracle パラレル サーバー上のさまざまなインスタンスによるデータベースへの変更を適切に調整でき、システムのパフォーマンスをある程度向上させることができます。 Oracle8 以降、$instance ビューは、ホスト名、インスタンス名、起動時間、バージョン番号など、多くの有用な情報を取得できるようになりました。 一時表スペースに作成された一時セグメントは、シャットダウン時にのみ解放されます。ただし、永続表スペースに作成された一時セグメントはトランザクション終了後に解放され、Smon プロセスがこのタスクを完了します。 oracle FAQ(2) (chao_ping より) OPTIMAL パラメータについて optimal は、ロールバック セグメントのサイズを制限するために使用されるストレージ パラメータです。長いトランザクションを実行した後、そのトランザクションで使用されるロールバック セグメントは比較的大きくなります。Optimal パラメーターを設定した後、トランザクションがコミットされると、ロールバック セグメントは Optimal で指定されたサイズまで自動的に縮小されます。 システム内に長時間実行されるトランザクションが多数ある場合は、ロールバック セグメントの Optimal パラメータをより大きく設定する必要があります。これは、ロールバック セグメントの表スペースの連続性を維持するのに役立ちます。そうしないと、継続的な拡張と縮小によって表スペースがさらに断片化されてしまいます。 システム内の主要なトランザクションが短期間である場合は、ロールバック セグメントを小さく設定する必要があります。これにより、ロールバック セグメント内の情報が SGA に格納され、システムのパフォーマンスが向上します。 ロールバックセグメントの最適なパラメータを作成できます