In einer Produktionsanwendung (C # im Gespräch mit SQL Server 2014 Standard) wird im Folgenden eine Abfrage angezeigt, die folgendermaßen aussieht. Die meiste Zeit läuft es in Millisekunden. Aber gelegentlich (für bestimmte Werte von @Id
) geht es verrückt und dauert eine Minute oder so. Dies ist länger als das App-Timeout, sodass die App für den Benutzer fehlschlägt.
In den "Goes Nuts" -Fällen ist die zurückgegebene Ergebnismenge korrekt leer, wie in vielen, aber nicht allen anderen Fällen.
Zum Glück ist dies sowohl in der Produktions- als auch in der Entwicklungsumgebung reproduzierbar.
Der Entwickler sagt, "TOP 1" aus der Abfrage zu entfernen und dann sicherzustellen, dass die App die zusätzlichen Zeilen der Ergebnismenge verbraucht, behebt das Leistungsproblem.
Der Abfrageplaner schlägt keine Indizes vor, wenn TOP 1
vorhanden. (in dev).
Die Abfrage wird geändert und die App repariert. Der Rollout dauert eine Weile.
Meine Frage: Gibt es eine DBA-zugängliche Möglichkeit, die SQL Server-Produktionsinstanz zu optimieren oder zu optimieren, um dieses Problem zu beheben, bevor die App mit der neuen Abfrage geändert wird?
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;
@ID
immer "verrückt"? Wenn ja, testen Sie einen dieser Werte und erfassen Sie den tatsächlichen Abfrageplan. Das wird dir sagen, was falsch läuft. Wenn die "schlechten" Werte nicht konsistent sind, ist dies wahrscheinlich entweder ein Parameter-Sniffing (siehe @ MartinSmiths Antwort zur Lösung) oder ein Sperrproblem, bei dem es darum geht, wie der Client die Ergebnismenge tatsächlich anfordert und verarbeitet.