2011-08-11 7 views
1

これはわかりません。私は、クエリを持っていると私のハードコードクエリでEntityTypeの番号ならば、これはIO統計変数を使用するとスキャンと論理読み取りが増加する

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'FranchiseAgreement'. Scan count 1, logical reads 157, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'Address'. Scan count 1, logical reads 5485, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'County'. Scan count 1, logical reads 126, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'State'. Scan count 0, logical reads 505, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'Country'. Scan count 0, logical reads 488, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'City'. Scan count 0, logical reads 630, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'ARTaxMasterfile'. Scan count 4, logical reads 36, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'ELMasterfile'. Scan count 1, logical reads 205, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

あまりにも悪い何もないです。今、私はするつもりですすべては、読みやすくするために、変数にハードコード化された番号を交換です

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'ELMasterfile'. Scan count 1, logical reads 205, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
***Table 'FranchiseAgreement'. Scan count 539932, logical reads 1750032, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'Address'. Scan count 1, logical reads 5485, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'County'. Scan count 0, logical reads 481, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'State'. Scan count 0, logical reads 505, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'Country'. Scan count 0, logical reads 488, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'City'. Scan count 0, logical reads 630, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'ARTaxMasterfile'. Scan count 4, logical reads 36, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

DECLARE @BalanceIdEL SMALLINT 
SET @BalanceIdEL = 14 

PRINT 'Version 5' 
SELECT Stores.*, Tax.ARTaxMasterFileId 
FROM 
( -- Get The Addres of Each Lease 
    SELECT 
     E.LeaseNum 
    , E.LeaseDate 
    , A.CountryCode 
    , A.StateProvCode 
    , A.County 
    , A.City 
    FROM 
     ELMasterFile E 
    INNER JOIN 
     FranchiseAgreement F 
     ON E.EntityId = F.FranchiseID 
     AND E.EntityType = 7 
    INNER JOIN 
     Address A 
     ON F.FranchiseNum = A.EntityId 
     AND F.SatelliteNum = A.SatelliteNum 
     AND A.EntityType = 5 -- Store 
     AND A.AddressType = 3 -- Store Address 
    ) Stores 
INNER JOIN 
    -- Get the Taxes at each Level, Country, State, County and City 
    (SELECT A.*, C.CountryCode, '' AS StateProvCode, '' AS CountyName, '' AS CityName 
    FROM ARTaxMasterFile A 
    INNER JOIN 
     COMMON.dbo.Country C 
     ON A.ARTaxLevelTypeId = C.CountryId 
    where BalanceId = @BalanceIdEL 
    and ARTaxLevelType = 1 
    UNION ALL 
    SELECT A.*, S.CountryCode, S.StateProvCode AS StateProvCode, '' AS CountyName, '' AS CityName 
    FROM ARTaxMasterFile A 
    INNER JOIN 
     COMMON.dbo.State S 
     ON A.ARTaxLevelTypeId = S.StateId 
    where BalanceId = @BalanceIdEL 
    and ARTaxLevelType = 2 
    UNION ALL 
    SELECT A.*, C.CountryCode, C.StateProvCode AS StateProvCode, C.CountyName AS CountyName, '' AS CityName 
    FROM ARTaxMasterFile A 
    INNER JOIN 
     COMMON.dbo.County C 
     ON A.ARTaxLevelTypeId = C.CountyId 
    where BalanceId = @BalanceIdEL 
    and ARTaxLevelType = 3 
    UNION ALL 
    SELECT A.*, Country.CountryCode, State.StateProvCode AS StateProvCode, County.CountyName AS CountyName, City.CityName AS CityName 
    FROM ARTaxMasterFile A 
    INNER JOIN 
     COMMON.dbo.City City 
     ON A.ARTaxLevelTypeId = City.CityId 
    INNER JOIN 
     COMMON.dbo.County County 
     ON City.CountyId = County.CountyId 
    INNER JOIN 
     COMMON.dbo.State State 
     ON City.StateId = State.StateId 
    LEFT OUTER JOIN 
     COMMON.dbo.Country Country 
     ON City.CountryId = Country.CountryId  
    where BalanceId = @BalanceIdEL 
    and ARTaxLevelType = 4) Tax 
    ON (Stores.CountryCode = Tax.CountryCode 
     AND Tax.StateProvCode = '' 
     AND Tax.CountyName = '' 
     AND Tax.CityName = '') 
    OR 
     (Stores.CountryCode = Tax.CountryCode 
     AND Stores.StateProvCode = Tax.StateProvCode 
     AND Tax.CountyName = '' 
     AND Tax.CityName = '') 
    OR 
     (Stores.CountryCode = Tax.CountryCode 
     AND Stores.StateProvCode = Tax.StateProvCode 
     AND Stores.County = Tax.CountyName 
     AND Tax.CityName = '') 
    OR 
     (Stores.CountryCode = Tax.CountryCode 
     AND Stores.StateProvCode = Tax.StateProvCode 
     AND Stores.County = Tax.CountyName 
     AND Stores.City =Tax.CityName) 
WHERE Tax.StartDate <= GETDATE() 
AND Tax.StartDate > Stores.LeaseDate 

おかしな事は、パラメータは、私は変数BalanceIdELを取る場合は、そのテーブル に使用し、それに代わるものではありませされています14の場合、クエリは2倍高速です。

答えて

3

私は、クエリオプティマイザは、変数が実際には定数であることを認識しないので、値が不明であると考えているため、インデックス検索ではなくテーブルスキャンでクエリプランを選択します。クエリプランは何を表していますか?索引のヒントが正しいことを強制するかもしれない。

が、私は主にこのような理由のための定数として変数を使用して停止している - 私は今、コメント

+0

+1で定数を使用し、私もこれを見ている、と彼らは変化するため、彼らが必要な場合を除き、このような@variablesを使用しないでください。これは、パラメータスニッフィングのようなものですが、変数はパラメータではありません。 –

関連する問題