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).