试图确定是否有任何优势

时间:2015-07-22 18:27:39

标签: sql oracle optimization plsql

如果我在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.在有或没有它的情况下,我得到的结果与看起来相同的时间相同。 (希望我能看到执行计划)

1 个答案:

答案 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