sql语句的优化多表连接以及子查询
SELECTv~vkorgk~vkburv~spartv~bzirkv~bukrsv~kunagv~vbelnv~fkdatv~fkartv~knumvv~netwrv~...
SELECT v~vkorg k~vkbur v~spart v~bzirk v~bukrs
v~kunag v~vbeln v~fkdat v~fkart
v~knumv v~netwr v~mwsbk v~gjahr
d~mrnkz
k~ernam
p~gsber p~taxm1
p~vgbel
p~vgpos
vbpa~kunnr AS kunag
kna1~name1
kna1~name2
FROM vbrk AS v
INNER JOIN vbrp AS p ON v~vbeln = p~vbeln
INNER JOIN vbfa AS a ON a~vbeln = v~vbeln
INNER JOIN vbak AS k ON k~vbeln = a~vbelv
INNER JOIN vbkd AS d ON d~vbeln = k~vbeln
INNER JOIN vbpa ON vbpa~vbeln = k~vbeln AND parvw = 'RE'
INNER JOIN kna1 ON kna1~kunnr = vbpa~kunnr
INTO CORRESPONDING FIELDS OF TABLE L_I_VBRK
WHERE v~bukrs = p_bukrs
AND p~gsber = p_gsber
AND v~bzirk IN p_bzirk
AND v~kunag IN p_kunag
AND v~vbeln IN p_vbeln
AND v~fkdat IN p_fkdat
AND k~vkbur IN p_vkbur
AND v~fksto = ''
AND k~ernam IN p_ernam
AND k~xegdr <> 'X'
AND v~taxk1 IN ('1','2')
AND v~fkart IN ('BV','F2','L2') ",'RE','G2')
AND a~vbeln <> ''
AND a~vbtyp_v IN ('C','L') ",'O','K')
AND v~vbeln NOT IN ( SELECT vbeln FROM yvbrk WHERE bukrs =
p_bukrs AND gsber = p_gsber ).
每个表的数据估计都要上万,多的要十万左右,这个查询,有没有什么好的方法可以优化下,我快崩溃了。
我也感觉是in 特别是最后的NOT IN,请问有没有具体好的解决办法呢?sql真的不太行。谢谢了。
c5net 你的这个inner join 不行,能给我完善下吗。我写 = 的话,就出现重复的数据,如果写不等于,所有的数据都查出来了。 展开
v~kunag v~vbeln v~fkdat v~fkart
v~knumv v~netwr v~mwsbk v~gjahr
d~mrnkz
k~ernam
p~gsber p~taxm1
p~vgbel
p~vgpos
vbpa~kunnr AS kunag
kna1~name1
kna1~name2
FROM vbrk AS v
INNER JOIN vbrp AS p ON v~vbeln = p~vbeln
INNER JOIN vbfa AS a ON a~vbeln = v~vbeln
INNER JOIN vbak AS k ON k~vbeln = a~vbelv
INNER JOIN vbkd AS d ON d~vbeln = k~vbeln
INNER JOIN vbpa ON vbpa~vbeln = k~vbeln AND parvw = 'RE'
INNER JOIN kna1 ON kna1~kunnr = vbpa~kunnr
INTO CORRESPONDING FIELDS OF TABLE L_I_VBRK
WHERE v~bukrs = p_bukrs
AND p~gsber = p_gsber
AND v~bzirk IN p_bzirk
AND v~kunag IN p_kunag
AND v~vbeln IN p_vbeln
AND v~fkdat IN p_fkdat
AND k~vkbur IN p_vkbur
AND v~fksto = ''
AND k~ernam IN p_ernam
AND k~xegdr <> 'X'
AND v~taxk1 IN ('1','2')
AND v~fkart IN ('BV','F2','L2') ",'RE','G2')
AND a~vbeln <> ''
AND a~vbtyp_v IN ('C','L') ",'O','K')
AND v~vbeln NOT IN ( SELECT vbeln FROM yvbrk WHERE bukrs =
p_bukrs AND gsber = p_gsber ).
每个表的数据估计都要上万,多的要十万左右,这个查询,有没有什么好的方法可以优化下,我快崩溃了。
我也感觉是in 特别是最后的NOT IN,请问有没有具体好的解决办法呢?sql真的不太行。谢谢了。
c5net 你的这个inner join 不行,能给我完善下吗。我写 = 的话,就出现重复的数据,如果写不等于,所有的数据都查出来了。 展开
5个回答
展开全部
一般情况下没错,但是最好把"="改成
"in"。
为什麽呢?因为你不能保证
(select
top
1
h.fid
from
h
where
h.time>’2012-10-29
00:00:00’
group
by
h.fid
order
by
count
(h.fid)
desc
)的结果只有一个值,举个例子:有两个帖子都回覆了10次,其他帖子都在10次以下,这时候你的这个子查询的结果是两个h.fid,也就是那两个回覆10次的(并列第一),而不是一个!
"in"。
为什麽呢?因为你不能保证
(select
top
1
h.fid
from
h
where
h.time>’2012-10-29
00:00:00’
group
by
h.fid
order
by
count
(h.fid)
desc
)的结果只有一个值,举个例子:有两个帖子都回覆了10次,其他帖子都在10次以下,这时候你的这个子查询的结果是两个h.fid,也就是那两个回覆10次的(并列第一),而不是一个!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
SQL本身没有问题,数据量也没有太夸张,全是内连接也不构成问题,真正影响执行性能的是IN和NOT IN,特别是最后的NOT IN,随着数据量增加,执行效率直线下降。优化方法就是少用IN和NOT IN。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其他地方没办法优化
最后一句改为内连接
INNER JOIN (SELECT vbeln FROM yvbrk WHERE bukrs =
p_bukrs AND gsber = p_gsber) a on v~vbeln<>a.vbeln
曾看过原来数据库语法优化说连接比not in效率高很多。所以你可以试下
最后一句改为内连接
INNER JOIN (SELECT vbeln FROM yvbrk WHERE bukrs =
p_bukrs AND gsber = p_gsber) a on v~vbeln<>a.vbeln
曾看过原来数据库语法优化说连接比not in效率高很多。所以你可以试下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
3楼正解
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建视图
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询