添加索引后查询性能下降

Sat*_*hat 5 sql performance oracle10g

我有一个查询是定期执行的 SP 的哪一部分,该查询需要一段时间才能执行,所以我决定看一看。我对查询进行了自动跟踪,这是返回的执行计划 [由于尺寸过大而粘贴到 pastebin 中]

我在进行全表访问的表上添加了索引,并运行了查询。尽管成本显着降低,但查询性能比以前更差。

为什么会这样,任何人都可以解释一下吗?

该数据库是 Oracle 10gR2(版本 10.2.0.1.0)。

这是正在运行的查询

SELECT DISTINCT CAC_FLEX_03, CAC_FLEX_04
        FROM PCOM_CUST_PRACTICE_INFO A,
             PGIM_ZIP_CODES          C,
             PGIM_PROD_TARIFF_DATA   B,
             PCOM_CODES_APPL_CODES   D
       WHERE A.PCPI_CUST_CODE IN ('002023', '002025')
         AND C.ZC_ZIP_CODE = A.PCPI_PIN_CODE
         AND C.ZC_CITY_CODE = A.PCPI_CITY
         AND C.ZC_COUNTY_CODE = A.PCPI_COUNTY
         AND C.ZC_STATE_CODE = A.PCPI_STATE
         AND B.PTD_CVR_CODE = 'TF-001'
         AND B.PTD_VALUE_SET2 = A.PCPI_STATE
         AND B.PTD_VALUE_SET4 = A.PCPI_COUNTY
         AND B.PTD_VALUE_SET5 = D.CAC_FLEX_03
         AND D.CAC_FLEX_04 IS NOT NULL
         AND ZC_STATE_CODE =
             (SELECT POL_FLEX_04
                FROM PGIT_POLICY
               WHERE POL_SYS_ID = 541332)
         AND B.PTD_VALUE_SET3 =
             (SELECT POL_FLEX_01
                FROM PGIT_POLICY
               WHERE POL_SYS_ID = 541332)
         AND CAC_TYPE = 'TERR-CODE'
         AND CAC_FLEX_03 = 0;
Run Code Online (Sandbox Code Playgroud)

Gra*_*son 4

一些东西:

首先,如果您要访问一半以上的数据块,全扫描会更快,因为读取索引块是另一个 IO 调用,因此读取索引行的时间成本通常是读取连续行的两倍。

其次,您需要查看有或没有索引的计划。这里会有一些信息让您知道发生了什么变化。如果您看到“合并连接笛卡尔”,则规划器犯了错误。这个计划永远都不好。全扫描的内部循环具有相同的 IO 成本,但占用更少的内存和临时空间。

第三,您使用 ANALYZE TABLE 构建了统计数据。不。甚至甲骨文也说它很糟糕并且损坏了。使用 dbms_stats 包构建您的统计数据,您将获得更准确的统计数据。如果仍然奇怪,请更改样本大小,或进行完整统计而不是估计。