为具有is null
条件的查询创建非聚集索引的语法是什么。
示例查询:
select *
from mytable
where mycolumn is null
我创建的索引:
CREATE NONCLUSTERED INDEX [myindexname]
ON [dbo].[mytable] ([mycolumn])
当我在SQL中执行此查询并查看其执行计划时,它显示缺少索引。
还是有其他可能的选择吗?
答案 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提供了表提示。
SELECT * FROM mytable WITH(FORCESEEK) WHERE mycolumn IS NULL
警告:在使用任何强制计划提示(ForceSeek,ForceScan等)时,您可能会破坏查询
SELECT * FROM mytable WITH([myindexname]) WHERE mycolumn IS NULL
此查询现在将使用 myindexname 进行上述查询。
SELECT * FROM mytable WITH([myindexname], ForceSeek) WHERE mycolumn IS NULL
此查询现在将使用 myindexname 进行上述查询的扫描操作。
此处有关于表格提示的更多信息:https://technet.microsoft.com/en-us/library/bb510478(v=sql.105).aspx