Sql-Server

SELECT TOP 1 會損害查詢性能;有沒有一種 dba 可訪問的方法來克服這個問題?

  • July 7, 2016

在生產應用程序(C# 與 SQL Server 2014 Standard 對話)中,有一個如下所示的查詢。大多數時候它以毫秒為單位執行。但偶爾(對於某些值@Id),它會發瘋並且需要一分鐘左右。這比應用程序超時時間長,因此使用者的應用程序失敗。

在“發瘋”的情況下,返回的結果集正確地是空的,因為它在許多但不是所有其他情況下都是空的。

幸運的是,這在生產和開發環境中都是可重現的。

開發人員說從查詢中刪除“TOP 1”,然後確保應用程序使用結果集中的額外行,從而解決了性能問題。

查詢規劃TOP 1器在存在時建議不使用索引。(在開發中)。

更改查詢和修復應用程序正在進行中。推出需要一段時間。

**我的問題:**是否有任何 DBA 可訪問的方法來調整或調整生產 SQL Server 實例以在應用程序更改與新查詢推出之前克服這個問題?

SELECT TOP 1
      subscription_id 
 FROM subscription AS sub
 JOIN billing_info AS bi ON bi.billing_info_id = sub.billing_info_id   
 JOIN person_group AS apg ON apg.person_id = bi.person_id
 JOIN pplan ON pplan.plan_id = sub.plan_id
 JOIN product ON product.product_id = [plan].product_id 
 JOIN product_attribute ON product_attribute.product_id = product.product_id 
WHERE apg.group_id = @Id
  AND apg.start_date < GETDATE()
  AND (apg.end_date IS NULL OR apg.end_date > GETDATE()) 
  AND (sub.end_date IS NULL OR sub.end_date > GETDATE()) 
  AND product_attribute.attribute_type = 'special feature' 
  AND product_attribute.attribute_data = '1' 
ORDER BY sub.start_date ASC;

如果您無法更改查詢,您可以使用計劃指南。

測試查詢的性能OPTION (QUERYTRACEON 4138)(需要有sysadmin權限的人來嘗試)。

如果這產生令人滿意的性能,您可以使用計劃指南來應用它。如果它不能產生令人滿意的性能,請嘗試找到一個提示。OPTION (HASH JOIN, MERGE JOIN)如果不適當的嵌套循環可能是問題所在。您可能需要求助於USE PLAN N'...'提示。

一旦您知道所需的提示,您就可以使用此處的資訊應用它們。

引用自:https://dba.stackexchange.com/questions/143218