这取决于数据的分布,现在你只有 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]), WHERE:(CONVERT(bit,CASE WHEN [master].[dbo].[Customers].[Balance]>($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].[Customers].[Balance]> ($0.0000) THEN (1) ELSE (0) END,0)=[@1]))
SELECT Balance
FROM Customers
WHERE Balance > 0
|--索引搜索(OBJECT:([master].[dbo].[Customers].[ix_test]), SEEK:([master].[dbo].[Customers].[Balance] > CONVERT_IMPLICIT(money,[ @1],0)) 已订购)