web-dev-qa-db-fra.com

Comment réduire les coûts d'analyse d'index en cluster en utilisant une requête SQL

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:

enter image description here

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?

20
user1494292

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.

28
marc_s

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.

0
Mike Perrenoud

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.

Pourquoi y a-t-il une analyse sur mon index clusterisé?

0
sundar