【问题标题】:ORACLE -How are indexes related to COSTORACLE - 索引与 COST 有什么关系
【发布时间】:2017-10-12 08:11:15
【问题描述】:

这个问题可能很奇怪,因为我对 sql 的了解有限。

我正在尝试优化包含数百万条记录的数据库,但我似乎不知道何时有性能。我一直在玩 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 的 COST。所以我决定添加索引。

现在我不明白的是,当我为 Creation_date 创建索引时,成本急剧下降 -> (64 -> 9)

CREATE INDEX TABLE_INDEX_CREATION_DATE ON TABLE (Creation_date desc)

但是当我为其他字段创建和索引时,它并没有改变一点(即使它们也是日期)。

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

【问题讨论】:

    标签: sql oracle indexing


    【解决方案1】:

    您可以在查询中提到的所有字段上创建一个索引(flag, creation_date, end_date, critical_date, id 按此顺序),这样您的查询就变成了仅索引,即 RDBMS 根本不需要读取表,它可以获取它的所有内容来自索引的需求。

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

    【讨论】:

    • 谢谢你的回答 Erich,我确实可以在我的索引中包含所有字段。至于成本不变的查询,您认为是否值得为它们创建一个新索引(知道链接到一个表的许多索引也不好)?
    • 创建索引也会减慢其他进程,所以如果可以的话,我不想避免它们。
    • 实际上第一个索引是数据的最佳访问路径,因此更多的索引并不能提高查询性能。创建更多索引也会增加 DML 语句的成本。
    • @mohsen.b 覆盖索引可以让它更快一点,见use-the-index-luke.com/sql/clustering/…
    • @ErichKitzmueller:但应该检查每一个副作用。这样的索引会对其他进程产生性能副作用
    猜你喜欢
    • 1970-01-01
    • 2021-04-09
    • 2019-09-14
    • 2011-08-19
    • 2011-11-17
    • 1970-01-01
    • 2014-07-27
    • 2016-04-29
    • 2021-11-08
    相关资源
    最近更新 更多