首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

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

求一个查询语句的优化,谢谢各位了!
下面的这个查询语句写的不是很理想,查询六千多条数据要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

热点排行