一条sql语句时快时慢

时间:2022-07-10 01:03:54
select * from(
  select top 20 * from (
       select  moo.linkid,moo.mobile,moo.matchcode,mocontent,motime,moo.spcode,moo.stat,moo.state,moo.company,mt.linkid mtlinkid,mtcontent,mttime,mt.stat mtstat,RowNumber 
           from(
              select linkid,mobile,mo.matchcode,mocontent,motime,spcode,stat,Province state,company,ROW_NUMBER() OVER (ORDER BY id) AS RowNumber 
                from t_jbxs_mo_log mo,t_mobile_zipcode mobi,t_jbxs_matchinfo matc 
                   where substring(mo.mobile,0,8)=substring(mobi.Region,0,8) and matc.matchcode=mo.matchcode 

     ) moo left join t_jbxs_mt_log mt on mt.linkid=moo.linkid
   ) result where RowNumber>(100-1)*20 ) resultOrder  order by motime desc

这是我的sql语句,在查询分析器中一般都是2秒左右,在系统中有时候很快,有时候却很慢超时查不出数据来。不知道是怎么回事

43 个解决方案

#1


我了个去,这一条还真长啊

#2


]_[

#3


多写了两层没用的. 改为以下

select top 20 moo.linkid,moo.mobile,moo.matchcode,mocontent,motime,moo.spcode,moo.stat,moo.state,moo.company,mt.linkid mtlinkid,mtcontent,mttime,mt.stat mtstat,RowNumber  
  from(
  select linkid,mobile,mo.matchcode,mocontent,motime,spcode,stat,Province state,company,ROW_NUMBER() OVER (ORDER BY id) AS RowNumber  
  from t_jbxs_mo_log mo,t_mobile_zipcode mobi,t_jbxs_matchinfo matc  
  where substring(mo.mobile,0,8)=substring(mobi.Region,0,8) and matc.matchcode=mo.matchcode  

  ) moo left join t_jbxs_mt_log mt on mt.linkid=moo.linkid where RowNumber>(100-1)*20 ) resultOrder order by motime desc

#4


一条sql语句时快时慢

#5


3楼这样写查询的结果会出现重复,所以我才在外面包了一层

#6


一条sql语句时快时慢

#7


引用 5 楼 fangyanyi 的回复:
3楼这样写查询的结果会出现重复,所以我才在外面包了一层


