SQL Server 语句(菜鸟提问)

零度的折翅 2014-01-15 02:16:14
问题描述:有表 mytable,字段 id,time,description,约束只有主键id,但是id杂乱无章,time是datetime类型。查询总数目语句:
select count(*) from mytable where time > '2013-10-10 00:00:00' and description like '%描述%';
查询某一段数据语句 :
with tabtemp as (select ROW_NUMBER() over (order by time desc) as rows, * from mytable where time > '2013-10-10 00:00:00' and description like '%描述%') select * from tabtemp where rows between 220000 and 230000 ;
目的:要完成按照一定条件查找这张表mytable(必须按照时间反排序),得到总记录数count,然后取其中的某一段,上面这个语句就是去了其中的220000 到230000之间的数据。
问题:我想用一条语句去查询,既要得到满足条件的总数目,又要其中的某一段数据。因为现在如果用2条语句,完成这个事情就耗时太多了,我测试后,如果总数据量在100w条时,我查询总数需要2-3秒,再查询后面的数据段时,rows < 30w 时,要3秒左右,如果大点,就要4-5秒,很是郁闷,因为系统现在给我的超时时间是5s,所以我总超时,有没有办法一条语句搞定,这样就很难超时。
各位高手们,请不吝赐教!
...全文
270 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
零度的折翅 2014-01-16
  • 打赏
  • 举报
回复
结贴,给分。 再次感谢 yupeigu 阳泉酒家小当家,问题已经得到解决。 也感谢版主大力支持。
零度的折翅 2014-01-16
  • 打赏
  • 举报
回复
引用 27 楼 yupeigu 的回复:
楼主有qq不,方便的话,直接帮你看一下
这个肯定有,252593682,谢谢!
  • 打赏
  • 举报
回复
楼主有qq不,方便的话,直接帮你看一下
零度的折翅 2014-01-16
  • 打赏
  • 举报
回复
我是这样抓的图,不好意思,我是个初学者,不太懂,能够告诉我怎么看执行计划?

發糞塗牆 2014-01-16
  • 打赏
  • 举报
回复
你这是预估执行计划还是实际执行计划?
零度的折翅 2014-01-16
  • 打赏
  • 举报
回复




零度的折翅 2014-01-16
  • 打赏
  • 举报
回复
引用 20 楼 DBA_Huangzj 的回复:
1、把鼠标移到【表假脱机】,把上面用到的列加上非聚集索引,
2、鼠标移到【排序】,看看是什么列导致排序


我鼠标移上去了,但是看了半天,看不出来到底是哪个列,麻烦你帮忙看看,谢谢!

  • 打赏
  • 举报
回复
引用 21 楼 huoqingna2332 的回复:
[quote=引用 19 楼 yupeigu 的回复:] [quote=引用 18 楼 huoqingna2332 的回复:] with tabtemp as (select ROW_NUMBER() over (order by sendtime desc ) as rows, COUNT(*) over(partition by 1) as count_rows, * from IM_RECORD where 1 = 1) select * from tabtemp where rows between 599988 and 600010
试试这个能不能快:
;with tabtemp as 
(
select ROW_NUMBER() over (order by time desc) as rows, 
       (select COUNT(*) 
        from from mytable 
        where time > '2013-10-10 00:00:00' 
        and description like '%描述%') as count_rows,  --记录条数
       * 
from mytable 
where time > '2013-10-10 00:00:00' and description like '%描述%'
) 


select * from tabtemp 
where rows between 220000 and 230000 ;
[/quote] 刚才试了,如果不带查询条件很快,3秒内,但是带上条件,效率就慢了,平均需要6秒左右,达不到5秒内呀,不过,谢谢![/quote] 哦,不带哪个查询条件呢?
零度的折翅 2014-01-16
  • 打赏
  • 举报
回复
引用 19 楼 yupeigu 的回复:
[quote=引用 18 楼 huoqingna2332 的回复:] with tabtemp as (select ROW_NUMBER() over (order by sendtime desc ) as rows, COUNT(*) over(partition by 1) as count_rows, * from IM_RECORD where 1 = 1) select * from tabtemp where rows between 599988 and 600010
试试这个能不能快:
;with tabtemp as 
(
select ROW_NUMBER() over (order by time desc) as rows, 
       (select COUNT(*) 
        from from mytable 
        where time > '2013-10-10 00:00:00' 
        and description like '%描述%') as count_rows,  --记录条数
       * 
from mytable 
where time > '2013-10-10 00:00:00' and description like '%描述%'
) 


