私のクエリをより効率的にする方法を手助けする必要があります。私は決してSQLの専門家ではありませんが、これに関する公正なビットを読んでいますが、私は尋ねる/議論する必要がある時点です。複数の内部結合が非常に遅い
私は、次のクエリを持っている:
SELECT * FROM
(
SELECT
a.seq_num seq_num_a,
a.record_length record_length_a,
b.record_length record_length_b,
c.record_length record_length_c
a.deleted deleted_a,
b.deleted deleted_b,
c.deleted deleted_c
FROM tableA a
INNER JOIN tableB b
ON a.reference = b.reference
AND a.run_id = b.run_id
INNER JOIN tableC c
ON a.reference = c.reference
AND a.run_id = c.run_id
WHERE a.run_id = 1
)
WHERE deleted_a = 'N'
AND deleted_b = 'N'
AND deleted_c = 'N'
ORDER BY seq_num_a;
私は=「N」を削除することを確認した後、クエリが非常に遅いです - でもちょうどにtableAのために。サブクエリがデータセットを返すと思ってSELECT内の全体のクエリをラップしました。それから、それに対して単純なチェックと順序があります。サブクエリ内のチェックとのパフォーマンスの違いはありません。
run_idに対してインデックスがあり、すべてのテーブルで削除され、tableAのseq_numに対して削除されます。各テーブルには約8000の行があります。
クエリプラン
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 112 | 7 |
| 1 | SORT ORDER BY | | 1 | 112 | 7 |
| 2 | NESTED LOOPS | | 1 | 112 | 3 |
| 3 | NESTED LOOPS | | 1 | 79 | 2 |
| 4 | TABLE ACCESS BY INDEX ROWID| TABLEC | 1 | 33 | 2 |
|* 5 | INDEX SKIP SCAN | TABLEC_IDX2 | 1 | | 2 |
|* 6 | TABLE ACCESS BY INDEX ROWID| TABLEA | 1 | 46 | |
|* 7 | INDEX RANGE SCAN | TABLEA_IDX5 | 1 | | |
|* 8 | TABLE ACCESS BY INDEX ROWID | TABLEB | 1 | 33 | 1 |
|* 9 | INDEX UNIQUE SCAN | TABLEB_PK | 1 | | |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
5 - access("C"."DELETED"='N')
filter("C"."DELETED"='N')
6 - filter("A"."REFERENCE"="C"."REFERENCE" AND
"A"."RUN_ID"="C"."RUN_ID")
7 - access("A"."DELETED"='N')
8 - filter("B"."DELETED"='N')
9 - access("A"."RUN_ID"="B"."RUN_ID" AND
"A"."REFERENCE"="B"."REFERENCE")
Note: cpu costing is off
説明しましたか? – r0ast3d
クエリプランとは何ですか?インデックスには 'REFERENCE'カラムも含まれていますか?あなたは "非常に遅い"を定量化できますか?私たちは時間を話していますか?分?秒?各テーブルの8000行のうち、どれだけ 'N'の 'DELETED'がありますか? 'tableA'の' RUN_ID'が1の行はいくつありますか? –
また、削除されたものにはnullが含まれていますか、またはすべてY/Nですか?説明計画を投稿してみてください。 – Wolf