sql – 添加索引后查询的性能下降

前端之家收集整理的这篇文章主要介绍了sql – 添加索引后查询的性能下降前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个查询SP的哪一部分定期执行,查询需要一段时间才能执行,所以我决定查看它.我对查询进行了自动跟踪,并返回 this was the execution计划[由于尺寸过大而粘贴在pastebin中]

我在正在进行全表访问的表上添加了索引,并运行了查询.尽管有cost being significantly lower,但查询性能比以前更差.

为什么会这样,任何人都可以对此有所了解吗?

数据库是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;

解决方法

一些东西:

首先,如果要访问超过一半的数据块,则完全扫描会更快,因为读取索引块是另一个IO调用,因此读取索引行的时间通常是读取连续行的两倍.

其次,无论是否有索引,您都需要查看您的计划.这里将提供信息,让您知道改变了什么.如果你看到“Merge Join Cartesian”,那么规划师就会出错.那个计划永远不会好.完全扫描的内部循环具有相同的IO成本,但占用的内存和临时空间更少.

第三,你使用ANALYZE TABLE构建了统计数据.别.甚至甲骨文也表示它很糟糕而且很糟糕.使用dbms_stats包来构建统计数据,您将获得更准确的统计数据.如果它仍然是奇数,请更改样本大小,或执行完整统计而不是估计.

猜你在找的MsSQL相关文章