Le moyen le plus efficace pour interroger SQL Server grande table presque complet set de résultats

J'ai une table dans SQL Server 2014 avec un grand nombre de lignes. Appelons-le TableA.

Je dois interroger son PK (un ID d'AUTOINCREMENT, CLUSTERED KEY) pour presque toutes les rangées (disons, 97% des rangées) et ce jeu de résultats est habituellement joint avec une autre table (TableB) par l'intermédiaire de la key étrangère (appelons-le FK_A).

La requête ressemble à:

SELECT TableB.someColumnNotFKNorPK FROM TableB INNER JOIN TableA ON TableB.FK_A = TableA.ID WHERE TableA.LowSparseColumn = 100 

Le problème est que TableA a 97% des lignes avec LowSparseColumn = 100 , donc cela cède aux spools de lignes, etc. parce que SQL Server doit stocker le résultat partiel

Savez-vous comment faire face à ce problème?

Toute aide est vraiment appréciée!

Merci!

Si vous avez un index sur TableB(fk_A) (ou mieux encore ( TableB(fk_A, someColumnNotFKNorPK) et que vos statistics de table sont à jour, alors l'optimiseur devrait faire son travail.) Il devrait lire TableA et faire une jointure à TableB sans spooling.

Vous pourriez réécrire la requête comme:

 SELECT TableB.someColumnNotFKNorPK FROM TableB WHERE EXISTS (SELECT 1 FROM TableA WHERE TableB.FK_A = TableA.ID AND TableA.LowSparseColumn = 100 ); 

Cela devrait faire une utilisation optimale d'un index sur TableA(ID, LowSparseColumn) (bien que cet index ne soit pas nécessaire si ID est une key primaire).