2011-11-29 9 views
7

説明に重大な問題があります。 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分かかりますか?それを判断する方法はありますか?

答えて

5

使用されている実際のプランを見つけるには、sql_idを使用してv $ sql_planを照会できます。一番簡単な方法は、例えば、それを一意にするために、クエリにコメントを入れて

select /* FROM C++ */ .... 

select /* FROM SQLPLUS */ .... 

その後、クエリを実行しています。

select sql_id, sql_fulltext 
from v$sql 
where upper(sql_fulltext) like '%FROM C++%'; 

その後SQL_IDは、あなたが次のクエリを使用して、計画、またはより良いを取得するには、V $ SQL_PLANを照会できることを使用して::

五$ SQLからの照会あなたが例えば、クエリのSQL_IDを見つけることができることにより、
select * from table(dbms_xplan.diplay_cursor('SQL ID OBTAINED ABOVE')); 
関連する問題