小编use*_*522的帖子

使用子句中的子选择列表优化 sql 查询

我正在使用 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。 …

sql oracle

3
推荐指数
1
解决办法
6279
查看次数

标签 统计

oracle ×1

sql ×1