筛选一个计算过的有索引的字段,索引仍然发挥它的作用吗?

Frank6600 2018-06-24 08:54:10
假设A int字段有索引,我知道
SELECT * FROM TEST WHERE A=3
查询速度可以很快,因为A的索引起到作用。

那么,筛选计算过的有索引的字段,例如:
SELECT * FROM TEST WHERE (A%10)=3
A的索引仍然起到作用吗?
查询速度仍然很快吗?
...全文
190 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Frank6600 2018-06-25
  • 打赏
  • 举报
回复
谢谢诸位帮忙
吉普赛的歌 版主 2018-06-25
  • 打赏
  • 举报
回复
计算过的字段, 一般是会受影响的, 如#2版主所说, 要看执行计划。
不推荐对字段进行包装, 如果你一定要这样, 建议用计算列:
USE tempdb
GO
IF OBJECT_ID('TEST') IS NOT NULL DROP TABLE TEST
GO
CREATE TABLE TEST(
id INT IDENTITY(1,1) PRIMARY KEY,
A INT
)
GO
INSERT INTO TEST(A) VALUES (13)
INSERT INTO TEST(A) VALUES (25)
GO
--添加计算列
ALTER TABLE TEST ADD A_mod_10 AS A%10 PERSISTED
--添加计算列索引
CREATE INDEX ix_TEST_A_mod_10 ON TEST(A_mod_10)
GO
--查询时直接用计算列
SELECT * FROM TEST WHERE A_mod_10=3
/*
id A A_mod_10
1 13 3
*/
二月十六 版主 2018-06-24
  • 打赏
  • 举报
回复
楼主可以看看执行计划
卖水果的net 版主 2018-06-24
  • 打赏
  • 举报
回复
索引不一定起作用,部分情况下下也是起作用的。 一般认为,这样的写法,是不起作用的,也不许使用。 PS:数据量不大时,毫无压力。

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