2009-07-28 56 views
1

下面是我的SQL查詢其對3000行運行,其需要6分鐘運行 指標defiened WHERE子句作爲WLL在使用內部連接的所有列 請幫我幫助在SQL所需查詢

SELECT auditData.id,nstmp.ProviderMaster_ID as CDRComment,Auditdata.Calltypetag 
from Auditdata AuditData 
inner join NoSeriesMaster_temp nstmp on nstmp.NosereisTemp like '91%' 
where Auditdata.id in (select id from auditdata_temp1 where tatcalltype is null) 
    and AuditData.CallTolen=12 and Auditdata.Callto like nstmp.NosereisTemp + '%' and  AuditData.AuditMaster_ID=74 

thanx提前

+0

您使用MS SQL Server嗎?你能發佈執行計劃嗎? – Justin 2009-07-28 09:08:38

回答

0

你的查詢非常密集,bsesides你迭代一個大表,你做一個聯接和嵌套查詢。

也許你可以用嵌套的sql的結果創建一個視圖。無論如何,你必須在不使用複雜性的情況下重寫查詢。

另一種解決方案可以考慮使用一些OLAP方法將大表分割成片或聚合數據。

您正在使用哪個數據庫引擎?

+0

這個評論應該在元,但我不在乎使用元或建議改善SO(糟糕的經驗downvoting)。評論原因 - 提問者把這個標記爲「sql」和「server」,而且我很確定「sql-server」的含義。反正有一個「服務器」標籤有什麼意義。標籤不應該完全由用戶指定。像「您使用哪個數據庫引擎」這樣的問題是完全可以避免的。 – Liao 2009-07-28 09:12:59

0

您在WHERE子句(like nstmp.NosereisTemp + '%')和JOIN ON子句(如'91%')中都有LIKE表達式。這總比使用直接比較要慢,我認爲這也可能會影響您的索引是否可以有效使用。

是否可以修改表格以包含可用於加入/過濾的字段?例如,您是否可以預先計算like '91%'並將該值存儲在表中?

0

當你正在進行LIKE條件檢查時,它最多隻能進行索引掃描(不能進行通常對性能最好的索引查找)。你可以做的事情不多 - 只是檢查執行計劃,留意需要查看的表掃描(缺少索引)

可能將「Auditdata.id IN」子句更改爲EXISTS條件可能會執行更好(我假設id是auditdata_temp1中的PK,所以不會有多個具有相同值的倍數,在這種情況下EXISTS不會產生巨大差異,如果有的話)。

對於那些數據量,您可能需要考慮對數據進行分區,您可以從SQL 2005開始對數據進行分區,但是您需要企業版,因此​​可能不是一種選擇。有關信息,請參閱here

覆蓋索引 - 可能你會得到更好的表現。

真的,我們需要看到執行計劃,這可能會把其他事情混合在一起。

1

子查詢

首先擺脫了子查詢和使用代替連接,像這樣:

SELECT 
auditData.id, nstmp.ProviderMaster_ID as CDRComment, Auditdata.Calltypetag 

FROM Auditdata AuditData 

INNER JOIN NoSeriesMaster_temp nstmp 
ON Auditdata.Callto like nstmp.NosereisTemp + '%' 
AND nstmp.NosereisTemp like '91%' 

INNER JOIN auditdata_temp1 adt 
ON Auditdata.id = adt.id 
AND adt.tatcalltype is null 

WHERE AuditData.CallTolen = 12 
AND AuditData.AuditMaster_ID = 74 

這將有助於一點。

使用like子句

  1. 加入此會搞亂,你執行計劃的優化器無法計算的運行時間的價值變化的最佳搜索路徑。
  2. 這是一個文本搜索,它將被評估每一行AuditData ...不好!

解決方案

加一點列NoSeriesMaster和更新如期未更新條目1凡NosereisTemp像'91%」。相反,在查詢中使用此位值。

看看改變這個:

Auditdata.Callto like nstmp.NosereisTemp + '%' 

使用類似的概念。不知道你的數據很難說清楚。

0

你應該圍繞涉及兩個表的JOIN ON/WHERE條件的少,參加的標準應該是謂語轉移:

INNER JOIN NoSeriesMaster_temp nstmp 
ON Auditdata.Callto like nstmp.NosereisTemp + '% 

然後,您需要將以下謂詞移入的WHERE部分您的查詢:

WHERE nstmp.NosereisTemp like '91%' 

這可能會幫助SQL服務器提出一個更明智的執行計劃。

如果這並不幫助,那麼你應該考慮預先計算nstmp.NosereisTemp like '91%'的價值 - SQL服務器應該能夠處理這種查詢完全沒有問題,但它可能產生影響有關連接的比

更多它不可能沒有執行計劃說,但我可以肯定地說,這不是你的子查詢! :-)(隨意嘗試將它改寫爲JOIN,但是如果刪除子查詢可以修復您的問題,我會感到非常驚訝)