在SQL Server中查询NULL值的最快方法是什么?

时间:2019-06-13 16:40:00

标签: sql sql-server

我正在尝试查找列中包含NULL的所有记录。该列已建立索引。但是,当我将where子句设置为

where person_key is null

SQL Server需要很长时间才能做出响应。另一方面,寻找特定值的查询会很快返回。

是否可以编写查询来加快对person_key中具有NULL的记录的搜索?谢谢!

1 个答案:

答案 0 :(得分:1)

  

我正在尝试查找列中包含NULL的所有记录。的   列已建立索引。但是,当我将where子句设置为

where person_key is null
     

SQL Server需要很长时间才能做出响应。寻找的查询   另一方面,特定的值会很快返回。

     

是否可以编写查询以加快搜索速度   在person_key中具有NULL的记录?谢谢!

就像上面的每个人一样,要提供适当的建议,还应该提供更多的信息。这里有一些开始:

  1. 查询本身
  2. 表的基础结构,包括现有索引
  3. 执行计划

正如许多评论已经提到的,从提供的有限信息中我可以猜到,这里有几件事情要看:

person_key列中NULL值的百分比是什么?

  • 如果该值非常少,则该列上的行存储非聚集索引 应该能够涵盖您的搜索。查询中所有选定的列都可以包含在此索引的INCLUDE子句下。 相关的MVP链接可获得一些见解:https://www.brentozar.com/archive/2019/03/are-nulls-stored-in-a-nonclustered-index/

  • 如果百分比更高,则可以使用以下一些选项:

    • 在其中具有WHERE person_key IS NULL子句的person_key上创建过滤的非聚集行存储索引。筛选的索引将减少要搜索的索引的大小,并使您获得更好的性能。查询中所有选定的列都可以包含在该索引的INCLUDE子句下。
    • 在包含查询中使用的列的表上创建一个非聚集列存储索引。列存储索引通过在可能的位置存储一次列的一个值来压缩数据,从而减小了可搜索的数据大小,从而显着提高了SELECT查询的性能。如果任何列的基数较低,则在此类列上使用列存储索引可显着提高性能。您还可以过滤此索引。
    • 您可以考虑使该列成为SPARSE列(前提是您知道SPARSE列的局限性)。稀疏列非常有效地处理NULL值。 https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-sparse-columns?view=sql-server-2017

请记住,您需要始终查看要选择的列。如果您正在执行SELECT *或SELECT中有索引未涵盖的列,则意味着即使您能够利用索引来覆盖对person_key列的搜索,但能够获取其余列的值,必须查看现有的聚集索引,或者通过扫描所有叶子页面从HEAP获取数据。那不会使查询变得很快。