sql >> データベース >  >> RDS >> Oracle

Oracleで全表スキャンを検索するためのクエリ

    多くの場合、データベースのパフォーマンスは低下します。最初に、大きなテーブルの全表スキャンが行われているかどうかを確認する必要があります。

    最初に全表スキャンとは何かを確認してから、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プロファイルを削除する方法


    1. モデリングおよび正規化するときにnull値をどうするか?

    2. SQL Server(T-SQL)のdatetimeoffset値のタイムゾーンオフセットを変更する

    3. SQLServerデータベースですべての外部キー制約を無効にする方法-SQLServer/TSQLチュートリアルパート77

    4. Postgres:タイムスタンプを最も近い分に切り上げるまたは切り下げるにはどうすればよいですか?