Sql-Server
SELECT TOP 1 會損害查詢性能;有沒有一種 dba 可訪問的方法來克服這個問題?
在生產應用程序(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'...'
提示。一旦您知道所需的提示,您就可以使用此處的資訊應用它們。