Risposta breve: perché l'ottimizzatore pensa che sarebbe più veloce.
Tuttavia, proviamo a leggere la mente dell'ottimizzatore.
Dato che non è stato fornito lo schema completo della tabella, assumerò che ci sia un indice cluster su xxx.ID
e che #TaxInvoiceData
sia un heap. Ti aspetti un piano in cui viene rilevato l'indice PK per ogni riga in #TaxInvoiceData
, ma stai selezionando xxx.Field4
che richiederà la ricerca di un segnalibro per ogni corrispondenza. Ciò potrebbe comportare 29.000 richieste di I/O casuali. Ahia.
Al contrario, SQL Server potrebbe (e apparentemente sta per) eseguire solo una quantità maggiore di I/O sequenziali più efficienti eseguendo la scansione della tabella e probabilmente sta facendo una rapida corrispondenza hash con #TaxInvoiceData
.
Quindi cosa si può fare? È possibile creare un indice di copertura compreso Field4
. Oppure potresti utilizzare l'indice e unire suggerimenti per forzare il piano che stai cercando (ma sospetto che le prestazioni non sarebbero buone come speri). Questa query viene utilizzata abbastanza frequentemente da fornire problemi di prestazioni delle applicazioni o semplicemente eliminando le scansioni di tabelle in linea di principio? Se quest'ultimo, si può trovare il sovraccarico di sbarazzarsi della scansione non vale la pena alla fine.
Edit:
Dal momento che hai detto che non c'è alcun indice cluster sul tavolo, anche questo può interessare quanto efficiente le ricerche dall'indice lo sono. A meno che questa tabella non visualizzi attività di inserimento estremamente pesanti, è consigliabile modificare il PK in cluster. Questo da solo potrebbe cambiare il piano, e anche se non lo facesse, è probabile che acceleri altre operazioni a causa di un sovraccarico ridotto.
Quante righe sono in #TaxInvoiceData? – Joe
* Ricerca indice * - ok, ma su ** quale indice ** ??? Inoltre: tu dici '(ID, Field2, Field3)' sono la chiave primaria sul tuo 'Table X' - è che ** l'indice cluster ** sul tavolo, anche ?? O questo è un mucchio? –
Come si unisce S alla query? Potrebbe essere che poiché la chiave primaria non è in cluster, è più veloce eseguire la scansione della tabella piuttosto che saltare tra l'indice e la tabella per ogni riga. – idstam