【问题标题】:Oracle SELECT - question about performanceOracle SELECT - 关于性能的问题
【发布时间】:2019-06-25 06:17:54
【问题描述】:

有一张桌子:

key1, fkey1, option, symbol
1     5      'A'     1
2     6      'B'     1
3     7      'C'     1
4     8      'D'     2

假设我有记录 key1=2 的数据。这一行有一个symbol = 1,所以我的目标是获取所有行(尤其是fkey1 列的值),其中symbol = 1(此处所需的输出:fkey = 5,6,7)。

问题:这可以在一个select 查询中完成,并且只查询该表一次(!)吗?不像:

SELECT fkey1 from table where symbol = (select symbol from table where key = 2)

我正在寻找一种方法来最大限度地优化它。这个表实际上有更多的列,而 PK/FK 由很少的列组成。

【问题讨论】:

  • 我认为你的做法是最快的。子选择(select symbol from table where key = 2) 使用唯一索引扫描完成,只得到一个结果,然后外部选择使用普通索引扫描完成。只需确保您有合适的索引 - “symbol,fkey1,...”上应该有一个以优化性能。

标签: sql oracle performance


【解决方案1】:

是的,您只需一个查询就可以做到这一点,而无需自联接。对整个表使用解析函数来查找匹配符号:

Oracle 设置

CREATE TABLE table_name ( key1, fkey1, "option", symbol ) AS
SELECT 1, 5, 'A', 1 FROM DUAL UNION ALL
SELECT 2, 6, 'B', 1 FROM DUAL UNION ALL
SELECT 3, 7, 'C', 1 FROM DUAL UNION ALL
SELECT 4, 8, 'D', 2 FROM DUAL;

查询

SELECT *
FROM   (
  SELECT t.*,
         MAX( CASE key1 WHEN 2 THEN symbol END ) OVER () AS symbol_to_match
  FROM   table_name t
)
WHERE  symbol = symbol_to_match

输出

键1 | FKEY1 |选项 |符号 | SYMBOL_TO_MATCH ---: | ----: | :----- | -----: | --------------: 1 | 5 |一个 | 1 | 1 2 | 6 |乙| 1 | 1 3 | 7 | C | 1 | 1

db小提琴here

【讨论】:

    【解决方案2】:

    您可以避免子查询,但需要两次连接同一张表

    select  a.fkey1 
    from table a 
    inner join table b  on a.symbol = b.symbol  and b.fkey1 = 2 
    

    在符号上使用适当的索引或在 symbole 和 fkey1 上使用复合索引,性能应该很好

    【讨论】:

      猜你喜欢
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多