【问题标题】:Trying to determine if there is any Advantage试图确定是否有任何优势
【发布时间】:2015-10-12 19:16:05
【问题描述】:

如果我在 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')

我想我的主要问题似乎很明显,因为联合将在此查询上运行不同的,第二个选择中的子查询是否有用?这将在第一次选择时返回大约 400K 记录,在第二次选择时返回大约 10K,使用子查询,第二次只返回 2。无论有没有它,我都会在相同的时间内得到相同的结果。 (希望我能看到执行计划)

【问题讨论】:

  • 由于您在两个联合查询中选择不同的列(c_Date vs CHG_DT),我认为删除子查询并不能保证给您相同的结果。跨度>
  • @sstan 我的错误应该是一样的......正在改变

标签: sql oracle optimization plsql


【解决方案1】:

您根本不需要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')

编辑

根据您的 cmets,听起来您将编写这样的查询(为了完整性而添加):

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

【讨论】:

  • 嗯,就是这样,对于子查询,我不需要使用联合来过滤重复项,但是,如果我使用 Or 会出现重复项,如上所示。每条记录只能有 1 个 Cur_IND = 'Y' 但是,有些记录没有任何 'Y',而带有 'Y' 的记录可能有其他行是 'N' 并且在日期范围内。
  • 如果您确实需要,只需在SELECT 子句中添加DISTINCT。但我不明白在这种情况下使用UNION 是否合适。
  • 好吧,例如我可以有一个记录,ID = 1,c_Date 2015-07-05 和 Cur_Ind = Y ...但相同的 ID,可能有一个 c_Date 2015-07-15 Cur_ind = N ...所以基本上如果有 Y ...想一想,我可以使用您的查询并添加排名,以删除重复项,非常感谢您的帮助
  • 那么,您的预期结果是什么?只有Id = 1, c_date = 2015-07-05 (Cur_Ind = Y) 记录?因为对于那个特定的示例,添加或删除您的子查询会改变结果,不是吗?
  • 是的,无论如何我都想要带有 Y 的记录,每个 ID 只能有 1 个,但是对于没有 Y 的 ID,如果这些日期之间存在一条记录,我只想要一条记录
猜你喜欢
  • 2017-03-04
  • 1970-01-01
  • 2015-10-18
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 2017-03-03
相关资源
最近更新 更多