2012-08-06 12 views
17

Come posso ridurre l'indice del costo di scansione cluster di domanda sotto menzionatoCome ridurre cluster indice del costo di scansione utilizzando query SQL

DECLARE @PARAMVAL varchar(3) 

set @PARAMVAL = 'CTD' 
select * from MASTER_RECORD_TYPE where [email protected] 

se corro query precedente si stava mostrando indice di scansione del 99%

trova qui di seguito i miei particolarità tavolo:

enter image description here

qui sotto ho incollato il mio indice per la tabella:

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 

gentilmente consigliare come è possibile ridurre il costo di scansione indice?

risposta

23

Prima di tutto, se si cerca RECORD_TYPE_CODE è necessario assicurarsi di avere un indice su quella colonna.

Oltre a ciò principalmente due cose:

  • non lo fanno uso SELECT * - che avrà sempre per tornare al indice cluster per ottenere l'intera pagina di dati; utilizzare un SELECT che specifica esplicitamente le colonne da utilizzare

  • se mai possibile, cercare di trovare un modo per avere un copre cluster indice, ad esempio un indice che contiene tutte le colonne necessarie per soddisfare la domanda

Se si dispone di un indice non cluster quali copre, quindi Query Optimizer è molto probabile che l'uso che copre indice (anziché l'indice cluster reale che è la piena dati tabella) per recuperare i risultati

+0

grazie per la pronta risposta, potete per favore mi guida per creare un indice di copertura non cluster, i tasti da essere inclusi in tale indice mi potete aiutare il compagno in questa – user1494292

+1

CREATE NONCLUSTERED INDEX [MST_IDX_FOR_REC_TYPE ] ON [dbo].[MASTER_RECORD_TYPE] ( \t [Record_Type_Code] ASC ) CON (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY ] GO Now index scan è stato trasformato in indice di ricerca del 100% – user1494292

+1

@ user1494292: OK - così ora hai il ** index seek ** - che è il modo più efficiente (e più veloce) per recuperare (poche righe di) dati –

0

È necessario provare e utilizzare un indice coperto. Ma il problema che avrai è che stai usando SELECT *. Hai davvero bisogno dell'intero disco?

In entrambi i casi, aggiungere RECORD_TYPE_CODE a un altro indice e questo sarà di aiuto con la query perché almeno quel campo può essere letto da una pagina di indice.

+0

hi mate, grazie per la tua pronta risposta, anche se io uso selezionare 1 da Master_record_type quindi anche lo stesso costo di scansione indice che stava lanciando – user1494292

0

Nella vostra query, è stata utilizzata la colonna RECORD_TYPE_CODE che non fa parte di clustered index e inoltre non è inclusa in nessuno non-clustered index. Quindi SQL Optimizer deciderà di eseguire la scansione dell'indice cluster per confrontare il predicato della clausola where.

Why is there a scan on my clustered index?

+0

Ehm, sì, fa parte dell'indice cluster = la tabella. Non c'è altro indice. – Suncat2000

Problemi correlati