免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2799 | 回复: 10
打印 上一主题 下一主题

请求各位大侠来探讨一下这个SQL的执行效率[已搞定] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-02 09:13 |只看该作者 |倒序浏览
抽取表的情况:
表A(400多万件)       表B(4622万件)         表C(700件)
字段                  字段                   字段
A1 CHAR -- 主键      B1 CHAR -- 主键       C1 CHAR      -- 主键
A2 CHAR -- 主键      B2 CHAR -- 主键       C2 DECIMAL -- 主键
A3 CHAR -- 主键      B3 CHAR -- 主键       C3 DECIMAL -- 主键
A4 CHAR                B4 DECIMAL             C4 CHAR
A5 CHAR                B5 DECIMAL

其中,主键的字段都建有索引。另外表B的B4,B5也建了索引。
SQL如下:
Select A.A2, A.A3, A.A4, A.A5, D.C4
From A Left Out Join
  (Select B.B2, B.B3, C.C4
    From B, C
    Where B.B1='200303'
         And C.C1=B.B1
         And B.B4<=C.C3
         And B.B5>;=C.C2
  ) AS D
  On   D.B2=A.A2
  And D.B3=A.A3
Where A.A1='200303'
    And A.A5 In ('1', '3', '9')

现在这段SQL执行一下好像要4,5个小时,请教各位大侠,能不能再优化一下呢?

论坛徽章:
0
2 [报告]
发表于 2005-04-04 16:12 |只看该作者

请求各位大侠来探讨一下这个SQL的执行效率[已搞定]

现在如果将上面的SQL改为如下的SQL,这两个SQL结果是否一样呢?哪个执行效率更高呢?

Select A.A2, A.A3, A.A4, A.A5, C.C4
From C, B Right Out Join A
  On   B.B2=A.A2
  And B.B3=A.A3
  And A.A1='200303'
  And A.A5 In ('1', '3', '9')
Where B.B1='200303'
     And C.C1=B.B1
     And B.B4<=C.C3
     And B.B5>;=C.C2

论坛徽章:
1
2015亚冠之西悉尼流浪者
日期:2015-05-18 14:38:40
3 [报告]
发表于 2005-04-04 16:32 |只看该作者

请求各位大侠来探讨一下这个SQL的执行效率[已搞定]

你试一下在来问可能好些。

论坛徽章:
0
4 [报告]
发表于 2005-04-05 15:22 |只看该作者

请求各位大侠来探讨一下这个SQL的执行效率[已搞定]

(Select B.B2, B.B3, C.C4
   From B, C
   Where B.B1='200303'
        And C.C1=B.B1
        And B.B4<=C.C3
        And B.B5>;=C.C2
) AS D
On   D.B2=A.A2

D上没有索引了。

论坛徽章:
0
5 [报告]
发表于 2005-04-06 11:55 |只看该作者

请求各位大侠来探讨一下这个SQL的执行效率[已搞定]

困扰我数天的这个问题总算搞定了。不敢藏私,写出来给大伙参考参考。
首先,第一个SQL和第二个SQL的结果是不同的。因为B表和C表有联结条件,所以在B表中不存在数据,用第一个SQL它还是会被抽取出来,而用第二个SQL它就不会被抽取出来。
其次,B表和C表联结后得到数据仍然至少有4千6百多万条,甚至更多,可能达到7,8千万条,因此按原来的SQL即第一个SQL执行,对大数据量的操作就要进行两次,而且由于B表和C表的联结条件是大于和小于,因此无法用到表的索引,子查询后和A表联结也无法用到索引,因此速度特别慢,总共花了5个半小时。
后来,将程序修改了一下,首先将C表单独抽取出来。因为C表数据少,所以直接全部抽取出来,存在内存里。然后A表和B表联结,取出所需数据。对每一条数据,去扫描内存,取得所需的C4值。(SQL如下)
由于A表和B表的联结用的都是两者的主键,查询速度相对较快,最终这样修改后的处理只花了15分钟,速度大大的提高了。

C表抽取SQL:
Select C2, C3, C4
From C
Where C1='200303';

A表和B表联结的抽取SQL:
Select A.A2, A.A3, A.A4, A.A5, B.B4, B.B5
From A Left Out Join B
  On B.B1='200303'
And B.B2=A.A2
And B.B3=A.A3
Where A.A1='200303'
   And A.A5 In ('1', '3', '9');

然后用取到的B4,B5到内存中和C2,C3比较,取得C4。

最后,再次感谢各位大侠,版主的指点。

论坛徽章:
0
6 [报告]
发表于 2005-04-07 10:14 |只看该作者

请求各位大侠来探讨一下这个SQL的执行效率[已搞定]

up

相互交流就是好!

论坛徽章:
0
7 [报告]
发表于 2005-04-07 11:01 |只看该作者

请求各位大侠来探讨一下这个SQL的执行效率[已搞定]

up,too

论坛徽章:
0
8 [报告]
发表于 2005-04-08 11:20 |只看该作者

请求各位大侠来探讨一下这个SQL的执行效率[已搞定]

d

论坛徽章:
0
9 [报告]
发表于 2005-04-08 12:56 |只看该作者

请求各位大侠来探讨一下这个SQL的执行效率[已搞定]

将A 表 和B 表 分别抽取再连接 会不会更快点?

论坛徽章:
0
10 [报告]
发表于 2005-04-11 11:28 |只看该作者

请求各位大侠来探讨一下这个SQL的执行效率[已搞定]

[quote]原帖由 "Rawu"]将A 表 和B 表 分别抽取再连接 会不会更快点?[/quote 发表:


就我这次的情况来看,应该是不会更快的,因为根据抽取的条件抽取出来的数据并不是很少,而是几乎和原来表里的数据差不多,因此速度并不会变快。如果按各自的条件抽出的数据都是很少的话,可能可以更快一点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP