繁体   English   中英

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

[英]SQL Server : is it possible to create non-clustered index for IS NULL condition

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

示例查询:

select * 
from mytable
where mycolumn is null

我创建的索引:

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

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

在此输入图像描述

或者还有其他可选择的可能性吗?

在可空列上创建索引没有问题。
您可以对可空列进行的唯一操作是创建主键。

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

在对这个答案的评论中进行了对话后,Ivan Sivak发现这是SQL Server所具有的错误,并在2012版本中得到修复。 以下是Microsoft Connect中错误报告的链接。

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

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

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

你可以在这里阅读更多内容: https//docs.microsoft.com/en-us/sql/relational-databases/indexes/reorganize-and-rebuild-indexes


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

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

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

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

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

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

operation for above query. 此查询现在将使用myindexname和上述查询的操作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM