sql - 在大型数据集上优化 Oracle SELECT

标签 sql oracle database-performance

我是 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/

相关文章:

mysql - 不使用 join 和 union 从多个表中选择

oracle - perl中如何处理模块抛出的错误

python - cursor.rowfactory (cx_oracle) 如何以字典格式返回每一行?

sql - Oracle 中向 timestamp(6) 类型字段插入数据的语法是什么

mysql - EXISTS vs IN - 哪一个在MySQL 5.5和MySQL 5.7中更好?

mysql - 想学习改进慢速mysql查询

MySQL INSERT INTO 使用带有 TIMESTAMP 的 SELECT

mysql - 将存储为行的名称值对转换为列

sql - postgresql 中的数组声明和操作

MYSQL巨大SQL文件插入| MyISAM 插入速度突然变慢(奇怪的问题)