select * from(
  select top 20 * from (
你这两层没法去重复呀..

#8


真够长的  一条sql语句时快时慢

#9


真够长的啊 

#10


ROW_NUMBER() OVER (ORDER BY id) AS RowNumber 这个是我自动编的号,我放在最外面判断的,放到里面每次取的都是一样的所以会重复,你的sql语句我刚试过了,确实重复

#11


该回复于2011-04-25 10:49:19被版主删除

#12


最主要的是在系统中有时候查询很慢,出现超时数据显示不出来。有时候却是挺快的。我在服务器查询分析器中执行了下一直都是2秒左右,最高也不会超过三秒。我本地也没问题。

#13


用临时表试一下

#14


把你的这个sql语句写入存储过程吧。不要拼接sql在cs上。

#15


如果是我,我就让sql语句执行尽可能简单的功能,
把判断啥的放在程序里去执行,要不然总是这样,数据库受不了啊

#16


感觉大家好像没有把握住我问的问题,我想找出问什么时快时慢

#17


好逗啊!

#18


如果查询分析器的时间稳定在2秒左右,说明数据库端没有问题,sql 语句没有问题,问题出在其他地方,比如网络连接?

#19


Lock 了吧

#20


你应该去SQL版优化一下 。。

#21


使用SQL SERVER性能监视器,计算从该条sql传入sql到返回值后的时间
也可以发现时间究竟是花在执行上,还是其他方面

#22


引用 20 楼 wxr0323 的回复:
你应该去SQL版优化一下 。。

的确
联表查条件还是substring(mo.mobile,0,8)=substring(mobi.Region,0,8)

#23


引用 12 楼 fangyanyi 的回复:
最主要的是在系统中有时候查询很慢,出现超时数据显示不出来。有时候却是挺快的。我在服务器查询分析器中执行了下一直都是2秒左右,最高也不会超过三秒。我本地也没问题。


恩,就是要检查一下网络问题。
再说你说的时快时慢。能不能具体点。不然不好判断啊

#24


慢是在某一个时间段内显示一直在查询,最后超时什么也查不出来。有时候就一点查询就直接查询出来了。但是系统中其它地方的查询都能查询出来,所以应该跟网络没有关系

#25


把它建成视图再试试。

#26


数据量比较大。。建议使用存储过程,将查询的结果 放  临时表, 在 取临时表数据加条件判断。

#27


这个不知道怎么试好。是有时候快,有时候就慢查不出来。就像上个星期五下午就查不出来,今天我在查就很快可以查出来。已经出现好几次了

#28


该存储过程吧

这样执行的效率肯定 会慢的

至于你说的时快时慢

是因为数据量的 并发处理  时多时少

#29


该回复于2011-04-25 13:48:28被版主删除

#30


有可能出现死锁的情况吗?应为在查不出来的时候感觉好像是假死的状态

#31


建设用临时表吧,这个脚本很容易出错的。数据量大的话又不查

#32


打个SP_WHO  ,看看你用的几张表是不是被其他进程锁了,锁了就会很慢

建议用临时表。表名后加上 with (nolock)

#33


看了你的SQL语句,我意识到我的sql也很菜... 一条sql语句时快时慢

#34


一条sql语句时快时慢顶一个!

#35


建议用临时表。表名后加上 with (nolock)

#36


看着这sql我就有点头大阿

#37


我也寫過自動增號的sql,用生成視圖的方法速度還可以,試一下吧

#38


监视实际执行计划,看看开销浪费在哪

#39


用存储过程试试吧  或者你把后面from的语句写成left join 语句 调用下?

#40


SELECT  *
FROM
        (SELECT top 20 *
        FROM
                (SELECT moo.linkid        ,
                        moo.mobile        ,
                        moo.matchcode     ,
                        mocontent         ,
                        motime            ,
                        moo.spcode        ,
                        moo.stat          ,
                        moo.state         ,
                        moo.company       ,
                        mt.linkid mtlinkid,
                        mtcontent         ,
                        mttime            ,
                        mt.stat mtstat    ,
                        RowNumber
                FROM
                        (SELECT linkid        ,
                                mobile        ,
                                mo.matchcode  ,
                                mocontent     ,
                                motime        ,
                                spcode        ,
                                stat          ,
                                Province state,
                                company       ,
                                ROW_NUMBER() OVER (ORDER BY id) AS RowNumber
                        FROM    t_jbxs_mo_log mo     ,
                                t_mobile_zipcode mobi,
                                t_jbxs_matchinfo matc
                        WHERE   substring(mo.mobile,0,8)=substring(mobi.Region,0,8)
                            AND matc.matchcode          =mo.matchcode
                        ) moo
                        LEFT JOIN t_jbxs_mt_log mt
                        ON      mt.linkid=moo.linkid
                ) result
        WHERE   RowNumber>(100-1)*20
        ) resultOrder
ORDER BY motime DESC


帮楼主排了下版

#41


引用 39 楼 tony312ws 的回复:
用存储过程试试吧  或者你把后面from的语句写成left join 语句 调用下?


用不用存储过程,有什么影响?

#42


RowNumber>(100-1)*20
这个是固定的值么,如果是最好大于该值,不要用表达式在计算该值。

#43


在系统中很慢,但在查询分析器中很快,这个可以参考一下:
http://www.cnblogs.com/bluedoctor/archive/2011/03/04/1970866.html

#1


我了个去,这一条还真长啊

#2


]_[

#3


多写了两层没用的. 改为以下

select top 20 moo.linkid,moo.mobile,moo.matchcode,mocontent,motime,moo.spcode,moo.stat,moo.state,moo.company,mt.linkid mtlinkid,mtcontent,mttime,mt.stat mtstat,RowNumber  
  from(
  select linkid,mobile,mo.matchcode,mocontent,motime,spcode,stat,Province state,company,ROW_NUMBER() OVER (ORDER BY id) AS RowNumber  
  from t_jbxs_mo_log mo,t_mobile_zipcode mobi,t_jbxs_matchinfo matc  
  where substring(mo.mobile,0,8)=substring(mobi.Region,0,8) and matc.matchcode=mo.matchcode  

  ) moo left join t_jbxs_mt_log mt on mt.linkid=moo.linkid where RowNumber>(100-1)*20 ) resultOrder order by motime desc

#4


一条sql语句时快时慢

#5


3楼这样写查询的结果会出现重复,所以我才在外面包了一层

#6


一条sql语句时快时慢

#7


引用 5 楼 fangyanyi 的回复:
3楼这样写查询的结果会出现重复,所以我才在外面包了一层


select * from(
  select top 20 * from (
你这两层没法去重复呀..

#8


真够长的  一条sql语句时快时慢

#9


真够长的啊 

#10


ROW_NUMBER() OVER (ORDER BY id) AS RowNumber 这个是我自动编的号,我放在最外面判断的,放到里面每次取的都是一样的所以会重复,你的sql语句我刚试过了,确实重复

#11


该回复于2011-04-25 10:49:19被版主删除

#12


最主要的是在系统中有时候查询很慢,出现超时数据显示不出来。有时候却是挺快的。我在服务器查询分析器中执行了下一直都是2秒左右,最高也不会超过三秒。我本地也没问题。

#13


用临时表试一下

#14


把你的这个sql语句写入存储过程吧。不要拼接sql在cs上。

#15


如果是我,我就让sql语句执行尽可能简单的功能,
把判断啥的放在程序里去执行,要不然总是这样,数据库受不了啊

#16


感觉大家好像没有把握住我问的问题,我想找出问什么时快时慢

#17


好逗啊!

#18


如果查询分析器的时间稳定在2秒左右,说明数据库端没有问题,sql 语句没有问题,问题出在其他地方,比如网络连接?

#19


Lock 了吧

#20


你应该去SQL版优化一下 。。

#21


使用SQL SERVER性能监视器,计算从该条sql传入sql到返回值后的时间
也可以发现时间究竟是花在执行上,还是其他方面

#22


引用 20 楼 wxr0323 的回复:
你应该去SQL版优化一下 。。

的确
联表查条件还是substring(mo.mobile,0,8)=substring(mobi.Region,0,8)

#23


引用 12 楼 fangyanyi 的回复:
最主要的是在系统中有时候查询很慢,出现超时数据显示不出来。有时候却是挺快的。我在服务器查询分析器中执行了下一直都是2秒左右,最高也不会超过三秒。我本地也没问题。


恩,就是要检查一下网络问题。
再说你说的时快时慢。能不能具体点。不然不好判断啊

#24


慢是在某一个时间段内显示一直在查询,最后超时什么也查不出来。有时候就一点查询就直接查询出来了。但是系统中其它地方的查询都能查询出来,所以应该跟网络没有关系

#25


把它建成视图再试试。

#26


数据量比较大。。建议使用存储过程,将查询的结果 放  临时表, 在 取临时表数据加条件判断。

#27


这个不知道怎么试好。是有时候快,有时候就慢查不出来。就像上个星期五下午就查不出来,今天我在查就很快可以查出来。已经出现好几次了

#28


该存储过程吧

这样执行的效率肯定 会慢的

至于你说的时快时慢

是因为数据量的 并发处理  时多时少

#29


该回复于2011-04-25 13:48:28被版主删除

#30


有可能出现死锁的情况吗?应为在查不出来的时候感觉好像是假死的状态

#31


建设用临时表吧,这个脚本很容易出错的。数据量大的话又不查

#32


打个SP_WHO  ,看看你用的几张表是不是被其他进程锁了,锁了就会很慢

建议用临时表。表名后加上 with (nolock)

#33


看了你的SQL语句,我意识到我的sql也很菜... 一条sql语句时快时慢

#34


一条sql语句时快时慢顶一个!

#35


建议用临时表。表名后加上 with (nolock)

#36


看着这sql我就有点头大阿

#37


我也寫過自動增號的sql,用生成視圖的方法速度還可以,試一下吧

#38


监视实际执行计划,看看开销浪费在哪

#39


用存储过程试试吧  或者你把后面from的语句写成left join 语句 调用下?

#40


SELECT  *
FROM
        (SELECT top 20 *
        FROM
                (SELECT moo.linkid        ,
                        moo.mobile        ,
                        moo.matchcode     ,
                        mocontent         ,
                        motime            ,
                        moo.spcode        ,
                        moo.stat          ,
                        moo.state         ,
                        moo.company       ,
                        mt.linkid mtlinkid,
                        mtcontent         ,
                        mttime            ,
                        mt.stat mtstat    ,
                        RowNumber
                FROM
                        (SELECT linkid        ,
                                mobile        ,
                                mo.matchcode  ,
                                mocontent     ,
                                motime        ,
                                spcode        ,
                                stat          ,
                                Province state,
                                company       ,
                                ROW_NUMBER() OVER (ORDER BY id) AS RowNumber
                        FROM    t_jbxs_mo_log mo     ,
                                t_mobile_zipcode mobi,
                                t_jbxs_matchinfo matc
                        WHERE   substring(mo.mobile,0,8)=substring(mobi.Region,0,8)
                            AND matc.matchcode          =mo.matchcode
                        ) moo
                        LEFT JOIN t_jbxs_mt_log mt
                        ON      mt.linkid=moo.linkid
                ) result
        WHERE   RowNumber>(100-1)*20
        ) resultOrder
ORDER BY motime DESC


帮楼主排了下版

#41


引用 39 楼 tony312ws 的回复:
用存储过程试试吧  或者你把后面from的语句写成left join 语句 调用下?


用不用存储过程,有什么影响?

#42


RowNumber>(100-1)*20
这个是固定的值么,如果是最好大于该值,不要用表达式在计算该值。

#43


在系统中很慢,但在查询分析器中很快,这个可以参考一下:
http://www.cnblogs.com/bluedoctor/archive/2011/03/04/1970866.html