注册

一条sql加limit执行时间比不加长很多

我贼费解 2024/08/09 459 2

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:OpenEuler 20.03
【CPU】: kunpeng-920 aarch64 64C
【问题描述】*:
select
B.acc020 as AAZ341,
SUBSTR(B.AAE038,0,6) AS AAB301,
TO_CHAR(B.BAE036,'YYYYMMDD') AS AAE127,
A.AAC003 AS AAC003,
A.AAC004 AS AAC004,
A.AAC006 AS AAC006,
A.AAC005 AS AAC005,
A.AAC024 AS AAC024,
A.AAC011 AS AAC011,
nvl(A.AAC033,'1') AS AAC033,
'' AS ALA040,
b.AJC090 AS AJC090,
A.aAC002 AS AAC002,
a.AAC058 as aac058,
A.aAC002 AS AAC044,
nvl(A.AAB301,SUBSTR(B.AAE038,0,12)) AS AAB299,
A.AAC010 AS AAC010,
a.aab299 AS AAF016,
A.AAE006 AS AAC046,
A.ACA111 AS ACA111,
A.AAC015 AS AAC015,
'' AS ACA200,
'' AS ACA202,
'' AS ACA201,
'' AS ACA203,
A.AAC200 AS AAC200,
A.AAC014 AS AAC014,
'' AS ACA204,
'' AS ACA206,
'' AS ACA205,
'' AS ACA207,
substr(A.AAE005 || '00000000000',0,11) AS AAC067,
A.BDC101 AS AAE005,
a.AAE912 AS AAE159,
'' AS AAE461,
b.ACC303 AS ADC221,
B.ajc093 AS AJC093,
'' AS ADC220,
'' AS ACA112,
'' AS AAE815,
DECODE(b.AJC174,'1','1','2') as ADC222,
DECODE(B.AAE037,'1','1','2') AS AAE540,
'' AS AAE360,
B.AAE011 AS AAE011,
TO_CHAR(B.BAE036,'YYYYMMDD') AS AAE036,
B.AAE013 AS AAE013
FROM JY_TJ.CC02 B,JY_TJ.AC01 A
WHERE A.AAC001 = B.AAC001
AND B.aae037 in ('0','1')
and a.aae100='1'
and B.upload is null
and a.aae100='1'
and B.aae100='1'
and b.aae400 != '31'

结果查出十几条数据(表是实时更新的),耗时1.6秒
执行计划如下:
1 #NSET2: [561, 1, 1603]
2 #PRJT2: [561, 1, 1603]; exp_num(46), is_atom(FALSE)
3 #SLCT2: [561, 1, 1603]; A.AAE100 = '1'
4 #NEST LOOP INDEX JOIN2: [561, 1, 1603]
5 #HASH LEFT SEMI JOIN2: [561, 1, 583]; KEY_NUM(1); KEY(B.AAE037=DMTEMPVIEW_889419853.colname) KEY_NULL_EQU(0)
6 #SLCT2: [560, 1, 583]; (B.UPLOAD IS NULL AND B.AAE100 = '1' AND B.AAE400 <> '31')
7 #CSCN2: [560, 2397845, 583]; INDEX33561978(CC02 as B)
8 #CONST VALUE LIST: [1, 2, 48]; row_num(2), col_num(1),
9 #BLKUP2: [1, 1, 30]; INDEX33556461(A)
10 #SSEK2: [1, 1, 30]; scan_type(ASC), INDEX33556461(AC01 as A), scan_range[B.AAC001,B.AAC001]

问题:
当以上sql加上limit 1时:
select
B.acc020 as AAZ341,
SUBSTR(B.AAE038,0,6) AS AAB301,
TO_CHAR(B.BAE036,'YYYYMMDD') AS AAE127,
A.AAC003 AS AAC003,
A.AAC004 AS AAC004,
A.AAC006 AS AAC006,
A.AAC005 AS AAC005,
A.AAC024 AS AAC024,
A.AAC011 AS AAC011,
nvl(A.AAC033,'1') AS AAC033,
'' AS ALA040,
b.AJC090 AS AJC090,
A.aAC002 AS AAC002,
a.AAC058 as aac058,
A.aAC002 AS AAC044,
nvl(A.AAB301,SUBSTR(B.AAE038,0,12)) AS AAB299,
A.AAC010 AS AAC010,
a.aab299 AS AAF016,
A.AAE006 AS AAC046,
A.ACA111 AS ACA111,
A.AAC015 AS AAC015,
'' AS ACA200,
'' AS ACA202,
'' AS ACA201,
'' AS ACA203,
A.AAC200 AS AAC200,
A.AAC014 AS AAC014,
'' AS ACA204,
'' AS ACA206,
'' AS ACA205,
'' AS ACA207,
substr(A.AAE005 || '00000000000',0,11) AS AAC067,
A.BDC101 AS AAE005,
a.AAE912 AS AAE159,
'' AS AAE461,
b.ACC303 AS ADC221,
B.ajc093 AS AJC093,
'' AS ADC220,
'' AS ACA112,
'' AS AAE815,
DECODE(b.AJC174,'1','1','2') as ADC222,
DECODE(B.AAE037,'1','1','2') AS AAE540,
'' AS AAE360,
B.AAE011 AS AAE011,
TO_CHAR(B.BAE036,'YYYYMMDD') AS AAE036,
B.AAE013 AS AAE013
FROM JY_TJ.CC02 B,JY_TJ.AC01 A
WHERE A.AAC001 = B.AAC001
AND B.aae037 in ('0','1')
and a.aae100='1'
and B.upload is null
and a.aae100='1'
and B.aae100='1'
and b.aae400 != '31'
LIMIT 1

结果如期返回一条,但是执行时间长达40秒
执行计划如下:
1 #NSET2: [1, 1, 1603]
2 #PRJT2: [1, 1, 1603]; exp_num(46), is_atom(FALSE)
3 #TOPN2: [1, 1, 1603]; top_num(1)
4 #SLCT2: [1, 1, 1603]; A.AAC001 = B.AAC001
5 #NEST LOOP INNER JOIN2: [1, 1, 1603];
6 #NEST LOOP SEMI JOIN2: [561, 1, 583]; join condition(B.AAE037 = DMTEMPVIEW_889420792.colname)
7 #SLCT2: [560, 1, 583]; (B.UPLOAD IS NULL AND B.AAE100 = '1' AND B.AAE400 <> '31')
8 #CSCN2: [560, 2397845, 583]; INDEX33561978(CC02 as B)
9 #CONST VALUE LIST: [1, 2, 48]; row_num(2), col_num(1),
10 #SLCT2: [3410, 10215770, 1020]; A.AAE100 = '1'
11 #CSCN2: [3410, 10216574, 1020]; INDEX33556460(AC01 as A)

#CC02 2398146行数据
#AC01 10217763行数据

回答 0
暂无回答
扫一扫
联系客服