首页 新闻 搜索 专区 学院

存储过程查询优化

0
悬赏园豆:100 [已关闭问题] 关闭于 2014-11-18 15:09
        select shop_no,store_no,add_no,barcode,[size],store_qty_amt,store_wgt_amt
        into #temp
        from tb
        where 
            id in (select MAX(id) from
                tb
                where datediff(day,bill_date,@datemax)>=0
                group by bill_no,size
            )

这个语句是存储过程中间的一段,有这段的话,查询时间多几十秒,tb表里面只有一万多条数据,日期过滤之后只有几千条。数据库是sql2008,操作系统win server 2008,分组字段已经加了索引。单独执行这条语句速度也快,存储过程中屏蔽这段速度也快。

sql
清海扬波的主页 清海扬波 | 小虾三级 | 园豆:852
提问于:2014-11-06 09:43
< >
分享
所有回答(7)
0

where datediff(day,bill_date,@datemax)>=0 都是这个的错。

不要where中对字段进行运算

吴瑞祥 | 园豆:28851 (高人七级) | 2014-11-06 09:46

那请问要取某个日期之前,分组之后id最大的记录怎么写呢。cte我已经使用过了,没有效果。

支持(0) 反对(0) 清海扬波 | 园豆:852 (小虾三级) | 2014-11-06 09:49
0

where datediff(day,bill_date,@datemax)>=0

可以修改为Where bill_date<=@PreviousDay and biil_Date>=@NextDay

@PreviousDay  和@NextDay可以事先计算好。

爱编程的大叔 | 园豆:30748 (高人七级) | 2014-11-06 09:58
0

简单优化点: in ,where之后的函数。

然后看了下你的存储过程,你可以尝试下用row_number加partition by 来进行查询。

幻天芒 | 园豆:36652 (高人七级) | 2014-11-06 11:41

cte试过了,还是慢。

支持(0) 反对(0) 清海扬波 | 园豆:852 (小虾三级) | 2014-11-06 12:12

@清海扬波: 这些和CTE无关,CTE对你这个基本没提升。

支持(0) 反对(0) 幻天芒 | 园豆:36652 (高人七级) | 2014-11-06 12:29

@幻天芒: cte就是用的row_number加partiton  by

支持(0) 反对(0) 清海扬波 | 园豆:852 (小虾三级) | 2014-11-06 14:52

@清海扬波: 你还是直接贴代码吧,如果你要在cte中写row_number那也没啥。

在我的理解中,你的需求用了row_number之后,根本就不会有in之后的子查询了。所以直接把性能提高了。

支持(0) 反对(0) 幻天芒 | 园豆:36652 (高人七级) | 2014-11-06 16:18

@幻天芒: 

select * from (
select *,rownum = row_number() over (partition by bill_no+size order by id desc) from tb
where bill_date>@datemax
) as t
where t.rownum = 1

类似这样是过程,这段代码应该跑不起来...可以当伪代码看~
支持(0) 反对(0) 幻天芒 | 园豆:36652 (高人七级) | 2014-11-06 16:27
0

把 子查询 改成 join

 

select a.shop_no,a.store_no,a.add_no,a.barcode,a.[size],a.store_qty_amt,a.store_wgt_amt into #temp from tb a

join (select MAX(id) id from tb where datediff(day,bill_date,@datemax)>=0 group by bill_no,size ) b on a.id=b.id

小飞虾 | 园豆:60 (初学一级) | 2014-11-06 11:45
0

换成 exec (@sqlstr) 这种形式执行一下

Yu | 园豆:12944 (专家六级) | 2014-11-06 14:11
0

select shop_no,store_no,add_no,barcode,[size],store_qty_amt,store_wgt_amt from (

select id,shop_no,store_no,add_no,barcode,[size],store_qty_amt,store_wgt_amt,max(id)over(partition by bill_no,size) as MAXid
               from tb
       where datediff(day,bill_date,@datemax)>=0) as A

where A.id=A.MAXid
           

pretty0203 | 园豆:204 (菜鸟二级) | 2014-11-06 16:26
0

这个用row_number()效率更好一些。

select shop_no,store_no,add_no,barcode,[size],store_qty_amt,store_wgt_amt 
into #temp
from ( 
select 
shop_no,store_no,add_no,barcode,[size],store_qty_amt,store_wgt_amt,row_number() over(partition  by bill_no,size order by id desc) as rId       
from tb
where datediff(day,bill_date,@datemax)>=0
) as a where rId=1
            
会飞的金鱼 | 园豆:881 (小虾三级) | 2014-11-06 17:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册