关于SQLServer2005的查询效率问题

clarck_913 2010-11-23 09:20:35
小弟现在要做一个查询,存放主要信息的表中的数据量在一千万左右

主要结构如下

ID(LONG), CONTENT(VARCHAR), USERCODE(VARCHAR) , SUBMITTIME(DATETIME)

主键自增 用户数据 用户编码 提交时间

我现在要做的工作是

写一个查询SQL查询一个用户在某段时间内提交的数据,当然,如果数量多的话必然是分页查询

我的SQL 先去查询了表中的复合要求的记录,然后用这部分记录去和其他几个表关联,取得相关信息

比如这样



SELECT A.CONTENT, B,USERNAME

FROM

(

SELECT CONTENT , USERCODE, SUBMITTIME FROM 表 WHERE USERCODE = '' AND SUBMITTIME BETWEEN ‘时间1' AND '时间2'

) A , USERINFO B

WHERE A.USERCODE = B.USERCODE




表中除了主键字段有索引外,DBA给建的索引有 USERCODE字段建了一个不唯一非聚集的索引

SUBMITTIME字段也建立的不唯一非聚集索引

但是,问题来了,我如果不对提交时间进行过滤,只使用USERCODE字段做过滤,也就是查询出该用户的所有记录

这个时候我发现比 查询该用户一个时间段的所有记录要快

感觉很明显,前者需要不到1秒的时间,后者就可以感觉到明显的停顿,要等4-5秒的样子

但是DBA不是给建立了两个索引吗?我去问DBA,他给我解释不清

他给我查看了2005给做的执行计划,从执行计划上看,效果应该是反过来的

但是事实上不是,最终DBA找到了一个认为说的过去的理由

他说,是因为我选择的用户特殊,有可能这个用户数据的数据存储位置比较特殊,所以快了。

但是我不认同这个观点,

因为第一,他拿不出证据证明测试用户的数据存储位置特殊

第二,我用5个测试用户测试这个SQL结果都是和执行计划给出的速度比相反,难道我这5个用户的数据都特殊?

这个查询领导给布置的工作就是要查询效率高,不能让用户感觉长时间的等待

众位高手谁指导指导我吧。

...全文
210 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu_eleven 2010-11-24
  • 打赏
  • 举报
回复
学习,学习。
永生天地 2010-11-23
  • 打赏
  • 举报
回复
这两个条件一个是做“=”, 一个是“between and ”
这样似乎只能用到一个索引,你需要强制使用速度好 的索引
王向飞 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 clarck_913 的回复:]
引用 17 楼 coleling 的回复:

结贴,是一种美德



大哥你放心,我好歹也在CSDN上潜水有几年了

规矩还是懂滴
[/Quote]
幸运的意外 2010-11-23
  • 打赏
  • 举报
回复
索引使用也需要顺序,用的多不一定就快。得用到正地方。
clarck_913 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qianjin036a 的回复:]
SQL code
SELECT A.CONTENT, B,USERNAME from 表 a inner join userinfo b on a.usercode=b.cusecode
where a.usercode='' and a.SUBMITTIME BETWEEN '时间1' AND '时间2'
[/Quote]

试了一下,大哥你给的这个写法速度没有我原来的那个快

我再看看其他人的建议吧
yanguohua2008 2010-11-23
  • 打赏
  • 举报
回复
试试把USERCODE、SUBMITTIME建立联合索引,而不是分别建立单一索引,看看性能呢?
clarck_913 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 coleling 的回复:]

结贴,是一种美德

[/Quote]

大哥你放心,我好歹也在CSDN上潜水有几年了

规矩还是懂滴
clarck_913 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qianjin036a 的回复:]
试试这个:

SQL code
SELECT A.CONTENT, B,USERNAME from 表 a inner join userinfo b on a.usercode=b.cusecode
where usercode='' and SUBMITTIME BETWEEN '时间1' AND '时间2'
[/Quote]

大哥,你给的SQL我考虑过这么写

