Oracle SELECT-有关性能的问题

时间:2019-06-25 06:17:54

标签: sql oracle performance

有一张桌子:

where user_id in (Select value from STRING_SPLIT( @user_id_list, ',')

假设我有记录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

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

2 个答案:

答案 0 :(得分: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

输出

KEY1 | FKEY1 | option | SYMBOL | SYMBOL_TO_MATCH
---: | ----: | :----- | -----: | --------------:
   1 |     5 | A      |      1 |               1
   2 |     6 | B      |      1 |               1
   3 |     7 | C      |      1 |               1

db <>提琴here

答案 1 :(得分:0)

您可以避免子查询,但是需要两次与表相同的联接

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

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