ORACLE-如何与成本相关的索引

问题描述:

这个问题可能会很奇怪,因为我对sql的了解有限。ORACLE-如何与成本相关的索引

我想优化一个包含数百万条记录的数据库,但我似乎不知道什么时候有性能。我一直在玩SQL Developer中的'解释计划',但这些数字对我来说并不意味着很多。

举例来说,我有一个表列如下:

ID | Creation_date | End_date | Critical_date | Flag 

我跑这样看这个表的查询:

SELECT COUNT(ID) FROM TABLE 
WHERE FLAG = 1 
Creation_date < :p_d_one 
End_date > : p_d_two 
Critical_date < :p_d_three 

这给了我64的成本,使我决定添加索引。

现在我不明白的是,当我创建CREATION_DATE的指标,成本急剧下降 - >(64 - > 9)

CREATE INDEX TABLE_INDEX_CREATION_DATE ON TABLE (Creation_date desc) 

但是当我创建和索引的其他领域它不会改变(即使它们也是日期)。

任何想法,如果它仍然值得将它们纳入我的索引? 如果他们对成本没有任何影响,我还应该为其他查询创建索引吗? 是否使用数据库中的实时统计信息计算成本(基数,...)?

您可以在查询中提到的所有字段(按照该顺序flag, creation_date, end_date, critical_date, id)创建索引,以便您的查询变为仅索引,即RDBMS根本不必读取表,它可以获取所需的所有内容来自索引。

对于特定的查询,Oracle不会在给定的表上使用多个索引。拥有多个索引仅用于支持不同的查询。

+0

Thx为您的答案Erich,我可以在契据中包括我的索引中的所有字段。 对于成本没有变化的查询,你认为值得为它们创建一个新的索引(知道连接到表的许多索引也不好)? – Moufett

+0

也创建索引减慢其他进程,所以我不想避免他们,如果我可以。 – Moufett

+0

实际上,第一个索引是数据的最佳访问路径,因为它更多的索引不能提高查询性能。在DML语句中创建更多索引也会带来更多成本。 –