但是我是这样想的,两个表做关联,笛卡尔积是成数量级的增长的。尤其是A表千万级数据量,B表也小不了,也有几万条记录

这样做的话,要从多大的一个笛卡尔积里查询数据啊?

况且我要关联的码表除了用户表还有4个

所以我用了我现在的写法

我想的是,先从A表里取出复合条件的记录,然后用这个临时表去和其他表关联

这样笛卡尔积就小了很多,一个用户也就大几百条记录。

不知道我这么想是否正确啊~

您说的方法,我现在就去试试

谢谢啊~

-晴天 2010-11-23
  • 打赏
  • 举报
回复
SELECT A.CONTENT, B,USERNAME from 表 a inner join userinfo b on a.usercode=b.cusecode
where a.usercode='' and a.SUBMITTIME BETWEEN '时间1' AND '时间2'
clarck_913 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huminghua 的回复:]
你是不是可以From (这里面的东西)写成一个视图呢?
[/Quote]

不可以,因为数据是实时的。

做成视图,要更新视图会很频繁

我们做的是短信网关,峰值情况下一秒钟最多可能处理200个用户请求
-晴天 2010-11-23
  • 打赏
  • 举报
回复
多一个条件就多一层过滤,你说水流过两个过滤器快还是只流过一个过滤器快?
-晴天 2010-11-23
  • 打赏
  • 举报
回复
试试这个:
SELECT A.CONTENT, B,USERNAME from 表 a inner join userinfo b on a.usercode=b.cusecode
where usercode='' and SUBMITTIME BETWEEN '时间1' AND '时间2'
cjzm83 2010-11-23
  • 打赏
  • 举报
回复
请问 “查询该用户一个时间段的所有记录” 大概多少记录,
是否都用到了 USERCODE,SUBMITTIME字段上不唯一非聚集的索引
clarck_913 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xiaoxiangqing 的回复:]
你虽然SUBMITTIME有建索引,但执行的时候不一定会用索引,还有其它因素在影响它,比如:这个时间段返回的数据量大不大等,你要看执行计划
[/Quote]

恩,我昨天晚上也想到你说的原因了,就是时间字段的索引没起作用

执行计划里这个索引是用到了,否则执行计划估计的效率不会比一个索引的高。

但是执行结果却是相反的

郁闷啊~
clarck_913 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wxf163 的回复:]
SQL 可以不用这么写
[/Quote]

大哥,你这不是馋我呢吗?

告诉我可以不这么写,什么也不说了,要是有好办法你告诉我呗
xiaoxiangqing 2010-11-23
  • 打赏
  • 举报
回复
你虽然SUBMITTIME有建索引,但执行的时候不一定会用索引,还有其它因素在影响它,比如:这个时间段返回的数据量大不大等,你要看执行计划
clarck_913 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qianjin036a 的回复:]
当然要快了!
你要去查一个时间段的记录,系统必须再从已有数据中排序查到时间,如果不要时间段,那它只要把已有结果给你就行了.
[/Quote]

哥哥你好,我是不知道为什么两个索引反倒比一个索引慢

而且 为什么执行计划里给的结果是和执行效果反过来的?

还有就是,如果我查询的WHERE字句里有时间条件,SQLServer会给我自动做排序?

按照你的回复,我猜测是因为,系统根据索引找到了用户代码符合条件的数据

然后再从这堆数据中去过滤时间了?

那时间字段的那个索引用到了吗?

谢谢~
huminghua 2010-11-23
  • 打赏
  • 举报
回复
你是不是可以From (这里面的东西)写成一个视图呢?
王向飞 2010-11-23
  • 打赏
  • 举报
回复
SQL 可以不用这么写
-晴天 2010-11-23
  • 打赏
  • 举报
回复
当然要快了!
你要去查一个时间段的记录,系统必须再从已有数据中排序查到时间,如果不要时间段,那它只要把已有结果给你就行了.
加载更多回复(2)

22,209

社区成员

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

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