0

データベース oracle 11g を使用しています。私のアプリケーションは、特定のシナリオで次のようにクエリを実行します

Select distinct demo.table1.id, demo.table2.status 
FROM demo.table1, demo.table2
WHERE demo.table1.id=demo.table2.id
AND ((demo.table2.userID = '1') or (demo.table2.userID='2'))

レコード数が約 20 ~ 25K の場合、正しい出力が得られます。ただし、クエリは何も返さず、レコード数が 50K を超えるとアプリケーションがハングします。

ただし、「AND」条件を削除すると; クエリにより、必要な出力 (つまり、50K レコード) が得られます

MSSQL サーバー 2005 に対して同じシナリオを実行しました。上記のシナリオはすべてうまくいきました。100K レコードでもアプリケーションがハングしませんでした。

ここで何が問題なのかわかりません。それは私のクエリですか、それともオラクルで構成を変更する必要がありますか?

私はOracleデータベースを初めて使用するので、ここで私を助けてください。

4

2 に答える 2

1

さらに...あなたはdistinctを取り除くことを検討するかもしれません。パフォーマンスが大幅に低下します。これがクエリがハングする理由だと思います。次に、OR を UNION/UNION ALL に置き換えます - 依存します... 個別の回避方法の一般的な例を次に示します。

-- DISTINCT --
SELECT DISTINCT d.deptno, dname FROM scott.dept D, scott.emp E 
 WHERE D.deptno = E.deptno
/  

-- Same as Distinct but may be faster --
SELECT deptno, dname FROM scott.dept D 
 WHERE EXISTS ( SELECT 'X' FROM scott.emp E WHERE E.deptno = D.deptno)
/
于 2013-02-06T14:49:54.090 に答える
1

まず、結合するすべてのフィールドと、where 基準で使用するすべてのフィールドにインデックスがあることを確認します。少なくとも、Table1.id、Table2.Id、および Table2.userID のように見えます。

INNER JOIN次に、 andIN句を使用してクエリを次のように変更することをお勧めします。

Select DISTINCT t.id, t2.status 
FROM demo.table1 t
   INNER JOIN demo.table2 t2 on t.id=t2.id
WHERE demo.table2.userID IN (1,2)

- 編集

userId フィールドが文字列である理由がわかりません。これはおそらく、ID/自動インクリメントとしてリファクタリングする必要があります。ただし、上記の WHERE 句を IN ('1','2') に調整して機能させる必要があります。

幸運を。

于 2013-02-06T13:52:10.150 に答える