============ 关于覆盖索引==========

愚者只看星不看答案 2014-12-09 09:54:50


我有上面的表,其中
YunDanHao 创建了唯一索引
其它的除了BeiZhu其它都创建了索引

我有一个
类似下面的拼sql的存储过程



alter proc usp_YeWu_Search
(
@YunDanHao nvarchar(30)=null,
@YeWuYuan int=null,
@KeHu int=null,
@YeWuFaShengRiQi1 date=null,
@YeWuFaShengRiQi2 date=null
)
as
begin

declare @sql nvarchar(max)='
select yw.ID
,yw.YunDanHao
,ry.Name YeWuYuanXingMing
,kh.Name KeHuXingMing
,yslx.Name YunShuLeiXingMingChen
,yw.YeWuFaShengRiQi
,yw.BeiZhu
from YeWu yw
inner join RenYuan ry on ry.ID=yw.YeWuYuan
inner join KeHu kh on kh.ID=yw.KeHu
inner join YunShuLeiXing yslx on yslx.ID=yw.YunShuLeiXing
where (1=1)
'

if @YunDanHao is not null
set @sql=@sql + ' and (yw.YunDanHao=@YunDanHao)'

if @YeWuYuan is not null
set @sql=@sql + ' and (yw.YeWuYuan=@YeWuYuan)'

if @KeHu is not null
set @sql=@sql + 'and (yw.KeHu=@KeHu)'

if (@YeWuFaShengRiQi1 is not null) and (@YeWuFaShengRiQi2 is not null)
set @sql=@sql + ' and (yw.YeWuFaShengRiQi between @YeWuFaShengRiQi1 and @YeWuFaShengRiQi2)'

exec sp_executesql @sql,N'
@YunDanHao nvarchar(30)=null
,@YeWuYuan int=null
,@KeHu int=null
,@YeWuFaShengRiQi1 date=null
,@YeWuFaShengRiQi2 date=null
',
@YunDanHao
,@YeWuYuan
,@KeHu
,@YeWuFaShengRiQi1
,@YeWuFaShengRiQi2

end



我的问题是应不应该创建一个覆盖索引,其中包含存储过程中的所有输入参数,来提高查询性能?
...全文
224 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2014-12-10
  • 打赏
  • 举报
回复
先看执行计划,现有操作符中是否有不合理的地方,然后考虑建不建索引,索引建在哪些列上,多少个索引、多少列组合一个索引,哪个列在最左边,数据分布是否不平衡,数据的选择度高不高。 还有能不能改写查询 ps:一般来说,外键创建时自带约束,很多人认为外键会自带索引,这个是错误的理解,我的书上有案例,所以在外键上创建非聚集索引在大部分情况下是能提高性能的。
江南小鱼 2014-12-10
  • 打赏
  • 举报
回复
索引并不是越多越好! 而且索引会对插入、修改有一定的影响。
Tiger_Zhao 2014-12-10
  • 打赏
  • 举报
回复
随意组合条件没法用到复合索引。
不过既然是外键,可以把条件用到主表的ID上。
这样自己的条件只需要用到 YeWuFaShengRiQi 上的索引。
	declare @sql nvarchar(max)='
select yw.ID
,yw.YunDanHao
,ry.Name YeWuYuanXingMing
,kh.Name KeHuXingMing
,yslx.Name YunShuLeiXingMingChen
,yw.YeWuFaShengRiQi
,yw.BeiZhu
from YeWu yw
inner join RenYuan ry on ry.ID=yw.YeWuYuan'

if @YunDanHao is not null
set @sql=@sql + ' and (ry.ID=@YunDanHao)'

set @sql=@sql + '
inner join KeHu kh on kh.ID=yw.KeHu'

if @KeHu is not null
set @sql=@sql + 'and (kh.ID=@KeHu)'

set @sql=@sql + '
inner join YunShuLeiXing yslx on yslx.ID=yw.YunShuLeiXing'

if (@YeWuFaShengRiQi1 is not null) and (@YeWuFaShengRiQi2 is not null)
set @sql=@sql + ' where (yw.YeWuFaShengRiQi between @YeWuFaShengRiQi1 and @YeWuFaShengRiQi2)'
發糞塗牆 2014-12-10
  • 打赏
  • 举报
回复
引用 9 楼 truelove12 的回复:
[quote=引用 6 楼 DBA_Huangzj 的回复:] 先看执行计划,现有操作符中是否有不合理的地方,然后考虑建不建索引,索引建在哪些列上,多少个索引、多少列组合一个索引,哪个列在最左边,数据分布是否不平衡,数据的选择度高不高。 还有能不能改写查询 ps:一般来说,外键创建时自带约束,很多人认为外键会自带索引,这个是错误的理解,我的书上有案例,所以在外键上创建非聚集索引在大部分情况下是能提高性能的。
非常感谢。。。就我目前的情况来说,我想创建一个多字段的组合索引,对于拼sql这样的查询来说,是否合理?[/quote]可以,但是需要测试,最好还是贴执行计划看看
  • 打赏
  • 举报
回复
引用 6 楼 DBA_Huangzj 的回复:
先看执行计划,现有操作符中是否有不合理的地方,然后考虑建不建索引,索引建在哪些列上,多少个索引、多少列组合一个索引,哪个列在最左边,数据分布是否不平衡,数据的选择度高不高。 还有能不能改写查询 ps:一般来说,外键创建时自带约束,很多人认为外键会自带索引,这个是错误的理解,我的书上有案例,所以在外键上创建非聚集索引在大部分情况下是能提高性能的。
非常感谢。。。就我目前的情况来说,我想创建一个多字段的组合索引,对于拼sql这样的查询来说,是否合理?
  • 打赏
  • 举报
回复
引用 5 楼 lovelj2012 的回复:
索引并不是越多越好! 而且索引会对插入、修改有一定的影响。
感谢回复,是的,这点我很同意。
  • 打赏
  • 举报
回复
引用 4 楼 ky_min 的回复:
如小F大神所说 索引并不是越多越好 我觉得建个聚集索引即可,对日期那列建个聚集索引, 然后,该查询条件靠前,确保有值带入查询,速度应该会很快~
感谢回复。聚集索引我创建在ID字段上了,因为可能会要常用到编辑表中的某一条数据。 确保有值带入这个查询,估计比较困难,因为查询条件是组合的,不知道用户需不需要查询日期。
还在加载中灬 2014-12-09
  • 打赏
  • 举报
回复
如小F大神所说 索引并不是越多越好 我觉得建个聚集索引即可,对日期那列建个聚集索引, 然后,该查询条件靠前,确保有值带入查询,速度应该会很快~
  • 打赏
  • 举报
回复
引用 2 楼 fredrickhu 的回复:
具体的还需要看执行计划。但是索引并不是越多越好的,需要评估I/O的开销这些和速度的提升那样更划算。
感谢回复,主要是因为有不少字段都是外键。。。根据我限有的经验,在外键上加索引会快出很多。 你的看法是创建一个beizhu以外的其它字段构建的一个覆盖索引比较好?谢谢。
--小F-- 2014-12-09
  • 打赏
  • 举报
回复
具体的还需要看执行计划。但是索引并不是越多越好的,需要评估I/O的开销这些和速度的提升那样更划算。
--小F-- 2014-12-09
  • 打赏
  • 举报
回复
你一个表就这么多字段,怎么就建了这么多索引了? 直接一个覆盖索引就可以了。

34,837

社区成员

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

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