Sql 在Oracle11g中优化查询时需要帮助吗
我正在修改原来的问题,因为几乎没有条件改变- 我正在Oracle11g上运行以下查询&显示结果需要27秒。是否有人能提出改进查询响应时间的解决方案?我在下面提供相关细节-Sql 在Oracle11g中优化查询时需要帮助吗,sql,oracle11g,Sql,Oracle11g,我正在修改原来的问题,因为几乎没有条件改变- 我正在Oracle11g上运行以下查询&显示结果需要27秒。是否有人能提出改进查询响应时间的解决方案?我在下面提供相关细节- select Column1 , round(count(Column2)/10) from SE_CA where Column3 <= 4855 and Column4 > 4490 group by Column1; SE_CA table has total 123914265 records.
select Column1 , round(count(Column2)/10)
from SE_CA
where Column3 <= 4855
and Column4 > 4490
group by Column1;
SE_CA table has total 123914265 records.
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3324421310
-------------------------------------------------
| Id | Operation | Name | Cost (%CPU)|
-------------------------------------------------
| 0 | SELECT STATEMENT | | 211K (3)|
| 1 | HASH GROUP BY | | 211K (3)|
|* 2 | TABLE ACCESS FULL| SE_CA | 208K (1)|
-------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------
2 - filter("Column3"<=4855 AND "Column4">4490)
SQL> desc SE_CA;
Name Null? Type
Column1 VARCHAR2(3)
Column2 NUMBER
Column3 NUMBER
Column4 NUMBER
Column5 NUMBER
Column6 NUMBER
Column7 NUMBER
Column8 NUMBER
Column9 VARCHAR2(5)
Column10 VARCHAR2(12)
Index Definition -
CREATE INDEX IDX1_SE_CA ON SE_CA(Column3);
CREATE INDEX IDX2_SE_CA ON SE_CA(Column4);
CREATE INDEX IDX4_SE_CA ON SE_CA(Column1);
在这两种情况下,预期输出约为
整个表包含10581643行。
单独应用每个条件后,第3列的输出为
10581643,第4列为12391426。
第3列的最小值和最大值分别为4623和4988。
而第4列的最小值和最大值分别为4624和4991。分别地
您能告诉我创建的索引是否正确,或者我需要不同的索引吗?了解是否可以提高此查询的性能的关键是了解数据的一些基本统计信息 在max,min上有谓词的两列的值的范围是多少? 您希望有多少行分别满足每个条件? 您希望有多少行同时满足这两个条件? 如果谓词列34490将包含表中90%的行-仅基于此,优化者可能会得出结论,当两个谓词都存在时,要检索的行的比例为0.3*0.9=27%。这仍然表明完全扫描是合适的 但是,这两个值之间可能存在相关性,因此column1的低值很少有column2的高值,并且只有3%的行满足该条件。在这种情况下,可能值得尝试使用基于索引的访问方法 优化器动态采样可以通过包含优化器提示来检测这种情况:
select /*+ dynamic_sampling(SE_CA 4) */ Column1 , ...
因此,获得关于值分布的问题的答案,并尝试动态采样——这个查询看起来是一个很好的候选查询,因为我认为暴露时间和感染时间之间存在相关性
进一步的
由于您希望从表中检索大约10%的行,因此基于索引的访问表的方法不太可能有帮助。即使是索引范围扫描也可能不如优化人员选择的索引快速全扫描有效。这取决于i/o子系统的效率以及单块和多块i/o的相对速度。您能否确保段空间以至少1MB的单位自动分配或统一分配
但是,如果您有可用的分区选项,您可以在公开时间对该表进行分区,以便允许更有效的分区修剪扫描来选择表行的子集。不过,这是一个很大的改变,而且在考虑对其他手术的副作用时必须非常小心
您还可以考虑使用较低程度的查询并行性,尽管这同样会对段级检查点产生副作用,这可能会对表产生负面影响,因为此时表会发生很多更改。谢谢David。我按照您的建议尝试了动态采样,但没有提高响应时间。让我向您提供一些您要求的更多信息—在应用这两个条件的情况下,预期输出约占整个表行10581643行的10%。单独应用每个条件时,输出分别针对第3列-10581643和第4列-12391426。第3列的最小值和最大值分别为4623和4988。而第4列的最小值和最大值分别为4624和4991。分别地您能告诉我创建的复合索引是否正确,或者我需要不同的索引吗?整个表大约有1亿行?您使用的是Oracle的哪个版本和版本,您有哪些许可选项(如果有的话)?Oracle Database 11g Enterprise edition 11.2.0.3.0-64位生产版,带有分区、OLAP、数据挖掘和实际应用程序测试选项,您实际支付的是企业和分区选项,或者它们是刚刚安装的?我不是数据库服务器的所有者,因此很遗憾,我无法获得此信息。