In un'applicazione di produzione (C # parlando con SQL Server 2014 Standard) c'è una query che assomiglia a questa, di seguito. Il più delle volte funziona in millisecondi. Ma di tanto in tanto (per alcuni valori di @Id
), impazzisce e richiede circa un minuto. Questo è più lungo del timeout dell'app, quindi l'app non riesce per l'utente.
Nei casi "impazzisce", il set di risultati restituito è correttamente vuoto, come in molti ma non in tutti gli altri casi.
Fortunatamente questo è riproducibile sia negli ambienti di produzione che di sviluppo.
Lo sviluppatore dice che rimuovere "TOP 1" dalla query, quindi assicurarsi che l'app consumi le righe extra del set di risultati, risolve il problema delle prestazioni.
Il pianificatore di query non suggerisce indici quando TOP 1
è presente. (in sviluppo).
È in corso la modifica della query e la correzione dell'app. L'implementazione richiede un po 'di tempo.
La mia domanda: esiste un modo accessibile da DBA per ottimizzare o modificare l'istanza di produzione di SQL Server per superare questo problema prima che la modifica dell'app con la nuova query venga implementata?
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
sempre fanno "impazzire"? In tal caso, prova utilizzando uno di questi valori e acquisisci il piano di query effettivo. Questo ti dirà cosa non va. Se i valori "cattivi" non sono coerenti, allora sembra probabile che si tratti di uno sniffing dei parametri (vedere la risposta di @ MartinSmith per la soluzione), oppure di un problema di blocco che coinvolge il modo in cui il client richiede e consuma il set di risultati.