[英]Help Needed in SQL Query
以下是我的SQL查詢,該查詢針對30000000行,要花6分鍾才能運行,索引被定義為where子句中使用的所有列,如wll作為內部聯接請幫助我
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
預先感謝
子查詢
首先,擺脫子查詢並改為使用聯接,如下所示:
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子句的聯接
解
將一列添加到NoSeriesMaster並按計划將其更新,以將未更新的條目更新為1其中NosereisTemp類似於“ 91%”。 而是在查詢中使用此位值。
查看更改此內容:
Auditdata.Callto like nstmp.NosereisTemp + '%'
使用類似的概念。 在不知道您的數據的情況下很難說出確切的方法。
您的查詢非常密集,除了迭代大表之外,還執行聯接和嵌套查詢。
也許您可以使用嵌套sql的結果創建視圖。 無論如何,您都必須重新編寫查詢,而不必使用這種復雜性。
另一個解決方案可能是考慮使用一些OLAP方法將大表划分為片或聚合數據。
您正在使用哪個數據庫引擎?
您的WHERE
子句( like nstmp.NosereisTemp + '%'
)和JOIN ON
子句(例如'91%')都具有LIKE
表達式。 這總是比使用直接比較要慢,而且我認為這也可能影響您所擁有的索引是否可以得到有效利用。
是否可以修改表以包含可用於聯接/過濾的字段? 例如,您可以預先計算“ like '91%'
之like '91%'
的值並將其存儲在表中嗎?
在執行LIKE條件檢查時,充其量只能進行索引掃描(通常無法進行性能最佳的索引查找)。 您對此無能為力-僅檢查執行計划,留意需要檢查的表掃描(丟失索引)
可能將“ Auditdata.id IN”子句更改為EXISTS條件可能會執行得更好(我假設id是auditdata_temp1中的PK,因此不會有多個具有相同值的情況,在這種情況下EXISTS不會巨大的差異,如果有的話)。
擁有如此大量的數據,您可能要考慮對數據進行分區,這可以從SQL 2005開始進行,但是您需要Enterprise Edition,因此可能不是一個選擇。 有關信息,請參見此處 。
覆蓋索引-可能會使您獲得更好的性能。
確實,我們需要查看執行計划,該計划可能會將其他內容混入其中。
您應該在JOIN ON / WHERE條件附近稍微移動一下,連接條件應該是關聯兩個表的謂詞:
INNER JOIN NoSeriesMaster_temp nstmp
ON Auditdata.Callto like nstmp.NosereisTemp + '%
然后,您需要將以下謂詞移至查詢的WHERE部分:
WHERE nstmp.NosereisTemp like '91%'
這可能有助於SQL Server提出更明智的執行計划。
如果這樣做沒有幫助,那么您應該考慮預先計算nstmp.NosereisTemp like '91%'
的值, nstmp.NosereisTemp like '91%'
-SQL Server應該能夠很好地處理這種查詢,但是可能會對JOINS產生影響
除此之外,沒有執行計划就無法說清楚,但是我可以肯定地說這不是您的子查詢! :-)(隨時嘗試將其重寫為JOIN,但是如果刪除子查詢能解決您的問題,我將感到非常驚訝)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.