gpt4 book ai didi

sql-server - 为什么 SQL Server 不使用我的计算列执行索引查找

转载 作者:行者123 更新时间:2023-12-02 19:45:18 25 4
gpt4 key购买 nike

我正在使用 SQL Server 2008,它拒绝对涵盖计算列的索引执行查找。

我的表格如下所示:

CREATE TABLE Person
{
Id uniqueidentifier NOT NULL,
InsertDate datetime NOT NULL,
PhoneNumber NULL,
PhoneNumberComparable AS (MakePhoneNumberComparable(PhoneNumber)) PERSISTED,
... etc...
}

ID 列上有一个聚集主键索引,InsertDate 列上也有一个索引。

PhoneNumberComparable 计算列上有一个索引,如下所示:

CREATE NONCLUSTERED INDEX IX_Person_PhoneNumberComparable ON Person
(
PhoneNumberComparable ASC
)

所有索引都有最新的统计数据。

我的查询如下所示:

SELECT TOP 20 * FROM Person
WHERE PhoneNumberComparable = @PhoneNumber
ORDER BY InsertDate DESC

默认情况下,SQL Server 决定使用 InsertDate 上的索引而不是 PhoneNumberComparable 上的索引,从而导致性能非常差。

如果我尝试通过在查询中添加WITH (INDEX=IX_Person_PhoneNumberComparable) 来强制使用电话号码索引,SQL 会尝试执行扫描,而不是查找。

如果我尝试使用 FORCESEEK 查询提示,则 SQL Server 会给出以下错误:

Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN.

所以基本上,由于某种原因 SQL Server 拒绝寻找我的索引!为什么?

编辑

根据评论中的建议,我简化了查询,但问题仍然存在(执行主键扫描而不是电话号码索引查找):

SELECT TOP 20 PhoneNumberComparable  FROM Person
WHERE PhoneNumberComparable = @PhoneNumber

最佳答案

我相信我已经弄清楚了。

该问题是由于 MakePhoneNumberComparable 函数使用了不同架构下的另一个函数造成的。为了解决这个问题,我必须克隆另一个函数的第二个副本,但将其移动到与表相同的架构下。

This article (感谢评论者 Kahn)说,如果“计算列中的所有函数引用与表具有相同的所有者”,则只能定义索引。

嗯,不仅这种所有权要求很难遵守,而且 Microsoft 的文档至少可以说非常令人困惑:

  • 首先,我可以创建一个索引。事实上我什至可以扫描索引。我只是无法让 SQL 对索引执行查找。
  • 其次,据我所知,我们在这里讨论的是架构,而不是所有者,但对于两者之间的区别我仍然有些困惑。
  • 第三,我的函数与表的架构相同 - 它只是使用了与表不在同一架构中的第二个函数。

关于sql-server - 为什么 SQL Server 不使用我的计算列执行索引查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20136259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com