2010-03-05 23 views
8

Aşağıdaki sorgu, LastModifiedTime sütunundaki bir dizinde dizin araması kullanır.Dizin Aracılığıyla Kümelenmiş Dizin Taraması - Neden tarama seçildi?

SELECT 
     CONVERT(varchar, a.ReadTime, 101) as ReadDate, 
     a.SubID, 
     a.PlantID, 
     a.Unit as UnitID, 
     a.SubAssembly 
FROM dbo.Accepts a WITH (NOLOCK) 
WHERE a.LastModifiedTime BETWEEN '3/3/2010' And '3/4/2010' 
AND a.SubAssembly = '400' 

Yukarıdaki sorgu ile hemen hemen aynıdır, aşağıdaki sorgu yerine, LastModifiedTime endeksin, kümelenmiş bir dizin tarama kullanır. Birisi bana nedenini söyleyebilir mi? Ve daha da önemlisi, bir dizin ipucu kullanarak olmadan LastModifiedTime sütunu, dizinini kullanmak için SQL Server almak için ne yapabilirim.

Declare @LastModifiedTimeEnd dateTime 
Declare @LastModifiedTimeStart dateTime 

    SELECT 
      CONVERT(varchar, a.ReadTime, 101) as ReadDate, 
      a.SubID, 
      a.PlantID, 
      a.Unit as UnitID, 
      a.SubAssembly 
    FROM dbo.Accepts a WITH (NOLOCK) 
    WHERE a.LastModifiedTime BETWEEN @LastModifiedTimeStart And @LastModifiedTimeEnd 
    AND a.SubAssembly = '400' 

cevap

6

Yukarıdaki sorgu ile hemen hemen aynıdır, aşağıdaki sorgu yerine, LastModifiedTime endeksin, kümelenmiş bir dizin tarama kullanır. Birisi bana nedenini söyleyebilir mi? Planınızı oluşturmayı ve genel yılında , kümelenmiş dizin tarama daha iyi olduğunu varsayar zaman

sorgu aşağıdaki parametrelerin değerlerini bilmiyor.

Ve daha da önemlisi, bir dizin ipucu kullanmadan, LastModifiedTime sütun üzerinde dizin kullanılacak SQL Server almak için yapabilecekleriniz.

SELECT 
     CONVERT(varchar, a.ReadTime, 101) as ReadDate, 
     a.SubID, 
     a.PlantID, 
     a.Unit as UnitID, 
     a.SubAssembly 
FROM dbo.Accepts a WITH (NOLOCK) 
WHERE a.LastModifiedTime BETWEEN @LastModifiedTimeStart And @LastModifiedTimeEnd 
AND a.SubAssembly = '400' 
OPTION (OPTIMIZE FOR (@LastModifiedTimeStart = '3/3/2010', @LastModifiedTimeEnd = '3/4/2010')) 

Alternatif olarak, hesap (parametre koklama) içine parametre değerlerini alarak, farklı bir yürütme planını sorgu her çalıştırıldığında yaratacak OPTION (RECOMPILE), ekleyebilir. Bununla birlikte, bu, endeksin kullanılacağını garanti etmemektedir.

+0

Sorgu planlayıcısının kümelenmiş dizinin neden daha iyi olduğunu varsayması konusunda kafam karıştı. Parametrelerin ne olduğuna bakılmaksızın, bunun için oluşturulmuş bir endekse sahip olan belirli bir sütuna karşı hala uyuşmaktadır. Yalnızca sabit parametrelerle kullanıldığında bu endeksin noktası nedir? –

+0

@Kent: Bir dizi değeri almak için ikincil bir dizin kullanmak, endeksi tabloya geri eklemeyi gerektirir. Aralık büyük olduğunda, birleştirme yükü sıralama ek yükünden daha ağır basar. – Quassnoi

+0

Anladım - teşekkürler. Tahmin edersem, parametre koklamasının varsayılan davranış olacağını varsaydım. Muhtemelen '> = @LastModifiedTimeStart VE <= LastModifiedTimeEnd' kullanılarak," OPTION (RECOMPILE) "belirtilmeksizin kümelenmemiş dizinin kullanılmasını da engeller. –

İlgili konular