首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 一个select语句优化 [已结帖,结帖人:xinxin1982]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xinxin1982
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-24 06:16:16 楼主
    先说明,没有数据库更改,建立等权限,只能查询
    通过C#产生语句,然后查询,返回
    经过验证,确实是sql运行语句过慢,请教各位,如何写可以更快些..谢谢~~分不够可以继续给~

    下面的查询语句为1个单位的查询,基本测试,4个单位耗时4秒,14个单位34秒,24个单位分别107和95秒.内部情况不太一样,66个单位18分钟7秒.C#和sqlplus中get sql的效率一样..
    多个单位的语句我是在#中一个单位查询语句生成好后union另一个,直到最后一个,语句无错误

    下面为1个单位的语句,都用的代称,架构各位大大看懂后帮忙改改,说说,可接受时间内就好,结果 <5秒可以多多给分~~
    SQL code
    select b.*,ROUND(EE*FF,2) as GG,ROUND(HH/II,2) as JJ,ROUND(EE/II,2) as KK,ROUND(EE/II*FF,2) as LL,ROUND(NN/EE,2) as MM,ROUND(((NN/EE*0.0026+1.185)*EE+OO),2) as PP,ROUND(b.RR/((NN/EE*0.0026+1.185)*EE+OO),2) as SS FROM ( select AA, BB, ABCDE, DD, DDCX,substr(AA,5,2) as AF, ( select MIN(hehe) from ( select count(AA) OVER(order by AA) as hehe FROM ( select * from 表1 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" ) ) ) as UU, ( select MIN(hehe) from ( select SUM(VV) OVER(order by AA) as hehe FROM ( SELECT AA, BB, ABCDE, DD, DDCX, -1 as ABC, ABCD, ABCDE, ABCDEF, BAC, BBA,BBC, BBD, BBE, BBF, BBG, CCA, CMD, VV, EE, OO,NN, CCV, CCC, RCQL,CCD, CCE, CCF,CCG, LJABCDEFL,CCH, LVV, DDA FROM 表1 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" union SELECT AA, BB, ABCDE, DD, DDCX, ABC, -1 as ABCD, -1 as ABCDE, -1 as ABCDEF, -1 as BAC, -1 as BBA,BBC, BBD, BBE, BBF, BBG,-1 as CCA, -1 as CMD, VV, EE, OO, NN, CCV, CCC, RCQL, CCD,CCE,CCF,CCG, LJABCDEFL, CCH, LVV, DDA FROM 表2 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" ) ) ) as VV, ( select MIN(hehe) from ( select count(AA) OVER(order by AA) as hehe FROM ( select * from 表3 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" ) ) ) as WW, ( select to_char(last_day(to_date(AA,'BBCBBCmm')),'dd') from ( select * from 表3 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" ) ) as II, ( select MIN(hehe) from ( select SUM(EE+OO) OVER(order by AA) as hehe FROM ( SELECT AA, BB, ABCDE, DD, DDCX, -1 as ABC, ABCD, ABCDE, ABCDEF, BAC, BBA,BBC, BBD, BBE, BBF, BBG, CCA, CMD, VV, EE, OO,NN, CCV, CCC, RCQL,CCD, CCE, CCF,CCG, LJABCDEFL,CCH, LVV, DDA FROM 表1 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" union SELECT AA, BB, ABCDE, DD, DDCX, ABC, -1 as ABCD, -1 as ABCDE, -1 as ABCDEF, -1 as BAC, -1 as BBA,BBC, BBD, BBE, BBF, BBG,-1 as CCA, -1 as CMD, VV, EE, OO, NN, CCV, CCC, RCQL, CCD,CCE,CCF,CCG, LJABCDEFL, CCH, LVV, DDA FROM 表2 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" ) ) ) as HH, ( select MIN(hehe) from ( select SUM(EE) OVER(order by AA) as hehe FROM ( SELECT AA, BB, ABCDE, DD, DDCX, -1 as ABC, ABCD, ABCDE, ABCDEF, BAC, BBA,BBC, BBD, BBE, BBF, BBG, CCA, CMD, VV, EE, OO,NN, CCV, CCC, RCQL,CCD, CCE, CCF,CCG, LJABCDEFL,CCH, LVV, DDA FROM 表1 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" union SELECT AA, BB, ABCDE, DD, DDCX, ABC, -1 as ABCD, -1 as ABCDE, -1 as ABCDEF, -1 as BAC, -1 as BBA,BBC, BBD, BBE, BBF, BBG,-1 as CCA, -1 as CMD, VV, EE, OO, NN, CCV, CCC, RCQL, CCD,CCE,CCF,CCG, LJABCDEFL, CCH, LVV, DDA FROM 表2 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" ) ) ) as EE, ( select MIN(hehe) from ( select SUM(OO) OVER(order by AA) as hehe FROM ( SELECT AA, BB, ABCDE, DD, DDCX, -1 as ABC, ABCD, ABCDE, ABCDEF, BAC, BBA,BBC, BBD, BBE, BBF, BBG, CCA, CMD, VV, EE, OO,NN, CCV, CCC, RCQL,CCD, CCE, CCF,CCG, LJABCDEFL,CCH, LVV, DDA FROM 表1 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" union SELECT AA, BB, ABCDE, DD, DDCX, ABC, -1 as ABCD, -1 as ABCDE, -1 as ABCDEF, -1 as BAC, -1 as BBA,BBC, BBD, BBE, BBF, BBG,-1 as CCA, -1 as CMD, VV, EE, OO, NN, CCV, CCC, RCQL, CCD,CCE,CCF,CCG, LJABCDEFL, CCH, LVV, DDA FROM 表2 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" ) ) ) as OO, ( select to_number(GGSC) as hehe from (select * from 表4 WHERE AA='" + TT + "' and ABCDE='" + QQ + @"') ) as FF,PJRZ, ( select ROUND(MIN(hehe),2) from ( select AVG(CCD) OVER(order by AA) as hehe FROM ( SELECT AA, BB, ABCDE, DD, DDCX, -1 as ABC, ABCD, ABCDE, ABCDEF, BAC, BBA,BBC, BBD, BBE, BBF, BBG, CCA, CMD, VV, EE, OO,NN, CCV, CCC, RCQL,CCD, CCE, CCF,CCG, LJABCDEFL,CCH, LVV, DDA FROM 表1 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" union SELECT AA, BB, ABCDE, DD, DDCX, ABC, -1 as ABCD, -1 as ABCDE, -1 as ABCDEF, -1 as BAC, -1 as BBA,BBC, BBD, BBE, BBF, BBG,-1 as CCA, -1 as CMD, VV, EE, OO, NN, CCV, CCC, RCQL, CCD,CCE,CCF,CCG, LJABCDEFL, CCH, LVV, DDA FROM 表2 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" ) ) ) as CCD, ( select ROUND(MIN(hehe),2) from ( select AVG(CMD) OVER(order by AA) as hehe FROM ( SELECT AA, BB, ABCDE, DD, DDCX, -1 as ABC, ABCD, ABCDE, ABCDEF, BAC, BBA,BBC, BBD, BBE, BBF, BBG, CCA, CMD, VV, EE, OO,NN, CCV, CCC, RCQL,CCD, CCE, CCF,CCG, LJABCDEFL,CCH, LVV, DDA FROM 表1 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" ) ) ) as CMD,RR, ( select MIN(hehe) from ( select SUM(OO) OVER(order by AA) as hehe FROM ( SELECT AA, BB, ABCDE, DD, DDCX, -1 as ABC, ABCD, ABCDE, ABCDEF, BAC, BBA,BBC, BBD, BBE, BBF, BBG, CCA, CMD, VV, EE, OO,NN, CCV, CCC, RCQL,CCD, CCE, CCF,CCG, LJABCDEFL,CCH, LVV, DDA FROM 表1 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" union SELECT AA, BB, ABCDE, DD, DDCX, ABC, -1 as ABCD, -1 as ABCDE, -1 as ABCDEF, -1 as BAC, -1 as BBA,BBC, BBD, BBE, BBF, BBG,-1 as CCA, -1 as CMD, VV, EE, OO, NN, CCV, CCC, RCQL, CCD,CCE,CCF,CCG, LJABCDEFL, CCH, LVV, DDA FROM 表2 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" ) ) ) as NN from 表3 WHERE AA='" + TT + "' and ABCDE='" + QQ + "' and DD<>concat(DDCX,'.1') and DD<>concat(DDCX,'.2') and " + oracle_temp + @" ) b
    200  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xinxin1982
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 06:22:581楼 得分:0
    基本思想为按照表3的AA顺序,顺序往下走,
    然后通过别的表虚拟很多列出来, [第一次]
    再通过虚拟出来的列继续虚拟计算出来的列 [第二次]

    [第一次]虚拟:
    select部分:
    表1单独2次
    表1,表2 union 6次 (可以简化么),一次select,多次as ....
    表3 2次
    表 4 1次

    我也想建立自己的view,貌似就会简单很多...

    select count()之前还有select min()是为了取一个值出来就好,select count()出来的是好多个一样的值,看说min速度快..

    基本情况如此...
    天快亮了...没说清楚的...明天看回帖补充吧...不好意思..有点迷糊了...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xinxin1982
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 06:26:372楼 得分:0
    ps:....66个单位union起来...那个sql文件...额....537K....汗..这次真是超级大菜鸟了...(*^__^*) 嘻嘻……....
    ps2:oracle的缓冲蛮厉害的...同样的查询..第一次18分钟...第二次.. <30秒...好玩~~
    ps3:睡觉了.....拜托~~~~

    xinxin1982(新新)
    总有可用分:9371 已花费可用分:1896 剩余可用分:7475
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bw555
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 07:56:383楼 得分:0
    太长了,可以考虑建个过程,把其中的一些查询先查处来,发现你好多子查询都是返回的一个数,可以试一下
    自然连接次数太多了,不慢才怪
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wangydong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 09:49:024楼 得分:0
    看的有点头大。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cosio
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 16:30:025楼 得分:0
    建议,这种题目不要把SQL拷出来给我们看,只要给一些实例;
    提供数据:
    ***********
    结果数据:
    ***********

    你给的那些表,别人不知道要如果看?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dobetterthatnthink
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 17:28:206楼 得分:0
    过程中处理,效率不错,条例也清晰,不要那样去union,百分百是 及其慢的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xinxin1982
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 17:48:367楼 得分:0
    希望各位大大帮忙大概写写。。。加分先。。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oracledbalgtu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 3

    发表于:2008-08-24 18:08:038楼 得分:0
    列出红色内容什么意思啊?

    引用 2 楼 xinxin1982 的回复:
    ps:....66个单位union起来...那个sql文件...额....537K....汗..这次真是超级大菜鸟了...(*^__^*) 嘻嘻……....
    ps2:oracle的缓冲蛮厉害的...同样的查询..第一次18分钟...第二次.. <30秒...好玩~~
    ps3:睡觉了.....拜托~~~~

    xinxin1982(新新)
    总有可用分:9371 已花费可用分:1896 剩余可用分:7475

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oracledbalgtu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 3

    发表于:2008-08-24 18:10:129楼 得分:0
    感觉你的代码有些问题:
                    SELECT TO_CHAR(LAST_DAY(TO_DATE(AA, 'BBCBBCmm')), 'dd')
                      FROM tt3) AS II,
                  (SELECT TO_NUMBER(GGSC) AS HEHE
                      FROM (SELECT *
                              FROM 表4
                            WHERE AA = '" + TT + "'
                              AND ABCDE = '" + QQ + @"')) AS FF,
    这块代码如果返回记录数大于1条,就会报错。
    是不是写错了。

    引用 7 楼 xinxin1982 的回复:
    希望各位大大帮忙大概写写。。。加分先。。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xinxin1982
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 18:27:1010楼 得分:0
    不到一天不能加分。。。只希望多给分,各位多多帮忙。。。。等能加分了一定加分

    表4比较特殊,where后面的确保只有1个值,这样子的,无重复,呵呵,谢谢楼上的。。

    刚去搜索了一下过程方面的东西,现在在外面,没办法调试。。。ing....回去了看看,怎么调用和完善,哪个大大写个简单的类似例子就好。。。
    我把重复的select写成过程?还是把上面的所有代码(一个单位的)的写成过程?大概如何架构和调用呢?简单的例子就好。。不用很详细。。。谢谢。。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xinxin1982
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 18:28:5711楼 得分:0
    另外。。写成过程后,可以在C#中循环产生语句,然后一次性返回结果么?
    还是把参数交给oracle去循环,产生结果,一次性返回?

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oracledbalgtu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 3

    发表于:2008-08-24 18:37:5812楼 得分:0
    这个可不只一个记录吧:
    (SELECT TO_CHAR(LAST_DAY(TO_DATE(AA, 'BBCBBCmm')), 'dd')
                      FROM tt3) AS II
    一样还会出错啊。

    引用 10 楼 xinxin1982 的回复:
    不到一天不能加分。。。只希望多给分,各位多多帮忙。。。。等能加分了一定加分

    表4比较特殊,where后面的确保只有1个值,这样子的,无重复,呵呵,谢谢楼上的。。

    刚去搜索了一下过程方面的东西,现在在外面,没办法调试。。。ing....回去了看看,怎么调用和完善,哪个大大写个简单的类似例子就好。。。
    我把重复的select写成过程?还是把上面的所有代码(一个单位的)的写成过程?大概如何架构和调用呢?简单的例子就…
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xinxin1982
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 09:50:0213楼 得分:0
    楼上滴........这个....那个.....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xinxin1982
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 09:51:0014楼 得分:0
    加分成功,大家帮帮忙哦~~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信