多くの場合、データベースのパフォーマンスは低下します。最初に、大きなテーブルの全表スキャンが行われているかどうかを確認する必要があります。
最初に全表スキャンとは何かを確認してから、Oracleで全表スキャンを見つけるためのクエリが表示されます
全表スキャンとは
- 全表スキャンは、オプティマイザーが使用するアクセス方法の1つです。この場合、テーブル内のすべてのブロック(HWMまで)がスキャンされ、WHERE句のフィルター条件が適用され、フィルター条件を満たした行が返されます。 Explainプランは次のように表示されます
Execution Plan
TABLE ACCESS FULL OF HZ_PARTIES
- 全表スキャンは、複数のブロック読み取りを使用してテーブルをスキャンしました。IOごとに複数のブロックがスキャンされます–>実行されるIO操作が少なくなります
- db_multiblock_read_count init.oraパラメーターは、マルチブロック数を決定します。最近のバージョンでは、Oracle自体がシステムに従ってこのパラメーターを調整するため、定義する必要はありません。
- HWMとは–最高水準点:データを含む、または含むブロックと、挿入されたことのないブロックを区別する制限です。 HWMの下のブロック数は、dba_tablesビューのブロック列から取得できます
Oracleで全表スキャンを検索するためのクエリ
col event format a25 col module format a50 col File format 9999 col Block format 9999999 set lines 130 set trimspool on select sessw.SID, sessw.EVENT, sessw.p1 "File",sessw.p2 "Block", s.MODULE from v$session_wait sessw, v$session sess where sessw.sid = sess.sid and sessw.event like '%scattered%' order by 1 /
上記のクエリは、データベースで行われている現在の全表スキャンを報告します。以下のクエリからテーブル名を見つけることができます
select segment_name
from dba_extents
where file_id = &fileid
and &block between block_id and block_id + blocks - 1
;
全表スキャンのためにデータベース内の現在のすべてのセッションの履歴を確認したい場合は、以下のクエリを使用できます
column user_process heading "Name |SID" format a20;
column long_scans heading "Long Scans" format 999,999,999;
column short_scans heading "Short Scans" format 999,999,999;
column rows_retreived heading "Rows Retrieved" format 999,999,999;
set linesize 1000
set timing on
select ss.username||'('||se.sid||') ' "USER_PROCESS",
sum(decode(name,'table scans (short tables)',value)) "SHORT_SCANS",
sum(decode(name,'table scans (long tables)', value)) "LONG_SCANS",
sum(decode(name,'table scan rows gotten',value)) "ROWS_RETRIEVED"
from v$session ss, v$sesstat se, v$statname sn
where se.statistic# = sn.statistic#
and (name like '%table scans (short tables)%'
or name like '%table scans (long tables)%'
or name like '%table scan rows gotten%' )
and se.sid = ss.sid
and ss.username is not null
group by ss.username||'('||se.sid||') '
order by LONG_SCANS desc
/
全表スキャンステートメントのライブラリキャッシュにキャッシュされているすべてのSQLを検索する場合
select sql_id,object_owner,object_name from V$SQL_PLAN where
operation='TABLE ACCESS' and
options='FULL' and
object_owner <> 'SYS';
以下のクエリを使用して、sql_idから全文を取得できます
SELECT sql_text, parsing_schema_name, module FROM v$sql WHERE sql_id = '&1'
Oracleで全表スキャンを回避する方法
全表スキャンは必ずしも悪ではありません。 Oracleオプティマイザは、データポイントに基づいてプランを選択します。フルデータスキャンを選択した場合、それは確かに良いと思います。また、多くの場合、インデックススキャンはクエリに適さない可能性があり、全表スキャンよりもコストがかかります。したがって、全表スキャンを決定する前に、徹底的に分析する必要があります
チェックする項目の一部を次に示します。
(a)古いオプティマイザーの統計:テーブルで使用可能なオプティマイザーの統計が最新であり、実際のデータとあまり変わらないかどうかを確認してください
(b)インデックスとインデックスを確認してくださいクラスタリング要因:適切なインデックスが欠落している可能性があります
(c)クエリが並列句を使用しているため、最適なプランとして全表スキャンを選択している可能性があります
(d)Optimizer_mode、optimizer_index_cost_adj、optimizer_index_caching<のパラメーター設定が正しくありません/ P>
クエリでSQLチューニングアドバイザーを実行すると役立つ場合があります
関連記事
オラクルの説明計画:オラクルの説明計画のすべて、パフォーマンス関連の問題のオラクル説明計画の読み方、カーソルでクエリの説明計画を見つける方法
オラクルの論理読み取りとは:何ですかOracleでの論理読み取りとOracleでの物理I/O、パフォーマンスの点で論理的および物理的I / Oのどちらが優れているか、物理読み取りを見つけるためのクエリ
sql Tuning Advisor:カーソルでsql_idのsqlTuningAdvisorを実行する方法キャッシュ、SQLチューニングタスクはどのように作成および実行され、推奨事項を取得しますか
オラクルのテーブルでインデックスを検索:この記事をチェックして、オラクルのテーブルでインデックスを検索する方法に関するクエリを検索し、スキーマ内のすべてのインデックスを一覧表示します、インデックスステータス、インデックス列
オラクルのバインド変数:バインド変数はsqlplusおよびPLSQLの値のプレースホルダーであり、ステートメントの実行時に値に置き換えられます
オラクルのSQLプロファイルを確認する方法:確認オラクルでSQLプロファイルを確認する方法、SQLProfのコンテンツを見つける方法に関するこの投稿をご覧くださいile、SQLプロファイルを削除する方法