select * from tabtemp 
where rows between 220000 and 230000 ;
[/quote] 刚才试了,如果不带查询条件很快,3秒内,但是带上条件,效率就慢了,平均需要6秒左右,达不到5秒内呀,不过,谢谢!
發糞塗牆 2014-01-15
  • 打赏
  • 举报
回复
1、把鼠标移到【表假脱机】,把上面用到的列加上非聚集索引, 2、鼠标移到【排序】,看看是什么列导致排序
  • 打赏
  • 举报
回复
引用 18 楼 huoqingna2332 的回复:
with tabtemp as (select ROW_NUMBER() over (order by sendtime desc ) as rows, COUNT(*) over(partition by 1) as count_rows, * from IM_RECORD where 1 = 1) select * from tabtemp where rows between 599988 and 600010
试试这个能不能快:
;with tabtemp as 
(
select ROW_NUMBER() over (order by time desc) as rows, 
       (select COUNT(*) 
        from from mytable 
        where time > '2013-10-10 00:00:00' 
        and description like '%描述%') as count_rows,  --记录条数
       * 
from mytable 
where time > '2013-10-10 00:00:00' and description like '%描述%'
) 


select * from tabtemp 
where rows between 220000 and 230000 ;
零度的折翅 2014-01-15
  • 打赏
  • 举报
回复
with tabtemp as (select ROW_NUMBER() over (order by sendtime desc ) as rows, COUNT(*) over(partition by 1) as count_rows, * from IM_RECORD where 1 = 1) select * from tabtemp where rows between 599988 and 600010
零度的折翅 2014-01-15
  • 打赏
  • 举报
回复
忘了执行语句了:
零度的折翅 2014-01-15
  • 打赏
  • 举报
回复
引用 15 楼 DBA_Huangzj 的回复:
执行计划贴出来看看




我不太懂执行计划,我在网上搜了一下,然后抓了个图,你看看是不是这个。
另外,下班了,我们都要休息,呵呵,明天我们再讨论。谢谢!
發糞塗牆 2014-01-15
  • 打赏
  • 举报
回复
执行计划贴出来看看
零度的折翅 2014-01-15
  • 打赏
  • 举报
回复
引用 13 楼 yupeigu 的回复:
[quote=引用 12 楼 huoqingna2332 的回复:] [quote=引用 11 楼 yupeigu 的回复:] [quote=引用 9 楼 huoqingna2332 的回复:] [quote=引用 8 楼 DBA_Huangzj 的回复:] [quote=引用 7 楼 huoqingna2332 的回复:] [quote=引用 5 楼 DBA_Huangzj 的回复:] 由于你的row_number是在查询的时候产生的,没有索引,所以后续使用会很慢,这也是我叫你存到临时表,加索引再查临时表的原因
我先建索引试试!谢谢[/quote]情况如何?[/quote] 这个建了索引time,有索引类型,聚集和非聚集,我试试了非聚集,效率不好,聚集效率还可以,我再多测试一下聚集,看看效率。我看之前主键id是聚集的,我设置time为聚集后,id就非聚集了。 我弱弱的问一下,聚集和非聚集是什么区别?[/quote] 聚集索引,会影响整个表的数据在硬盘上的物理顺序,而非聚集索引,只是对你设置的那个字段,进行排序,不会影响整个表的数据的顺序[/quote] 好的,谢谢,聚集和非聚集意义明了! 我刚测试了一下,聚集的time索引,没有问题,基本平均耗时3秒左右。 但是现在,我要2个数据,一个是总和count(*)和一个范围数据,现在计算总和也会耗时3秒,再取数据也耗时3秒,导致我完成这个工作要6秒左右,有没有一条语句直接搞定,现在我这么效率还是达不到要求。谢谢![/quote] 这个语句,你试试,就是上面的语句,可以在一个语句,就是不知道速度怎么样:
;with tabtemp as 
(
select ROW_NUMBER() over (order by time desc) as rows, 
       COUNT(*) over(partition by 1) as count_rows,  --记录条数
       * 
from mytable 
where time > '2013-10-10 00:00:00' and description like '%描述%'
) 


select * from tabtemp 
where rows between 220000 and 230000 ;
[/quote] 这个我试过了,平均需要6-7秒,效率低!
  • 打赏
  • 举报
