存储过程中,where子句使用局部变量,需要强制设定with index?以及查询优化的一些疑惑

geodetic 2009-03-14 01:45:37
网络上不少地方的优化技巧都这么说,如:

7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num


实际开发中完全没有遇到过这样的问题啊,比如
create proc test
as
declare @t smalldatetime
set @t='2009-1-1'
select * from test where time<@t
go

查询中没有强制指定with index,但是实际使用中,有索引和无索引、聚簇索引设定是否合理,性能差别很大,查询中肯定使用了索引啊


另外:
实际开发中曾经遇到过某字段上只有不到10个值,表中数据数百万,涉及该字段的查询时,该字段上有无索引性能差别也很大,索引的selectivity原则真的有效?

11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

实际中同样没有感觉

20.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。

“表变量包含大量数据,请注意索引非常有限(只有主键索引)”是什么意思?


以上测试环境都是sql server 2005

帮顶有分,不够开新帖另加,谢谢:)
...全文
280 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ai_li7758521 2009-04-04
  • 打赏
  • 举报
回复
学习
  • 打赏
  • 举报
回复
1、使用到索引的话,因为存储过程会保存执行计划,当你换成简单查询的时候,则不一定就使用索引了。
一个字段加不加索引,对查询的性能影响很大。当数据的选择性很大(即结果数据在所有数据占的比率越小),索引所带来的性能提升越大
2、第十一条也许有用吧
3、最后一条,没看明白。
如果用表变量的话,那么表变量是存储在内存中,这样的话读取速度也许能快一点吧
Zoezs 2009-04-04
  • 打赏
  • 举报
回复
with index是强制使用索引
一般情况下SQL都会正确使用索引,但是有些情况比较特殊,你需要的索引和SQL默认优先的不一直,这时候
你可能就需要强制索引了

select * from Tab with (index (indexname))
where col1(你加索引的列)


ws_hgo 2009-04-04
  • 打赏
  • 举报
回复
提高索引优化
需要建立统计信息
例如
alter database tb
set auto_create_statistics off
set update_create_statistics on

go

create table tb
(
id identity(1,1) primary key,
[Name] varchar(20),
sex varchar(1)
)
insert into tb select top 2000 '',N'女' from syscolumns C1,syscolumns C2

create index index_sex on tb(sex)

--(1)
set statictics io on
select * from tb where sex=N'女'
set statictics io off
--(2)与(1)进行比较
create statictics sta_tb on tb(sex)--建立统计信息
set statictics io on
select * from tb where sex=N'女'
set statictics io off

没有环境
在家里休息
geodetic 2009-04-04
  • 打赏
  • 举报
回复
up
没人对这个有兴趣?
lgjlry 2009-03-15
  • 打赏
  • 举报
回复
关注
dawugui 2009-03-14
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090313/20/2287914b-309c-4c4e-806c-23ca6d3c5c54.html
no_mIss 2009-03-14
  • 打赏
  • 举报
回复
7.表变量不用索引的情况极少,在复杂的含有子查询的多表连接时,有时会出现.
11.50%说的正确.
20.是误人子弟.
you_tube 2009-03-14
  • 打赏
  • 举报
回复
这么多,帮顶
htl258_Tony 2009-03-14
  • 打赏
  • 举报
回复
这么专的问题还是由专家来答吧,俺顶.

22,199

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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