首页 > 解决方案 > 在 SQL Server 中查询 NULL 值的最快方法是什么?

问题描述

我正在尝试查找列中包含 NULL 的所有记录。该列已编入索引。但是,当我将我的where条款设置为

where person_key is null

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

有没有办法编写查询来加快在 person_key 中搜索具有 NULL 的记录?

标签: sqlsql-server

解决方案


我正在尝试查找列中包含 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/

  • 如果百分比更高,这里有一些可以提供帮助的选项:

    • 在 person_key 上创建一个过滤的非聚集行存储索引,其中包含 WHERE person_key IS NULL 子句。过滤索引将减小要搜索的索引的大小,并使您获得更好的性能。查询中所有选定的列都可以包含在该索引的 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 获取数据。这不会使查询变得更快。


推荐阅读