Comment puis-je réduire le coût d'analyse d'index clusterisé de la requête mentionnée ci-dessous?
DECLARE @PARAMVAL varchar(3)
set @PARAMVAL = 'CTD'
select * from MASTER_RECORD_TYPE where RECORD_TYPE_CODE=@PARAMVAL
si j'exécute la requête ci-dessus, il affiche un scan d'index à 99%
Veuillez trouver ci-dessous les particularités de ma table:
ci-dessous j'ai collé mon index pour la table:
CREATE TABLE [dbo].[MASTER_RECORD_TYPE] ADD CONSTRAINT [PK_MASTER_REPORD_TYPE] PRIMARY KEY CLUSTERED
(
[Record_Type_Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
GO
veuillez conseiller comment puis-je réduire les coûts de balayage d'index?
Tout d’abord, si vous recherchez RECORD_TYPE_CODE
, vous devez vous assurer d’avoir un index sur cette colonne.
Outre cela principalement deux choses:
ne pas utiliser SELECT *
- il faudra toujours revenir à l'index clusterisé pour obtenir la page de données complète; utilisez une SELECT
qui spécifie explicitement les colonnes à utiliser
si possible, essayez de trouver un moyen d’avoir un index couvrant non cluster, par ex. un index contenant toutes les colonnes nécessaires pour satisfaire la requête
Si vous avez un tel index non cluster couvrant, l'optimiseur de requête utilisera très probablement cet index couvrant (au lieu de l'index clusterisé réel qui correspond aux données de la table complète) pour extraire les résultats.
Vous devez essayer d'utiliser un index couvert. Mais le problème que vous allez avoir, c'est que vous utilisez SELECT *
. Avez-vous vraiment besoin de tout le disque?
Quoi qu'il en soit, ajoutez RECORD_TYPE_CODE
à un autre index et cela facilitera la recherche car au moins ce champ peut être lu à partir d'une page d'index.
Dans votre requête, vous avez utilisé la colonne RECORD_TYPE_CODE
qui ne fait pas partie de clustered index
et qui ne figure pas non plus dans aucun non-clustered index
. SQL Optimizer décidera donc d’analyser l’index clusterisé pour comparer le prédicat de la clause where.