説明に重大な問題があります。 SQL-plusまたはTOADでは、1/2秒で実行されますが、C++プログラムから分散トランザクションを実行すると、41分かかります。今週まで、これはC++コードから1秒で10,000回実行されています。C++プログラムからSQL Plusよりも実行すると、クエリーが4800倍長くなります
DB、コード、またはコードを実行しているW2kサーバーで何も変更されていません。
まったく同じ文がSQLプラスDBファイルのシーケンシャル読み込みから実行されたとき、それは非常に高いDBファイルのシーケンシャルは1,000,000上で読み取ったコードから実行されている8
だから、同じ文が100,000をやっているですコードとDTを介して実行される場合はsqlplusよりも多くの作業が必要です。
は、我々はブロックがイベント= 'DBファイルのシーケンシャル読み込み' のV $ SESSION_WAIT FROM SELECT P1 "ファイル#"、P2 "ブロック#"、P3 "クラス#" を 読まれているものを見つけるために、次の問合せをしましたこれらはクエリで使用されるテーブルです。これは、計画を説明し、まだ何度もテーブルを読んでいる
を読まれるべきであるのみ8ブロックを示し、両方のテーブルには、〜サイズは10ギグここ
はなステートメントで、計画
SELECT COUNT (*)
FROM student st, testinstance ti
WHERE st.dataset_id = :b2
AND st.student_id = ti.student_id
AND ti.testinstance_id > :b1
AND NOT EXISTS (
SELECT 1
FROM programscoringexclusion ex
WHERE ex.program_id = wfgeneral.getprogramid (:b3)
AND ex.testfamily_id = ti.testfamily_id
AND NVL (ex.test_level, NVL (ti.test_level, '*')) =
NVL (ti.test_level, '*')
AND NVL (ex.battery, NVL (ti.battery, '*')) =
NVL (ti.battery, '*')
AND NVL (ex.form, NVL (ti.form, '*')) = NVL (ti.form, '*'))
Plan
SELECT STATEMENT CHOOSECost: 2
9 SORT AGGREGATE Bytes: 43 Cardinality: 1
8 FILTER
5 NESTED LOOPS Cost: 2 Bytes: 43 Cardinality: 1
2 TABLE ACCESS BY INDEX ROWID TABLE BBOX.TESTINSTANCE Cost: 1 Bytes: 32 Cardinality: 1
1 INDEX RANGE SCAN INDEX (UNIQUE) BBOX.XXPK0TESTINSTANCE Cost: 1 Cardinality: 1
4 TABLE ACCESS BY INDEX ROWID TABLE BBOX.STUDENT Cost: 1 Bytes: 11 Cardinality: 1
3 INDEX UNIQUE SCAN INDEX (UNIQUE) BBOX.XXPK0STUDENT Cost: 1 Cardinality: 1
7 TABLE ACCESS BY INDEX ROWID TABLE BBOX.PROGRAMSCORINGEXCLUSION Cost: 1 Bytes: 37 Cardinality: 1
6 INDEX RANGE SCAN INDEX BBOX.XXIE1PROGRAMSCORINGEXCLUSION Cost: 1 Cardinality: 1
を説明しています実際に実行されているときに、実際の計画が声明のためにどうなっているか、どのように確認できますか?私たちはそれがテーブルを読んでいると言うことができます。実際の計画は、私たちが見ているものとは異なる可能性がありますか、実際に何らかのデカルト結合をしているか、解決するのに40分かかりますか?それを判断する方法はありますか?