【问题标题】:How do I convert this query into one using joins/unions in SQL Server 2016?如何使用 SQL Server 2016 中的联接/联合将此查询转换为一个?
【发布时间】:2019-10-09 18:36:21
【问题描述】:

我的加入和联合技能充其量只是初级。有人能帮我把下面的查询改成更有效的吗?

CREATE TABLE [dbo].[Doc2ChaptAssignment]
(
    [DocID_FK] [numeric](18, 0) NOT NULL,
    [mChapterID_FK] [numeric](18, 0) NOT NULL
)

CREATE TABLE [dbo].[Chapters]
(
    [mChapterID] [numeric](18, 0) NOT NULL,
    [Chapter Name] [varchar](128) NOT NULL
)

这是查询

DECLARE @SearchTerm varchar(128) = 'Chapter One'

SELECT
    [mChapterID], [ChapterName]
FROM 
    [dbo].[ModuleChapters]
WHERE 
    [mChapterID] NOT IN (SELECT [mChapterID_FK]
                         FROM [dbo].[Doc2ChaptAssignment]
                         WHERE [DocID_FK] = @SearchTerm)
    AND [ChapterName] LIKE '%'+@1+'%'
ORDER BY 
    [ChapterName]

【问题讨论】:

    标签: sql sql-server join union


    【解决方案1】:

    他们写的方式是一种方式。经常看到使用NOT EXISTS

    SELECT
       [mChapterID]
      ,[ChapterName]
    FROM [dbo].[ModuleChapters]
    WHERE [mChapterID] NOT EXISTS (SELECT 1
                               FROM [dbo].[Doc2ChaptAssignment]
                               WHERE [DocID_FK] = @SearchTerm
                               AND [mChapterID_FK] = [mChapterID])
    AND [ChapterName] LIKE '%'+@1+'%'
    ORDER BY [ChapterName]
    

    不太常见的是JOIN

    SELECT
       [mChapterID]
      ,[ChapterName]
    FROM [dbo].[ModuleChapters]
    LEFT JOIN [dbo].[Doc2ChaptAssignment] on [mChapterID_FK] = [mChapterID]
    WHERE [ChapterName] LIKE '%'+@1+'%' 
    AND [mChapterID_FK] IS NULL
    ORDER BY [ChapterName]
    

    您可能不会立即看到性能提升,因为您的所有列都不能为 NULL。但是,如果这种情况发生变化,NOT IN 将不得不做更多工作 才能获得相同的结果,因此NOT EXISTS 会更快。就目前而言,我们需要查看任何索引的执行计划和 DDL 语句。查看有关 getting help with a slow query. 的博客。

    值得注意的是,您有一个non-SARGable predicate,这意味着索引查找不能用于这部分[ChapterName] LIKE '%'+@1+'%'Brent Ozar explains why this is slow, 但短处是,如果您可以降低领先的百分比,那么您可以看到性能提升。或者,更好的是,如果您可以使用 = 操作数(您不是在搜索“喜欢”该术语的章节),并且您有一个覆盖索引,它可能会快很多。

    【讨论】:

    • 如果你不需要它,可以放弃ORDER BY! (*也不能保证根据索引提高性能)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2010-10-10
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多