SQL Server:是否可以为IS NULL条件创建非聚集索引

时间:2017-08-17 07:02:28

标签: sql sql-server

为具有is null条件的查询创建非聚集索引的语法是什么。

示例查询:

select * 
from mytable
where mycolumn is null

我创建的索引:

CREATE NONCLUSTERED INDEX [myindexname]
ON [dbo].[mytable] ([mycolumn])

当我在SQL中执行此查询并查看其执行计划时,它显示缺少索引。

enter image description here

还是有其他可能的选择吗?

2 个答案:

答案 0 :(得分:3)

在可空列上创建索引没有问题 对于可空列,唯一不能做的就是创建一个主键。

您可以右键单击绿色消息,SSMS将为您提供复制它的选项。然后将其粘贴到查询编辑器中,您将看到它包含create index语句。你需要做的就是给它起名字并运行声明。

在对此答案的评论中进行了对话之后,Ivan Sivak发现这是SQL Server所具有的错误,并在2012版本中得到修复。 Here is the link to the bug report in Microsoft Connect.

答案 1 :(得分:0)

默认情况下,查询计划使用任何方案中可用的最佳索引。

一个原因可能是索引支离破碎。  您可以通过运行查询来减少碎片

ALTER INDEX [myindexname] ON [dbo].[mytable] REBUILD;
  

您可以在此处详细了解:https://docs.microsoft.com/en-us/sql/relational-databases/indexes/reorganize-and-rebuild-indexes


查询计划有时不会为查询提供最佳可用索引。为此,Microsoft提供了表提示。

  1. FORCESEEK
    这告诉优化器在任何情况下都使用索引查找操作。
  2. SELECT *
    FROM   mytable WITH(FORCESEEK)
    WHERE  mycolumn IS NULL 
    
      

    警告:在使用任何强制计划提示(ForceSeek,ForceScan等)时,您可能会破坏查询

    1. 索引提示
      这告诉优化器使用特定索引进行搜索/扫描
    2. SELECT *
      FROM   mytable WITH([myindexname])
      WHERE  mycolumn IS NULL 
      

      此查询现在将使用 myindexname 进行上述查询。

      1. 您可以合并这两个提示:
      2. SELECT *
        FROM   mytable WITH([myindexname], ForceSeek)
        WHERE  mycolumn IS NULL 
        

        此查询现在将使用 myindexname 进行上述查询的扫描操作。

          

        此处有关于表格提示的更多信息:https://technet.microsoft.com/en-us/library/bb510478(v=sql.105).aspx