2012-12-15 107 views
1

我只是有一個簡單的查詢。在SQL Server 2008中,有時它查詢時間太長,幾乎掛起,有時候不會。 Oracle服務器上的同一個sql,它總是立即返回。簡單的SQL查詢太長了

SELECT D.DESCITEM, D.LONGDESC, D.DESCTABL, D.DESCCOY, D.DESCPFX 
FROM VM1DTA.DESCPF D, VM1DTA.ITEMPF I 
WHERE D.DESCPFX='IT'AND D.DESCITEM=I.ITEMITEM AND I.VALIDFLAG='1' 
AND D.DESCTABL = I.ITEMTABL AND D.DESCCOY = I.ITEMCOY AND "LANGUAGE" = 'E' 
AND "VALIDFLAG" = '1' AND DESCTABL IN('T1680') 
ORDER BY LONGDESC ASC; 

每張表都有大約100k條記錄。

有人可以指出我的根源嗎?謝謝

+0

多少記錄它返回? –

+0

它可能是數據鎖定。 Oracle不會查看數據讀取器,但是如果存在未決更新,Sql Server將會生效。請參閱http://msdn.microsoft.com/en-us/library/ms173763.aspx – shf301

+0

@Jason:它返回3條記錄 – bnguyen82

回答

0

我不確定問題是什麼,但您的查詢可以使用一些重構。因爲它沒有前綴,所以該行看起來也不需要"VALIDFLAG" = '1'IN可能與它有關。

SELECT D.DESCITEM, D.LONGDESC, D.DESCTABL, D.DESCCOY, D.DESCPFX 
FROM 
VM1DTA.DESCPF D INNER JOIN VM1DTA.ITEMPF I ON 
D.DESCITEM=I.ITEMITEM 
AND 
D.DESCTABL = I.ITEMTABL 
AND 
D.DESCCOY = I.ITEMCOY 
WHERE 
D.DESCPFX='IT' 
AND 
"LANGUAGE" = 'E' 
AND 
I.VALIDFLAG='1' 
AND 
"VALIDFLAG" = '1' 
AND 
I.DESCTABL = 'T1680' 
ORDER BY 
LONGDESC ASC; 

另一件要看的事情是將索引放在所有連接列上。

希望這會有所幫助。

+0

你的發現是正確的,但這個SQL是由代碼生成的,所以它可能不會針對所有情況進行優化。謝謝。 – bnguyen82

+0

你的意思是說沒有辦法改變代碼,因爲它是自動提供的嗎? – glh

0

我發現通過自由文本字段連接兩個表佔用大量資源和時間。此外,這些字段傳統上不會以任何方式編入索引。

嘗試查看是否有值得使用的索引或其他聯接。

也不需要加入到I.ITEMTABL字段,因爲D.DESCTBL字段有一個過濾器,使得處理器更有效地加入這兩者,除非它是索引。

另一種方法是在使用子查詢的WHERE子句,如:

SELECT D.DESCITEM, D.LONGDESC, D.DESCTABL, D.DESCCOY, D.DESCPFX 
FROM VM1DTA.DESCPF D 
WHERE D.DESCPFX = 'IT' 
     AND D.LANGUAGE = 'E' 
     AND D.VALIDFLAG = '1' 
     AND D.DESCTABL = 'T1680' 
     AND EXISTS (SELECT NULL 
        FROM VM1DTA.ITEMPF I 
        WHERE I.VALIDFLAG = '1' 
          AND I.ITEMTBL = 'T1680' 
          AND D.DESCITEM = I.ITEMITEM 
          AND D.DESCCOY = I.ITEMCOY) 
ORDER BY LONGDESC ASC;