多个单列索引执行计划如何选择?

USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(id INT IDENTITY(1,1) PRIMARY KEY, a INT,b INT,c INT)
GO
--插入 1000 * 1000 = 1百万条数据
;WITH cte AS (SELECT TOP 1000 1 AS id FROM [master].dbo.spt_values AS sv )
,t1 as (SELECT ROW_NUMBER() OVER(ORDER BY(SELECT 1)) AS id FROM cte AS a CROSS APPLY cte AS b)
INSERT INTO t(a,b,c)
SELECT id,id,id FROM t1
GO
CREATE INDEX ix_t_a ON t(a)
CREATE INDEX ix_t_b ON t(b)
CREATE INDEX ix_t_c ON t(c)
GO
--索引查找 ix_t_a 50%, 键查找 50%
SELECT * FROM t WHERE a=10 AND b=10 AND c=10

--索引查找 ix_t_b 50%, 键查找 50%
SELECT * FROM t WHERE a>10 AND b=10 AND c=10

--索引查找 ix_t_b 50%, 键查找 50%
SELECT * FROM t WHERE a>999999 AND b=10 AND c=10
--                     1000000

--索引查找 ix_t_a 50%, 键查找 50%
SELECT * FROM t WHERE a>1000000 AND b=10 AND c=10

--索引查找 ix_t_a 16%, ix_t_b 16%, 合并联接 43%, ix_t_c 16%, 合并联接 0%, 键查找 24%
SELECT TOP 10 * FROM t WHERE a=10 OR b=10 OR c=10

/*******************************************
 * 多个单列索引总结:
 * 1. 在查询时如果全是and, 只可能用到一个
 * 2. 如果有 or, 可能用到多个
 * 3. 挑选密度最小的,IO代价最小的索引作为实际运行的索引
 * 4. = 比 > 优先, 除非 > 条件产生的根本没有记录。
 *******************************************/
 



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值