以前、Oracle の一般的な問題のリストを集めましたが、どこから来たのか忘れてしまいました
SELECT N 問題について
一部のネチズンが、データの特定の指定された行を選択する問題について繰り返し相談し、議論しているように感じます。私は次のような簡単な問題を書きました説明を訂正してください
ここで説明されている SELECT N には次の状況が含まれます:
1. TOP N 行のレコードを選択します
3. FOOT N 行のレコードを選択します
もちろん、考慮する必要があります。 ORDER BY 句の有無について、システム ビュー CAT を例に挙げてそれぞれ説明します。
注: A. ORDER BY を使用しない場合です
B ORDER BY を使用する場合です
1。
A . SELECT * FROM CAT WHERE ROWNUM<=N
B. R (SELECT ROWNUM ROWSEQ, Table_name, Table_type from Cat)
where rowseq where n1
b; FROM
( SELECT ROWNUM ROWSEQ,X.* FROM (SELECT * FROM CAT ORDER BY TABLE_TYPE) レコード数がわかっている場合は、上記の方法 2 を使用します
A. SELECT TABLE_NAME,TABLE_TYPE FROM
( SELECT ROWNUM ROWSEQ,TABLE_NAME,TABLE_TYPE FROM CAT )
WHERE ROWSEQ > ( SELECT COUNT(*)- N FROM CAT )
B. SELECT TABLE_NAME,TABLE_TYPE FROM CAT ORDER BY TABLE_TYPE)
WHERE ROWSEQ > *)-N FROM CAT )
または
SELECT * FROM
(SELECT TABLE_NAME,TABLE_TYPE FROM CAT ORDER BY TABLE_TYPE DESC)
WHERE ROWNUM<=N
上記は、Windows2000pro の ORACLE8.1.5 でテストされました
-- end --
oracle FAQ(1) from chao_ping
1. 簡単なアレンジメント 壊れたテーブル (Oracle8i でのみ使用可能)
ALTER TABLE table_name MOVE (TABLESPACE XXX);
テーブルが配置されているテーブルスペースを移動する方法方法 1:
1.このテーブルをエクスポートします
2.このテーブルを削除します
3.テーブル xxx テーブルスペース xxx を作成します。 Imp Ignore=y
もう 1 つの注意点は、この表を読み取ろうとするすべての PL/SQL ストアド プロシージャが無効になることです。再コンパイルする必要があります。
1. SELECT * FROM DBA_OBJECTS WHERE STATUS = 'INVALID'
2. これらのパッケージ、関数、およびプロシージャを再コンパイルします。
方法 2:
Oracle8i にのみ適用されます。
次のステートメントを使用します:
ALTER TABLE table_name MOVE
TABLESPACE new_tablespace;
この場合、すべての制約、インデックス、トリガーは影響を受けません。
ただし、これでマークされたインデックスはすべて再構築する必要があります。
2. ユーザー名とパスワードを入力せずに sql*plus を直接入力する方法:
sqlplus /nolog;
sqlplus username/password@connect_string
3. インデックスを変更してストレージを再構築する() ;
インデックス xxx 結合
4. dbms_output の結果が表示されないのはなぜですか?
サーバー出力をオンに設定します
5. 大規模なトランザクションの後、コミットされましたが、ロールバック セグメントがまだ非常に大きいのはなぜですか?
OPTIMALの値が設定されていないため、自動的に縮小されません。
手動で縮小するには、alter rollbackegg を使用して Xm に縮小できます。
6. なぜ CHAR ではなく VARCHAR2 を使用するのでしょうか? CHAR は長さ 2000 バイトのみをサポートしますが、VARCHAR2 は長さ 4000 バイトをサポートするため、より適用性が高くなります
B。 CHAR は、定義された長さに応じてより多くの記憶領域を占有し、文字の挿入後にスペースが自動的に追加されます。ただし、VARCHAR2 は、定義された長さに関係なく、実際に挿入された長さのみを使用します。
7. テーブル/インデックスが占めるスペースが異なるデータ ディクショナリと異なるのはなぜですか?
SQL> select tables , empty_blocks from dba_tables where table_name='テーブル名';
BLOCKS EMPTY_BLOCKS
---------- ------------
1575 1524
SQL> ; バイト、ブロック、エクステントを dba_segments から選択します。ここで、segment_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 ジャクソン、ドリュー
次の SQL ステートメントを使用して重複レコードを特定します:
SQL> SELECT COUNT(*), EMP_ID, OFFICE_ID
FROM EMP
GROUP BY EMP_ID, OFFICE_ID
HAVING COUNT(*)
;
結果は次のようになります:
COUNT(*) EMP_ID OFFICE_ID
2 305 12
Table 重複値の例:
SQL> SELECT * FROM EMP;
EMP_ID OFFICE_ID EMPNAME
305 12 ELLアイソン、ジョージ
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 EMP_ID、OFFICE_ID による);
10. 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 列を削除
13。 テーブルを素早く片づけるにはどうすればよいでしょうか?
テーブル table_name を切り詰めます
14. トランザクションに大規模なロールバック セグメントを指定するにはどうすればよいですか?
ロールバックセグメント rbs_name
15 を使用するトランザクションを設定します。 テーブルに対するアクセス許可を誰が持っているか、またそのユーザーにどのようなアクセス許可が与えられているかをどのようにして知ることができますか?
select * from dba_tab_privs where table_name='テーブル名';
16. 必要なテーブルを誰がロックしたかを確認するにはどうすればよいですか?
v$locked_object から object_id を選択します。
dba_objects から object_name、object_type を選択します。 (truncate を使用して) テーブルがクリアされるたびに、このテーブルのストレージ パラメータ NEXT は自動的に最後にリセットされます。削除されたエクステントのサイズ。同様に、テーブルから領域が明示的に解放された場合、NEXT パラメータは最後に解放されたエクステントのサイズに自動的に設定されます。
SQL*Plus では、トランザクションのロールバック セグメントを指定できます。これは、大規模なトランザクションが発生しようとしているときに非常に役立ちます。次の文を使用して、このトランザクションのロールバック セグメントを指定します:
SQL>SET TRANSACTION USE ROLLABCK SEGMENT ロールバック セグメント名;
PL/SQL でトランザクションのロールバック セグメントを指定することもできます (動的 SQL 文を使用せずに)。これには、Oracle が提供するパッケージ DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('ロールバック セグメント名') を使用する必要があります。
一部のプラットフォームでは、Oracle は起動時に sgadefSID.dbf を自動的に生成します。このファイルを使用して、このファイルが存在するかどうかを確認できます。インスタンスが実行されているかどうか。このファイルには、メモリ内の SGA のアドレスが含まれています。データベースが閉じられると、Oracle はこのファイルを自動的に削除します。しかし、Oracle8i では、このファイルは存在しません。インスタンスが実行されているかどうかを判断するには、新しい判断方法を使用する必要があります。たとえば、PS コマンドです。
Oracle7ではデータファイルが自動展開できるかどうかを知りたい場合はsys.filext$テーブルから確認する必要がありましたが、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) from chao_ping
OPTIMAL パラメータについて
optimal は、ロールバック セグメントのサイズを制限するために使用されるストレージ パラメータです。長いトランザクションを実行した後、そのトランザクションで使用されるロールバック セグメントは比較的大きくなります。Optimal パラメーターを設定した後、トランザクションがコミットされると、ロールバック セグメントは Optimal で指定されたサイズまで自動的に縮小されます。
システム内に長時間実行されるトランザクションが多数ある場合は、ロールバック セグメントの Optimal パラメーターをより大きく設定する必要があります。これは、ロールバック セグメントの表スペースの連続性を維持するのに役立ちます。そうしないと、継続的な拡張と縮小によって表スペースがさらに断片化されてしまいます。
システム内の主要なトランザクションが短期間である場合、ロールバック セグメントをより小さく設定する必要があります。これにより、ロールバック セグメント内の情報が SGA に保存され、システムのパフォーマンスが向上します。
ロールバック セグメントの Optimal パラメーターは、ロールバック セグメントの作成時に指定することも、
ALTER ROLLBACK SEGMENT SEGMENT_NAME OPTIMAL XX M; を使用してリセットすることもできます。
Oracle8i では、
ALTER SESSION SET CURRENT_SCHEMA=
を使用して現在のユーザー モードを変更できます。
Oracle は、Oracle 6.0 以降、このツールは Oracle データベースを管理するための主要なツールであり、サーバー マネージャーのサポートを終了すると発表しました。現在、サーバー マネージャーは SQL*Plus に置き換えられているため、サーバー マネージャーの対応する機能も SQL*Plus に統合されています。
SQL*Plus に追加された主な新しいコマンドは、起動、シャットダウン、アーカイブ ログ、およびリカバリです。もちろん、一連の CREATE、ALTER、その他のステートメントなどの標準 SQL 構文は引き続きサポートされます。ただし、ALTER DATABASE OPEN、ALTER DATABASE MOUNT、ALTER DATABASE BACKUP、および当初サポートされていなかったその他の文など、一部の文にはいくつかの変更が加えられています。
SET コマンドには、自動回復などを含む新しいオプションもいくつかあります。 SHOW コマンドを使用して、SHOW PARAMETER、SHOW SGA などのパラメータを直接表示することもできます。これらはすべて、サーバー マネージャーでのみ使用できる機能です。
Oracle8i は依然としてよく知られた INTERNAL アカウントを保持していますが、これは主に下位互換性のためであることを覚えておいてください。 INTERNAL アカウントの機能は、SYSDBA と SYSOPER の 2 つのロールによってサポートされるようになりました。 INTERNAL/SYS のパスワードは、次の方法を使用して変更できます:
O/S プロンプト> orapwd パスワード=<パスワード>
データベースが作成されたばかりの場合、SYS のパスワードはデフォルトでchange_on_install に設定されます。 SYSTEM はマネージャーであり、INTERNAL にはパスワードがありません。したがって、データベースを作成した後、最初に行うことは、上記 3 人のユーザーのパスワードを変更することです。 INTERNAL のパスワードは前述の方法で変更できますが、SYSTEM と SYS は ALTER USER username IDENTIFIED BY passwd; を使用して直接変更できます。 Oracle8i 以降、ALTER USER SYS IDENTIFIED BY パスワードにより INTERNAL のパスワードも変更されることに注意してください。INTERNAL のパスワードを設定すると、同時に SYSDBA と SYSOPER の 2 つのロールが管理を担当するユーザーに即座に付与されます。このデータベース。 INTERNAL を使用してデータベースに接続するスクリプトの場合は、それに応じていくつかの変更を行う必要があります。
データベースを起動してシャットダウンします:
SQL*Plus からデータベースを起動するには、以下の手順に従ってください:
O/S プロンプト>sqlplus /nolog
SQL> scott/tiger を SYSDBA として接続します
SQL>起動
デフォルトとは異なるパラメータでデータベースを起動したい場合は、次のパラメータを指定して起動コマンドを使用できます:
SQL> 起動 PFILE=
たとえば、IO のバランスをとるために、データ ファイルの場所を変更する必要があります。
SQL 起動マウント
メンテナンス タスクの完了後、データベースを閉じてから再起動することを選択できます。通常の方法でデータベースを開くか、SQL*Plus に次のコマンドを直接入力すると、Oracle が通常どおり実行を開始できます。データベースを開くのを変更する
場合によっては、新しいデータベースを作成するか、制御ファイルを再構築する必要がありますが、次のステートメントを使用する必要があります:
SQL>startup nomount
データベースを正常に起動することが難しい場合は、次のステートメントを使用することを検討してください。強制的に起動するには、次の方法があります。FORCE オプションを使用します。STARTUP FORCE は、実際には、このようなプロセスである SHUTDOWN ABORT とその後の STARTUP に相当します。
SQL> 強制起動
SHUTDOWN このコマンドには、いくつかのパラメータから選択することもできます:
通常のシャットダウンは、システムを通常にシャットダウンする前に、すべてのユーザーがシステムから終了するのを待ちます。これはデータベースをシャットダウンする最も理想的な方法です。通常、この方法はデータベースを正常にシャットダウンするために使用する必要があります。
SQL> シャットダウン
Oracle8i 以降、新しいシャットダウン オプション SHUTDOWN TRANSACTIONAL が追加されました。これにより、すべてのユーザーがトランザクションを完了し、トランザクションがコミットされるとすぐに切断されるようになります。これにより、ユーザーがトランザクションを失わないようにするだけでなく、必要なメンテナンス操作に間に合うようにデータベースをシャットダウンできるようになります。この方法でシャットダウンすると、次回のシステム起動後にインスタンス レベルのリカバリを実行する必要がなくなります。これは、以下で説明する他の 2 つの方法よりも理想的です。
SQL> トランザクションのシャットダウン
SHUTDOWN IMMEDIATE は、ユーザーの現在のトランザクションが完了するのを待たずに直ちに中止し、これらのユーザーの現在のトランザクションをロールバックします。ただし、長期間送信されていないトランザクションがある場合、SHUTDOWN IMMEDIATE は思ったほど即時ではない可能性があります。また、これらのトランザクションのロールバックにも時間がかかる場合があります。
SQL>即時シャットダウン
Oracle8i の最後のシャットダウン方法は SHUTDOWN ABORT です。このシャットダウン方法は、実際には、コンピュータの電源を直接オフにすることとあまり変わりません。現在接続しているユーザーはすぐに切断され、次回インスタンスを再起動するときに、インスタンス レベルのリカバリを実行して、コミットされていないトランザクションをロールバックする必要があります。
SQL> シャットダウン中止
ALTER TABLE table_name MOVE 後、テーブルのインデックス フラグは UNUSABLE ですか?
Oracle8i 以降では、 alter table table_name move [tablespace tablespace_name];
を直接使用して、表を別の表スペースに移動したり、表の格納方法を再編成して断片化を軽減したりできます。ただし、この使用後は、このテーブル上のすべてのインデックスは使用不可としてマークされます。これは、テーブルを MOVE した後、テーブル内の列に対応する物理位置が変更され、つまりすべての行の ROWID が変更され、このテーブルのインデックスが行の ROWID を使用するためです。 Oracle はインデックスに対応する ROWID を自動的に更新しないため、この時点ではインデックス上の ROWID が間違った場所を指しています。したがって、インデックスには UNUSABLE のマークが付けられます。現時点では、インデックスを手動で再構築する必要があります。次の構文を使用してインデックスを再構築できます:
ALTER INDEX Index_name REBUILD; もちろん、インデックスのストレージを最適化するために、インデックスに特定の適切なストレージ パラメーターを指定することもできます。おそらく、Oracle がインデックスを自動的に維持しない理由は、インデックスに適切な記憶域パラメータを指定できるようにするためです。
Oracle をリモートでインストールする方法:
PC 上の X-window クライアントから Oracle システムを Unix にインストールする必要がある場合は、次の点に注意してください: Oracle8i は Java テクノロジーを使用するユニバーサル インストーラーを使用しており、以下の環境にある必要があります。グラフィカルインターフェイスをインストールします。リモート インストールの場合は、ユニバーサル インストーラーのグラフィカル インターフェイスを表示する場所を設定する必要があります:
$DISPLAY=workstation_name:0.0
$export DISPLAY
を使用します。たとえば、PC の IP アドレスは 150.150.4.128 です。マシン名が test の場合、次の構文を使用してインストールの準備をすることができます:
$DSIPLAY=150.150.4.128:0.0
$export DISPLAY
または、次の構文を使用しますが、テスト マシンの情報は必須 hosts ファイルに書き込みます:
DSIPLAY=test:0.0
$export DISPLAY