0

このクエリからパフォーマンスを絞り出そうとしています。助けていただければ幸いです。私にできることは、主キーで順序付けられているため、2番目のステートメントで順序を削除することだけです。

--SET STATISTICS TIME ON

DECLARE             
        @MasterAdGroupId Int = 3469476,
        @IncludeDeleted Bit = 1,
        @Deleted Bit = 0,
        @IncludeDirty Bit= 0,
        @Dirty Bit =1,
        @IncludeDupes Bit=0,
        @OrderByText Bit= 1,
        @UseInDisplayNetworkOnly Bit=0

BEGIN

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
IF @OrderByText=1 
BEGIN
    SELECT MasterKeywordId, Text, URL, MasterAdGroupId, mk.KeywordTemplateId, Dirty, mk.Deleted, Negative, Duplicate  
      FROM admanMasterKeyword_tbl mk
INNER JOIN admanKeywordTemplate_tbl kt on kt.KeywordTemplateId = mk.KeywordTemplateId
     WHERE MasterAdGroupId = @MasterAdGroupId 
       AND mk.Deleted = CASE WHEN @IncludeDeleted=0 THEN @Deleted ELSE mk.Deleted END
       AND Dirty = CASE WHEN @IncludeDirty=0 THEN @Dirty ELSE Dirty END
       AND Duplicate = CASE WHEN @IncludeDupes=1 THEN Duplicate ELSE 0 END
       AND UseInDisplayNetwork = CASE WHEN @UseInDisplayNetworkOnly=1 THEN 1 ELSE UseInDisplayNetwork END
  ORDER BY Text 
END
ELSE
BEGIN
    SELECT MasterKeywordId, Text, URL, MasterAdGroupId, mk.KeywordTemplateId, Dirty, mk.Deleted, Negative, Duplicate  
      FROM admanMasterKeyword_tbl mk
INNER JOIN admanKeywordTemplate_tbl kt on kt.KeywordTemplateId = mk.KeywordTemplateId
     WHERE MasterAdGroupId = @MasterAdGroupId 
       AND mk.Deleted = CASE WHEN @IncludeDeleted=0 THEN @Deleted ELSE mk.Deleted END
       AND Dirty = CASE WHEN @IncludeDirty=0 THEN @Dirty ELSE Dirty END
       AND Duplicate = CASE WHEN @IncludeDupes=1 THEN Duplicate ELSE 0 END
       AND UseInDisplayNetwork = CASE WHEN @UseInDisplayNetworkOnly=1 THEN 1 ELSE UseInDisplayNetwork END
  ORDER BY MasterKeywordId 
END

END
4

1 に答える 1

1

これによってパフォーマンスが変わることはありませんが、2つのクエリで変更するのが順序付けだけである場合(違いはわかりませんでした)、CASEステートメントをORDERBYに配置できます。繰り返すか、IFステートメントを実行する必要があります。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

    SELECT MasterKeywordId, Text, URL, MasterAdGroupId, mk.KeywordTemplateId, Dirty, mk.Deleted, Negative, Duplicate  
      FROM admanMasterKeyword_tbl mk
INNER JOIN admanKeywordTemplate_tbl kt on kt.KeywordTemplateId = mk.KeywordTemplateId
     WHERE MasterAdGroupId = @MasterAdGroupId 
       AND mk.Deleted = CASE WHEN @IncludeDeleted=0 THEN @Deleted ELSE mk.Deleted END
       AND Dirty = CASE WHEN @IncludeDirty=0 THEN @Dirty ELSE Dirty END
       AND Duplicate = CASE WHEN @IncludeDupes=1 THEN Duplicate ELSE 0 END
       AND UseInDisplayNetwork = CASE WHEN @UseInDisplayNetworkOnly=1 THEN 1 ELSE UseInDisplayNetwork END
  ORDER BY (CASE WHEN @OrderByText = 1 THEN Text ELSE MasterKeywordId END) 

このクエリのクエリプランはどのようになりますか?インデックスを作成できる場所はどこですか?

于 2012-06-19T15:09:46.810 に答える