[英]Improve sql query performance in oracle
My existing query looks like: 我现有的查询如下所示:
SELECT p.subcode as proc_subcode,
r.subcode as rv_subcode,
r.rlv,
f.cfid,
f.geozip,
p.proc,
p.sh_descr,
f.begproc,
f.endproc,
p.descr,
r.modi,
f.per25
FROM user.code p, user.relative r, user.frequency f
WHERE f.ID = 'XOF'
AND f.GEOZIP = '200'
AND f.REL_DATE = '10-SEP-13'
AND p.proc IN ('A0021', 'A0080', 'A0090', 'A0100', 'A0110', 'A0120',
'A0130', 'A0140', 'A0160', 'A0170', 'A0180', 'A0190',
'A0200', 'A0210', 'A0225')
AND r.ID = f.ID
AND f.REL_DATE = r.REL_DATE
AND f.ID = p.ID
AND f.REL_DATE = p.REL_DATE
AND p.proc = r.proc
AND p.proc between f.begproc AND f.endproc
AND (('A0021' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0021' AND
r.PROC = 'A0021' AND f.CFID = '00') OR
('A0080' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0080' AND
r.PROC = 'A0080' AND f.CFID = '00') OR
('A0090' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0090' AND
r.PROC = 'A0090' AND f.CFID = '00') OR
('A0100' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0100' AND
r.PROC = 'A0100' AND f.CFID = '00') OR
('A0110' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0110' AND
r.PROC = 'A0110' AND f.CFID = '00') OR
('A0120' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0120' AND
r.PROC = 'A0120' AND f.CFID = '00') OR
('A0130' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0130' AND
r.PROC = 'A0130' AND f.CFID = '00') OR
('A0140' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0140' AND
r.PROC = 'A0140' AND f.CFID = '00') OR
('A0160' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0160' AND
r.PROC = 'A0160' AND f.CFID = '00') OR
('A0170' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0170' AND
r.PROC = 'A0170' AND f.CFID = '00') OR
('A0180' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0180' AND
r.PROC = 'A0180' AND f.CFID = '00') OR
('A0190' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0190' AND
r.PROC = 'A0190' AND f.CFID = '00') OR
('A0200' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0200' AND
r.PROC = 'A0200' AND f.CFID = '00') OR
('A0210' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0210' AND
r.PROC = 'A0210' AND f.CFID = '00') OR
('A0225' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0225' AND
r.PROC = 'A0225' AND f.CFID = '00'))
ORDER BY p.proc, r.modi, f.REL_DATE asc
The above query works well, however, I'm planning to add 100s of p.proc in range, for ex. 上面的查询效果很好,但是,我打算在范围内添加100个p.proc。 it would be like A0021-A1000.
就像A0021-A1000。 So, I want to improve the sql query performance.
因此,我想提高sql查询的性能。
Can anybody help? 有人可以帮忙吗?
Edit 1: 编辑1:
I suppose possible solution would be to remove IN clause for p.proc and make use of between. 我想可能的解决方案是删除p.proc的IN子句,并在之间使用它们。 I'm not sure of the last AND condition though.
我不确定最后的AND条件。
Edit 2: 编辑2:
Explanation of the query 查询说明
I'm basically getting all the medical cost for a specific region using geozip and passing the code, for ex. 我基本上是使用geozip并通过代码来获得特定区域的所有医疗费用,例如。 A0021 means surgery code & 200 means New York & 10-september-2013 is the release date and getting results for the product called XOF.
A0021表示手术代码,200表示纽约,2013年9月10日是XOF产品的发布日期和获取结果。
First of all 首先
WHERE f.ID = 'XOF'
AND f.GEOZIP = '200'
AND f.REL_DATE = '10-SEP-13'
AND p.proc IN ('A0021', 'A0080', 'A0090', 'A0100', 'A0110', 'A0120',
'A0130', 'A0140', 'A0160', 'A0170', 'A0180', 'A0190',
'A0200', 'A0210', 'A0225')
AND r.ID = f.ID
AND f.REL_DATE = r.REL_DATE
AND f.ID = p.ID
AND f.REL_DATE = p.REL_DATE
AND p.proc = r.proc
AND p.proc between f.begproc AND f.endproc
AND (('A0021' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0021' AND
r.PROC = 'A0021' AND f.CFID = '00') OR
('A0080' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0080' AND
r.PROC = 'A0080' AND f.CFID = '00') OR
('A0090' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0090' AND
r.PROC = 'A0090' AND f.CFID = '00') OR....
in your query p.proc=r.proc. 在查询中p.proc = r.proc。 So you no need to write it each time in these statements:
因此,您无需每次在以下语句中编写它:
('A0090' BETWEEN f.BEGPROC AND f.ENDPROC AND p.PROC = 'A0090' AND
r.PROC = 'A0090' AND f.CFID = '00') OR
in all these statements also f.CFID='00'. 在所有这些语句中,f.CFID = '00'。 You no need to write it in each statement.
您无需在每个语句中编写它。 Currently I think that all what you need is :
目前,我认为您需要的是:
WHERE f.ID = 'XOF'
AND f.GEOZIP = '200'
AND f.REL_DATE = '10-SEP-13'
AND p.proc IN ('A0021', 'A0080', 'A0090', 'A0100', 'A0110', 'A0120',
'A0130', 'A0140', 'A0160', 'A0170', 'A0180', 'A0190',
'A0200', 'A0210', 'A0225')
AND r.ID = f.ID
AND f.REL_DATE = r.REL_DATE
AND f.ID = p.ID
AND f.REL_DATE = p.REL_DATE
AND p.proc = r.proc
AND p.proc between f.begproc AND f.endproc
AND f.CFID='00'
these 4 statements 这4条陈述
AND p.proc IN ('A0021', 'A0080', 'A0090', 'A0100', 'A0110', 'A0120',
'A0130', 'A0140', 'A0160', 'A0170', 'A0180', 'A0190',
'A0200', 'A0210', 'A0225')
AND p.proc = r.proc
AND p.proc between f.begproc AND f.endproc
AND f.CFID='00'
make the same that all these BETWEEEN statements. 与所有这些BETWEEEN语句相同。
please check this query on your data 请检查您的数据查询
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.