如果我在SQL Server中,我只会查看执行计划,但我无权在我的Oracle系统中执行此操作,并且在运行时看不到任何速度差异。有什么想法吗?
SELECT c_ID, c_Date
FROM Table1
WHERE CUR_IND = 'Y'
UNION
SELECT c_ID, c_Date
FROM Table1
WHERE LAST_UPDATE_DATE BETWEEN TO_DATE('2015-07-01','YYYY-MM-DD') AND TO_DATE('2015-07-20','YYYY-MM-DD')
AND c_ID NOT IN (SELECT c_ID FROM Table1 WHERE CUR_IND = 'Y')
我想我的主要问题,似乎很明显,因为Union将在此查询上运行一个独特的,第二个选择中的Sub Query是否有用?这将在第一个选择中返回大约400K记录,在第二个选择上返回大约10K,而子查询仅返回第二个2.在有或没有它的情况下,我得到的结果与看起来相同的时间相同。 (希望我能看到执行计划)
答案 0 :(得分:0)
您根本不需要UNION
。只需在您的条件之间设置一个OR
的查询(除非c_ID
- c_Date
组合不是唯一的,在这种情况下,UNION
可能会将重复的行过滤为好吧。但我怀疑这不是你的情况。):
SELECT c_ID, c_Date
FROM Table1
WHERE CUR_IND = 'Y'
OR LAST_UPDATE_DATE BETWEEN TO_DATE('2015-07-01','YYYY-MM-DD') AND TO_DATE('2015-07-20','YYYY-MM-DD')
或者......如果原始查询中的UNION
也为您执行了DISTINCT
职责,那么只需添加DISTINCT
:
SELECT DISTINCT c_ID, c_Date
FROM Table1
WHERE CUR_IND = 'Y'
OR LAST_UPDATE_DATE BETWEEN TO_DATE('2015-07-01','YYYY-MM-DD') AND TO_DATE('2015-07-20','YYYY-MM-DD')
修改强>
根据您的评论,听起来您会像这样编写一个查询(为了完整性而加入):
SELECT c_ID, c_Date
FROM (
SELECT c_ID, c_Date,
row_number() over (partition by c_ID
order by case when CUR_IND = 'Y' then 1 else 2 end) as rn
FROM Table1
WHERE CUR_IND = 'Y'
OR LAST_UPDATE_DATE BETWEEN TO_DATE('2015-07-01','YYYY-MM-DD') AND TO_DATE('2015-07-20','YYYY-MM-DD')
) WHERE rn = 1