【问题标题】:Performance Issue with IN operator in SQLSQL 中 IN 运算符的性能问题
【发布时间】:2021-08-21 05:44:27
【问题描述】:

如何解决 in 运算符的性能问题。

SELECT * 
FROM Q1 
WHERE Q1.sample IN (SELECT COLUMN_VALUE 
                    FROM TABLE(APEX_STRING.SPLIT(NVL(:P34_ACC,Q1.sample ),',')))

【问题讨论】:

  • Why should I "tag my RDBMS"? - 请添加标签以指定您使用的是 mysqlpostgresqlsql-serveroracle 还是 db2 - 或其他完全不同的东西。跨度>

标签: sql oracle query-optimization


【解决方案1】:

您正在使用函数在IN 子句中生成行。 Oracle 不知道这是否会导致说,一两行或五十亿行。因此它只能提出一个通用的执行计划,可能好也可能不好。

您可以使用未记录的CARDINALITY 提示向 Oracle 提示预期的行数:

SELECT *
FROM Q1 
WHERE Q1.sample IN 
(
  SELECT /*+cardinality(t, 10)*/ COLUMN_VALUE 
  FROM TABLE( APEX_STRING.SPLIT(NVL(:P34_ACC,Q1.sample ),',')) t
);

对于少数行的情况,你应该在Q1.sample上有一个索引:

CREATE INDEX idx ON q1(sample);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多