Il problema è che stai specificando due condizioni con OR che si applicano a tabelle separate nella tua query. Per questo motivo, la ricerca dell'indice non cluster deve restituire la maggior parte o tutte le righe nella tabella grande perché la logica OR significa che potrebbero corrispondere anche alla clausola condizionale nella seconda tabella.
Osserva il piano di esecuzione SQL in tutti e tre gli esempi precedenti e nota il numero di righe che escono dall'indice non cluster ricercato dalla tabella grande. Il risultato finale può restituire solo 1.000 o meno delle 800.000 righe nella tabella, ma la clausola OR significa che il contenuto di quella tabella deve essere incrociato con il condizionale nella seconda tabella poiché OR significa che potrebbero essere necessari per il finale output della query.
A seconda del piano di esecuzione, la ricerca dell'indice può estrarre tutte le 800.000 righe nella tabella grande perché possono anche corrispondere alle condizioni della clausola OR nella seconda tabella. UNION ALL è costituito da due query separate su una tabella ciascuna, quindi la ricerca dell'indice deve solo restituire il set di risultati più piccolo che potrebbe corrispondere alla condizione per quella query.
Spero che questo abbia senso. Mi sono imbattuto nella stessa situazione durante il refactoring di istruzioni SQL a esecuzione lenta.
Ciao,
Andre Ranieri