我正在使用 oracle 11g 并尝试优化查询。
查询的基本结构是:
SELECT val1, val2, val3,
FROM
table_name
WHERE
val1 in (subselect statement is here, it selects a list of possible values for
val1 from another table)
and val5>=X and val5<=Y
group by val1
order by val2 desc;
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我使用子选择时,成本是 3130。如果我手动填写子选择的结果 - 例如
field1 in (1, 2, 3, 4, 5, 6)
Run Code Online (Sandbox Code Playgroud)
其中 (1, 2, 3, 4, 5, 6) 是子查询的结果,本例中是字段 1 的所有可能值,查询的成本为 14,oracle 使用“inlist 迭代器”进行按查询的一部分进行分组。两个查询的结果是相同的。
我的问题是如何模仿使用 subselect 语句手动列出 field1 的可能值的行为。我没有在查询中列出这些值的原因是,可能的值会根据其他字段之一而变化,因此子选择会根据字段 2 从第二个表中提取字段 1 的可能值。
我有一个索引 val1,val5,所以它不执行任何全表扫描 - 它在两种情况下都会执行范围扫描,但在子选择情况下范围扫描要昂贵得多。然而,它并不是子选择查询中最昂贵的部分。最昂贵的部分是group by,它是一个HASH。 …