在生产应用程序(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'...'
提示。一旦您知道所需的提示,您就可以使用此处的信息应用它们。
对于咧嘴笑,试试看
`> 更改为 >= 所以不完全相同的查询