簡體   English   中英

SQL查詢中需要的幫助

[英]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子句的聯接

  1. 由於值更改運行時,優化器無法計算最佳搜索路徑,因此這將使您的執行計划混亂。
  2. 這是一個文本搜索,將對AuditData的每一行進行評估...不好!

將一列添加到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM