在生产应用程序(C#与SQL Server 2014 Standard对话)中,下面是一个查询,如下所示。大多数情况下,它以毫秒为单位运行。但是有时(对于的某些值@Id
)会变得很疯狂,并且需要一分钟左右的时间。这比应用程序超时时间长,因此该应用程序对用户而言将失败。
在“疯狂”的情况下,返回的结果集正确地为空,就像在许多但并非所有其他情况下一样。
幸运的是,这在生产和开发环境中都是可重现的。
开发人员说,从查询中删除“ TOP 1”,然后确保应用消耗了结果集的多余行,从而清除了性能问题。
查询计划程序建议不存在索引TOP 1
。(在dev中)。
正在进行更改查询和修复应用程序。推出需要一段时间。
我的问题:在采用新查询的应用程序更改推出之前,是否有任何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;
您是否尝试过将其作为子查询?例如,从中选择前1个subscription_id(选择[您的其余查询,但不包含top1]
—
SeanR '16
也许一些“正常”的查询调整会起作用?如果索引足够吸引人,扫描就会消失。这比计划指南的侵入性小。
—
usr
那么,
—
RBarryYoung '16
@ID
始终具有相同的值会使它“发疯”吗?如果是这样,则使用这些值之一进行测试并捕获实际的查询计划。这将告诉您出了什么问题。如果“坏”值不一致,则可能是由于参数嗅探(有关解决方案,请参见@MartinSmith的答案),也可能是涉及客户端实际如何请求和使用结果集的锁定问题。