Sql p> 为了解决这个问题,您可以创建一个包含NOTNULL和nullable列的组合索引。基础LibraryId上有一个索引,这个字段(显然)有索引允许空值。因此,使用条件LibraryId>0会导致服务器使用索引而不是完整的表扫描?忘记提及:我没有耐心查看

Sql p> 为了解决这个问题,您可以创建一个包含NOTNULL和nullable列的组合索引。基础LibraryId上有一个索引,这个字段(显然)有索引允许空值。因此,使用条件LibraryId>0会导致服务器使用索引而不是完整的表扫描?忘记提及:我没有耐心查看,sql,sql-server,Sql,Sql Server,p> 为了解决这个问题,您可以创建一个包含NOTNULL和nullable列的组合索引。基础LibraryId上有一个索引,这个字段(显然)有索引允许空值。因此,使用条件LibraryId>0会导致服务器使用索引而不是完整的表扫描?忘记提及:我没有耐心查看解释计划,因为它太大了-此查询中的一些源本身就是视图。-1这不是真的为[非]空查询可以使用索引。请看这两个使用索引seek@mzedeler-答案将在执行计划中。例如,不同的基数估计可能会导致不同的计划。@MartinSmith-谢谢您的更新。


p> 为了解决这个问题,您可以创建一个包含NOTNULL和nullable列的组合索引。

基础
LibraryId
上有一个索引,这个字段(显然)有索引允许空值。因此,使用条件
LibraryId>0
会导致服务器使用索引而不是完整的表扫描?忘记提及:我没有耐心查看解释计划,因为它太大了-此查询中的一些源本身就是视图。-1这不是真的<代码>为[非]空查询可以使用索引。请看这两个使用索引seek@mzedeler-答案将在执行计划中。例如,不同的基数估计可能会导致不同的计划。@MartinSmith-谢谢您的更新。我将试图解读和比较这两起案件的执行计划。
WITH CommonRows (Dm2Id) AS (
    SELECT LibraryId
      FROM dbo.Items AS i1
      JOIN Test.Items AS i2
        ON i1.Dm2Id = i2.Dm2Id
     WHERE HasNew = 1
       AND HasOld = 1
       -- Note this: odd things happening here
       AND LibraryId IS NOT NULL
)
SELECT COALESCE(New.ImageLibraryId, Old.ImageLibraryId) AS ImageLibraryId,
        COALESCE(New.Field, Old.Field) AS Field,
        New.Value AS New,
        Old.Value AS Old
   FROM (SELECT ImageLibraryId,
                LEFT(CAST(TitleItemId AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS TitleItemId,
                LEFT(CAST(Title AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS Title,
                LEFT(CAST(Author AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS Author,
                LEFT(CAST(AuthorFirstname AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS AuthorFirstname,
                LEFT(CAST(AuthorLastname AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS AuthorLastname,
                LEFT(CAST(Teaser AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS Teaser,
                LEFT(CAST(TeaserListView AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS TeaserListView,
                LEFT(CAST(Language AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS Language,
                LEFT(CAST(PubYear AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS PubYear,
                LEFT(CAST(FictionNonFiction AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS FictionNonFiction,
                LEFT(CAST(TargetAudience AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS TargetAudience,
                LEFT(CAST(SeriesTitle AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS SeriesTitle,
                LEFT(CAST(SeriesSeqNo AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS SeriesSeqNo,
                LEFT(CAST(SeriesTotalCnt AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS SeriesTotalCnt
           FROM dbo.TitleItems
          WHERE ImageLibraryId IN (SELECT * FROM CommonRows)) p
UNPIVOT (Value FOR Field IN
            (TitleItemId, Title, Author, AuthorFirstname, AuthorLastname, Teaser,
             TeaserListView, Language, PubYear, FictionNonFiction, TargetAudience,
             SeriesTitle, SeriesSeqNo, SeriesTotalCnt)) AS New
   FULL OUTER JOIN
        (SELECT ImageLibraryId,
                LEFT(CAST(TitleItemId AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS TitleItemId,
                LEFT(CAST(Title AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS Title,
                LEFT(CAST(Author AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS Author,
                LEFT(CAST(AuthorFirstname AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS AuthorFirstname,
                LEFT(CAST(AuthorLastname AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS AuthorLastname,
                LEFT(CAST(Teaser AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS Teaser,
                LEFT(CAST(TeaserListView AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS TeaserListView,
                LEFT(CAST(Language AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS Language,
                LEFT(CAST(PubYear AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS PubYear,
                LEFT(CAST(FictionNonFiction AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS FictionNonFiction,
                LEFT(CAST(TargetAudience AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS TargetAudience,
                LEFT(CAST(SeriesTitle AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS SeriesTitle,
                LEFT(CAST(SeriesSeqNo AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS SeriesSeqNo,
                LEFT(CAST(SeriesTotalCnt AS NVARCHAR(MAX)), 20) COLLATE DATABASE_DEFAULT AS SeriesTotalCnt
           FROM CatalogSearch.dbo.TitleItems
          WHERE ImageLibraryId IN (SELECT * FROM CommonRows)) p
UNPIVOT (Value FOR Field IN
            (TitleItemId, Title, Author, AuthorFirstname, AuthorLastname, Teaser,
             TeaserListView, Language, PubYear, FictionNonFiction, TargetAudience,
             SeriesTitle, SeriesSeqNo, SeriesTotalCnt)) AS Old
     ON (New.ImageLibraryId = Old.ImageLibraryId AND New.Field = Old.Field COLLATE DATABASE_DEFAULT)
  WHERE (New.Value <> Old.Value COLLATE DATABASE_DEFAULT
         OR New.Value IS NULL AND Old.Value IS NOT NULL
         OR New.Value IS NOT NULL AND Old.Value IS NULL)
         -- fjernet rækker hvor New.Value indeholder mere information end Old.Value, men Old.Value indgår i starten af New.Value
         AND NOT (New.Field IN ('Teaser', 'TeaserListView') AND New.Value LIKE Old.Value + '%')
         -- fjernet række fordi den har fået et ekstra space med i Old.Value i midten af teksten
         AND NOT (New.Field IN ('Teaser', 'TeaserListView') AND New.ImageLibraryId = 800314)
         -- fjernet række fordi den tolkes som ukendt i New.Value (pga. fejldata i Bibkat) og som dansk i Old.Value
         AND NOT (New.Field = 'Language' AND New.ImageLibraryId = 800252)
        -- This is being tested separately in TitleItemGroups
        AND NOT New.Field = 'TitleItemId'