我的表格中有一个查询:
select a, b, c, d, e, f, g, h,
row_number () over (partition by a, b order by c, d, e, f) as order
from table;
而且它的表现有点可怕。
我们尝试创建2个索引,第一个用于按列(a和b)分区,第二个用于按列分组(c,d,e,f)。
使用解释计划,我们发现没有使用索引。尽管如此,他们还是可以通过group by子句用于其他查询。
有关如何重构查询或重新创建索引以便它们帮助提高查询性能的任何想法吗?
提前致谢
答案 0 :(得分:1)
引用我之前的答案:
查询不使用索引的两个最常见原因是:
- 快速进行全表扫描。
- 统计数据不佳。
醇>
在您的情况下,您从表格中选择了所有内容,因此我猜测是主要原因,在这种情况下您需要进行冲洗。
您可以尝试使用索引a, b, c, d, e, f
,而且我并不是说收集统计数据不会有帮助。如果您还没有建议我这样做:
begin
dbms_stats.gather_table_stats (
ownname => user,
tabname => 'MY_TABLE',
estimate_percent => 25,
method_opt => 'FOR ALL INDEXED COLUMNS',
cascade => TRUE );
end;
您的桌子还有很大程度上碎片化的可能性。如果是alter table my_table move
,则收集统计信息。