Ho visto questo avviso nei piani di esecuzione di SQL Server 2017:
Avvertenze: l'operazione ha causato IO residuo [sic]. Il numero effettivo di righe lette era (3.321.318), ma il numero di righe restituite era 40.
Ecco uno snippet di SQLSentry PlanExplorer:
Per migliorare il codice, ho aggiunto un indice non cluster, in modo che SQL Server possa accedere alle righe pertinenti. Funziona bene, ma normalmente ci sarebbero troppe (grandi) colonne da includere nell'indice. Sembra così:
Se aggiungo solo l'indice, senza includere le colonne, è simile al seguente, se forzo l'uso dell'indice:
Ovviamente, SQL Server ritiene che la ricerca delle chiavi sia molto più costosa dell'I / O residuo. Ho una configurazione di test senza molti dati di test (ancora), ma quando il codice entra in produzione, deve funzionare con molti più dati, quindi sono abbastanza sicuro che sia necessaria una sorta di indice non cluster.
Le ricerche chiave sono davvero così costose , quando si esegue su SSD, che devo creare indici full-fat (con molte colonne include)?
Piano di esecuzione: https://www.brentozar.com/pastetheplan/?id=SJtiRte2X Fa parte di una lunga procedura memorizzata. Cercare IX_BatchNo_DeviceNo_CreatedUTC
.
sys.dm_exec_query_profiles
, li rimborseremo dai costi effettivi rispetto alla stima). Smetti di usare il costo stimato% come un indicatore assoluto del costo: è relativo e spesso è fuori a pranzo.