2013-02-06 45 views
0

我正在使用數據庫oracle 11g。 我的應用程序運行像在某些特定的情況下如果記錄超過100k,Oracle中的查詢不執行

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中進行一些配置更改?

請幫我這裏,因爲我是oracle數據庫的新手。

+0

如果刪除AND條件,您將獲得更多記錄。 AND條件總是減少記錄數量。你確定? – knagaev

+0

如果用戶標識符是「數字」列,則還應使用數字進行比較。 ''1'是一個字符串,'1'是一個數字。永遠不要把蘋果(字符串)與橘子(數字)比較 –

+0

@knagaev:看到這個我太驚訝了。我做了很多次,並給出了相同的結果。 – user1597376

回答

1

另外...你可能會考慮擺脫清晰。它大大降低了性能。我相信這就是爲什麼你的查詢掛起。然後,我會用UNION/UNION ALL替換OR - 取決於...下面是關於如何避免截然不同的一般示例:

-- 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) 
/
1

首先,請確保您有任何要加入的字段以及您在where標準中使用的字段的索引。看起來至少是Table1.id,Table2.Id和Table2.userID。

那麼我建議你改變你的查詢以下使用INNER JOININ子句:

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) 

--edit

我不明白爲什麼你的用戶id字段是一個字符串 - 這應該可能被重構爲身份/自動增量。但是,您需要將上面的WHERE子句調整爲IN('1','2')才能工作。

祝你好運。

相關問題