【问题标题】:What is the fastest way to query for NULL values in SQL Server? [closed]在 SQL Server 中查询 NULL 值的最快方法是什么? [关闭]
【发布时间】:2019-10-28 07:37:50
【问题描述】:

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

where person_key is null

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

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

【问题讨论】:

  • 没有足够的信息来回答这个问题。我们需要查看表的 DDL、索引定义、完整查询和实际执行计划。
  • 那么,在索引列中查询 NULL 时是否没有一般规则可遵循?查询几乎是 select * from vw_gld_re_gift where person_key is NULL
  • 您可以尝试使用 person_key IS NULL 放置一个过滤索引,看看您是否获得了速度提升。
  • person_key 被索引,并且你有非常小的百分比的空值,很可能服务器将进行索引搜索,然后进行集群索引查找以满足select *。如果有大量空值,那么在给定select * 的情况下,服务器很可能会完全忽略索引并扫描表,因为无论如何它都必须这样做以满足*。作为起点,请尝试仅查询包含在 person_key 上的索引中的列。

标签: sql sql-server


【解决方案1】:

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

where person_key is null

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

有没有办法编写查询来加快搜索速度 person_key 中有 NULL 的记录?谢谢!

就像上面每个人都评论过的那样,为了提供适当的建议,应该提供更多信息。以下是一些开始:

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

正如许多 cmets 已经提到的那样,根据我提供的有限信息,我可以猜到以下几点:

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 获取数据。这不会使查询变得更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2015-08-26
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    相关资源
    最近更新 更多