我是 Oracle 新手(正在研究 11gR2)。我有一个表 TABLE,其中有约 1000 万条记录,还有这个非常简单的查询:
SELECT t.col1, t.col2, t.col3, t.col4, t.col5, t.col6, t.col7, t.col8, t.col9, t.col10
FROM TABLE t
WHERE t.col1 = val1
AND t.col11 = val2
AND t.col12 = val3
AND t.col13 = val4
查询目前大约需要 30 秒/1 分钟。
我的问题是:如何提高性能?经过大量研究,我知道了提高性能的最经典方法,但我有一些问题:
分区:真的不能,该表已在其他项目中使用,影响太大。另外,考虑到每天在表中插入的行数,它只会延迟问题的解决。
添加索引:问题是,WHERE 子句中使用的列不是查询返回的列(除了一个)。因此,我还没有找到合适的索引。据我所知,在 12~13 列上设置索引没有多大意义(或者确实如此?)。
物化 View :我必须说我从未使用过它们,但我知道维护成本相当高,而且我的表更新得非常频繁。
我认为最好的方法是添加适当的索引,但我找不到应该创建索引的正确列。
最佳答案
只要您的查询结果只占所有行的一小部分,索引就有意义。您可以在 WHERE 子句中使用的所有四列上创建一个索引。
如果匹配的记录太多,则会进行全表扫描。您可以通过使用 PARALLEL 提示在并行线程中完成此操作来加快速度:
SELECT /*+parallel(t,4)*/
t.col1, t.col2, t.col3, t.col4, t.col5, t.col6, t.col7, t.col8, t.col9, t.col10
FROM TABLE t
WHERE t.col1 = val1 AND t.col11 = val2 AND t.col12 = val3 AND t.col13 = val4;
关于sql - 在大型数据集上优化 Oracle SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26510333/