gpt4 book ai didi

sql-server - Microsoft SQL Server 能否有效处理非持久计算列?

转载 作者:行者123 更新时间:2023-12-03 03:08:35 25 4
gpt4 key购买 nike

我很难以一种无法显示持久索引计算列的结果的方式来表达这个问题。

我的问题是,如果我有一个表,例如:

CREATE TABLE Customers (
ID int,
Name nvarchar(50),
Balance money,
HasBalance AS CONVERT(bit, CASE WHEN Balance > 0 THEN 1 ELSE 0 END)
)

假设 Balance 上有一个索引,SQL 查询处理器能否有效地处理如下查询:

SELECT ID, Name, Balance
FROM Customers
WHERE HasBalance = 1

它本质上会“内联”计算列表达式吗,就像我直接在查询中指定大小写一样?

如果计算列的表达式位于非架构绑定(bind)的用户定义函数中怎么办?

编辑

我的示例不太好,因为如上所述,HasBalance 列的数据分布不是很好。但暂时忽略索引本身的效率,查询处理器在选择索引和选择执行计划时基本上会像下面这样对待上面的查询吗?

SELECT ID, Name, Balance
FROM Customers
WHERE Balance > 0

最佳答案

这取决于数据的分布,现在你只有 2 个可能的值 1 和 0....所以除非你有 99% 的数据都是一个值,否则你的选择性会很差,那么它必须扫描整个索引以查找所有正值或负值

编辑.....这就是发生的情况,您会得到表扫描

CREATE TABLE Customers (
ID int,
Name nvarchar(50),
Balance money,
HasBalance AS CONVERT(bit, CASE WHEN Balance > 0 THEN 1 ELSE 0 END)
)


insert Customers values(1,'d',100)
insert Customers values(2,'d',-2)
insert Customers values(3,'d',-4)
insert Customers values(4,'d',3)
insert Customers values(5,'d',5)

create index ix_test on Customers(Balance)


SELECT ID, Name, Balance
FROM Customers
WHERE HasBalance = 0

set showplan_text on

|--表扫描(OBJECT:([master].[dbo].[Customers]), 其中:(CONVERT(位,CASE WHEN [master].[dbo].[客户].[余额]>($0.0000) 那么 (1) 否则 (0) 结束,0)=[@1]))

看看这个

SELECT Balance
FROM Customers
WHERE HasBalance = 0

--索引扫描(OBJECT:([master].[dbo].[Customers].[ix_test]), WHERE:(CONVERT(bit,CASE WHEN [master].[dbo].[客户].[余额]>($0.0000) THEN (1) ELSE (0) END,0)=[@1]))

SELECT Balance
FROM Customers
WHERE Balance > 0

|--索引查找(OBJECT:([master].[dbo].[客户].[ix_test]), SEEK:([master].[dbo].[客户] .[余额] > CONVERT_IMPLICIT(金钱,[@1],0)) 向前排序)

关于sql-server - Microsoft SQL Server 能否有效处理非持久计算列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3480039/

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