读书人

查询语句的优化多谢各位了

发布时间: 2013-03-01 18:33:02 作者: rapoo

求一个查询语句的优化,谢谢各位了!
下面的这个查询语句写的不是很理想,查询六千多条数据要3秒多钟,想请各位帮我优化一下,谢谢了!

正所谓纸上得来终觉浅,绝知此事要躬行。just do it。你只是运气不好,遇到一个烂人写的懒程序而已。
[解决办法]
根据业务需求重整吧
not in 和子查询分组统计那里数据库比较多的情况下估计是有问题
貌似只查询了一个表,搞清楚需求,自己重整一个吧,尝试建好索引,应该能快起来
[解决办法]
引用:
引用:引用:这个SQL太好资源了,建议修改程序功能或者表结构,修改为跑批(写存储过程,建中间表)也可以。
哥,我实在不懂改程序功能或者表结构是什么意思,这能随便改吗?后半句倒是看懂了
修改程序功能其实就是修改需求了,也就是说把这个SQL查询的结果集中的一些信息去掉或者不要把这些信息一起显示……


当然修改表结构也可以把一张表分成几张表
[解决办法]
子查询嵌套的太多了
[解决办法]
1、大量的isnull证明要么滥用了,要么你的表设计或者程序端没有控制好,允许过多的null值,这个看看能否使用默认值或者强制前端传入值来避免。
2、有些嵌套部分没必要返回那么多列,如我代码里面注释了的那些部分。
3、不知道业务、不知道表结构、没有数据字典,也不清楚数据,只能改到这种程度了。如果你实在改不了,那就开始调整索引吧。
4、那些distinct如果控制好,其实基本上应该很少出现,因为本来group by就已经去除了重复,而且为什么一个查询会出现大量重复呢?大部分情况下还是设计不合理导致的。
5、纯代码的话,已经没啥好改的了,还是那句,不知道业务和表结构改不了。

SELECT  'x' AS pjlx , 
lszh ,
spdm ,
dwdm = ( CASE WHEN SUBSTRING(dwdm, 1, 3) = 'YF' THEN 'AA-23'
ELSE dwdm
END ) ,
dwmc ,
mxjls ,
xcljls ,
kcsjls ,
zhsmsj ,
zfbz = ( CASE WHEN minclbz < -1 THEN 'y'
ELSE 'n'
END ) ,
xclbz = ( CASE WHEN xcljls > 0 THEN 'y'
ELSE 'n'
END ) ,
kcsbz = ( CASE WHEN smlxs = 1
AND kcsjls > 0
AND kcsjls = xcljls THEN 'y'
ELSE 'n'
END ) ,
smlx = ( CASE WHEN smlxs = 1
AND maxsmlx IN ( '销售出库', '退货入库', '抽检出库', '销毁出库' )
THEN maxsmlx
ELSE '待定'
END )


FROM ( SELECT lszh ,
spdm ,
dwdm ,
dwmc ,
MAX(smsj) AS zhsmsj ,
MAX(ISNULL(smlx, '')) AS maxsmlx ,
MIN(ISNULL(clbz, 0)) AS minclbz ,
COUNT(*) AS mxjls ,
COUNT(CASE WHEN ISNULL(clbz, 0) IN ( 0, 1, 2 ) THEN lszh
ELSE NULL
END) AS xcljls ,
COUNT(CASE WHEN ISNULL(clbz, 0) = 2
AND ISNULL(smlx, '') IN ( '销售出库', '退货入库',
'抽检出库', '销毁出库' )
THEN lszh
ELSE NULL
END) AS kcsjls ,
COUNT(DISTINCT ( CASE WHEN ISNULL(clbz, 0) < 0 THEN NULL
ELSE ISNULL(smlx, '')
END )) AS smlxs


FROM lspy_jj_wlspy WITH ( NOLOCK )
WHERE lszh NOT IN (
SELECT lszh
FROM ( SELECT DISTINCT
lszh ,
--spdm ,
--dwdm ,
--dwmc ,
kzbz = ( CASE WHEN ISNULL(spdm, '') = ''
OR ISNULL(dwdm, '') = ''
OR ISNULL(dwmc, '') = ''
THEN 1
ELSE 0
END )
FROM lspy_jj_wlspy WITH ( NOLOCK )


WHERE ISNULL(clbz, 0) >= 0
) x
GROUP BY lszh
HAVING ( COUNT(*) > 1
OR MAX(kzbz) = 1
) )
GROUP BY lszh ,
spdm ,
dwdm ,
dwmc
HAVING MAX(smsj) < CONVERT(VARCHAR(10), GETDATE(), 126)
) y

读书人网 >SQL Server

热点推荐