回复
引用 12 楼 huoqingna2332 的回复:
[quote=引用 11 楼 yupeigu 的回复:] [quote=引用 9 楼 huoqingna2332 的回复:] [quote=引用 8 楼 DBA_Huangzj 的回复:] [quote=引用 7 楼 huoqingna2332 的回复:] [quote=引用 5 楼 DBA_Huangzj 的回复:] 由于你的row_number是在查询的时候产生的,没有索引,所以后续使用会很慢,这也是我叫你存到临时表,加索引再查临时表的原因
我先建索引试试!谢谢[/quote]情况如何?[/quote] 这个建了索引time,有索引类型,聚集和非聚集,我试试了非聚集,效率不好,聚集效率还可以,我再多测试一下聚集,看看效率。我看之前主键id是聚集的,我设置time为聚集后,id就非聚集了。 我弱弱的问一下,聚集和非聚集是什么区别?[/quote] 聚集索引,会影响整个表的数据在硬盘上的物理顺序,而非聚集索引,只是对你设置的那个字段,进行排序,不会影响整个表的数据的顺序[/quote] 好的,谢谢,聚集和非聚集意义明了! 我刚测试了一下,聚集的time索引,没有问题,基本平均耗时3秒左右。 但是现在,我要2个数据,一个是总和count(*)和一个范围数据,现在计算总和也会耗时3秒,再取数据也耗时3秒,导致我完成这个工作要6秒左右,有没有一条语句直接搞定,现在我这么效率还是达不到要求。谢谢![/quote] 这个语句,你试试,就是上面的语句,可以在一个语句,就是不知道速度怎么样:
;with tabtemp as 
(
select ROW_NUMBER() over (order by time desc) as rows, 
       COUNT(*) over(partition by 1) as count_rows,  --记录条数
       * 
from mytable 
where time > '2013-10-10 00:00:00' and description like '%描述%'
) 


select * from tabtemp 
where rows between 220000 and 230000 ;
零度的折翅 2014-01-15
  • 打赏
  • 举报
回复
引用 11 楼 yupeigu 的回复:
[quote=引用 9 楼 huoqingna2332 的回复:] [quote=引用 8 楼 DBA_Huangzj 的回复:] [quote=引用 7 楼 huoqingna2332 的回复:] [quote=引用 5 楼 DBA_Huangzj 的回复:] 由于你的row_number是在查询的时候产生的,没有索引,所以后续使用会很慢,这也是我叫你存到临时表,加索引再查临时表的原因
我先建索引试试!谢谢[/quote]情况如何?[/quote] 这个建了索引time,有索引类型,聚集和非聚集,我试试了非聚集,效率不好,聚集效率还可以,我再多测试一下聚集,看看效率。我看之前主键id是聚集的,我设置time为聚集后,id就非聚集了。 我弱弱的问一下,聚集和非聚集是什么区别?[/quote] 聚集索引,会影响整个表的数据在硬盘上的物理顺序,而非聚集索引,只是对你设置的那个字段,进行排序,不会影响整个表的数据的顺序[/quote] 好的,谢谢,聚集和非聚集意义明了! 我刚测试了一下,聚集的time索引,没有问题,基本平均耗时3秒左右。 但是现在,我要2个数据,一个是总和count(*)和一个范围数据,现在计算总和也会耗时3秒,再取数据也耗时3秒,导致我完成这个工作要6秒左右,有没有一条语句直接搞定,现在我这么效率还是达不到要求。谢谢!
  • 打赏
  • 举报
回复
引用 9 楼 huoqingna2332 的回复:
[quote=引用 8 楼 DBA_Huangzj 的回复:] [quote=引用 7 楼 huoqingna2332 的回复:] [quote=引用 5 楼 DBA_Huangzj 的回复:] 由于你的row_number是在查询的时候产生的,没有索引,所以后续使用会很慢,这也是我叫你存到临时表,加索引再查临时表的原因
我先建索引试试!谢谢[/quote]情况如何?[/quote] 这个建了索引time,有索引类型,聚集和非聚集,我试试了非聚集,效率不好,聚集效率还可以,我再多测试一下聚集,看看效率。我看之前主键id是聚集的,我设置time为聚集后,id就非聚集了。 我弱弱的问一下,聚集和非聚集是什么区别?[/quote] 聚集索引,会影响整个表的数据在硬盘上的物理顺序,而非聚集索引,只是对你设置的那个字段,进行排序,不会影响整个表的数据的顺序
發糞塗牆 2014-01-15
  • 打赏
  • 举报
回复
区别太大,一下子说不清楚,不过对于你这个情况,聚集能实现预排序,可能会优秀一点,性能瓶颈要看执行计划才能定位
加载更多回复(9)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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