【问题标题】:Oracle query optimization using dynamic dates使用动态日期优化 Oracle 查询
【发布时间】:2010-09-20 17:53:07
【问题描述】:

如果我这样选择,我有一个视图:

select * from view where date = '17-sep-10'

它会在几秒钟内返回。

如果我使用动态日期:

select * 
  from view 
 where date = to_date((select current_business_date 
                         from v_business_day), 
                      'mm/dd/yyyy')

20 分钟后返回。

为什么硬编码会大大提高性能?此外, to_date 中的选择不是问题(我认为)。它在运行时几乎立即返回。

这是视图的描述:

JAID_OWNER@algoja1p> desc v_positions_rm_base
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
 RUN_KEY                                   NOT NULL NUMBER(10)
 POSITION_KEY                              NOT NULL NUMBER(10)
 POSITIONS                                          VARCHAR2(50)
 INSTRUMENT_ID                                      VARCHAR2(151)
 BUSINESS_DATE                             NOT NULL DATE
 PROCESSING_DATE                                    DATE
 PROCESSING_STATUS_KEY                     NOT NULL NUMBER(10)

这是我对日期进行硬编码时的解释计划。我将查询更改为对硬编码值执行 to_date,因此它是一致的..

explain plan for select * from v_positions_rm_base where business_date = to_date('09/17/2010', 'mm/dd/yyyy')
-----------------------------------------------------------------------------------------------------------------------------       
| Id  | Operation                                    | Name                         | Rows  | Bytes | Cost (%CPU)| Time     |       
-----------------------------------------------------------------------------------------------------------------------------       
|   0 | SELECT STATEMENT                             |                              |   518 |  1003K|  1679   (2)| 00:00:21 |       
|*  1 |  FILTER                                      |                              |       |       |            |          |       
|*  2 |   FILTER                                     |                              |       |       |            |          |       
|*  3 |    HASH JOIN RIGHT OUTER                     |                              | 10360 |    19M|  1651   (2)| 00:00:20 |       
|   4 |     INDEX FAST FULL SCAN                     | RM_SRC_ACCT_UDX              |   601 |  7212 |     2   (0)| 00:00:01 |       
|   5 |     VIEW                                     |                              | 10360 |    19M|  1648   (2)| 00:00:20 |       
|*  6 |      HASH JOIN RIGHT OUTER                   |                              | 10360 |    20M|  1648   (2)| 00:00:20 |       
|   7 |       VIEW                                   | V_RM_FUTURES_CODE_TRANS_FLAT |     1 |    96 |     9  (12)| 00:00:01 |       
|   8 |        HASH GROUP BY                         |                              |     1 |    51 |     9  (12)| 00:00:01 |       
|   9 |         TABLE ACCESS BY INDEX ROWID          | CODE_TRANSLATION             |     3 |   153 |     8   (0)| 00:00:01 |       
|* 10 |          INDEX RANGE SCAN                    | CODE_TRANSLATION_IDX3        |     3 |       |     7   (0)| 00:00:01 |       
|* 11 |       HASH JOIN RIGHT OUTER                  |                              | 10360 |    19M|  1638   (2)| 00:00:20 |       
|  12 |        VIEW                                  | V_RM_FUTURES_CODE_TRANS_FLAT |     1 |    96 |     9  (12)| 00:00:01 |       
|  13 |         HASH GROUP BY                        |                              |     1 |    51 |     9  (12)| 00:00:01 |       
|  14 |          TABLE ACCESS BY INDEX ROWID         | CODE_TRANSLATION             |     3 |   153 |     8   (0)| 00:00:01 |       
|* 15 |           INDEX RANGE SCAN                   | CODE_TRANSLATION_IDX3        |     3 |       |     7   (0)| 00:00:01 |       
|* 16 |        HASH JOIN RIGHT OUTER                 |                              | 10360 |    18M|  1629   (2)| 00:00:20 |       
|  17 |         VIEW                                 | V_RM_FUTURES_CODE_TRANS_FLAT |   404 | 42420 |    12   (9)| 00:00:01 |       
|  18 |          HASH GROUP BY                       |                              |   404 | 20604 |    12   (9)| 00:00:01 |       
|  19 |           TABLE ACCESS BY INDEX ROWID        | CODE_TRANSLATION             |   404 | 20604 |    11   (0)| 00:00:01 |       
|* 20 |            INDEX RANGE SCAN                  | CODE_TRANS_TYPE_IDX          |   404 |       |     3   (0)| 00:00:01 |       
|* 21 |         HASH JOIN RIGHT OUTER                |                              | 10360 |    17M|  1616   (2)| 00:00:20 |       
|  22 |          VIEW                                | V_RM_FUTURES_CODE_TRANS_FLAT |   404 | 42420 |    12   (9)| 00:00:01 |       
|  23 |           HASH GROUP BY                      |                              |   404 | 20604 |    12   (9)| 00:00:01 |       
|  24 |            TABLE ACCESS BY INDEX ROWID       | CODE_TRANSLATION             |   404 | 20604 |    11   (0)| 00:00:01 |       
|* 25 |             INDEX RANGE SCAN                 | CODE_TRANS_TYPE_IDX          |   404 |       |     3   (0)| 00:00:01 |       
|* 26 |          HASH JOIN RIGHT OUTER               |                              | 10360 |    16M|  1603   (2)| 00:00:20 |       
|  27 |           TABLE ACCESS FULL                  | SOURCE_SYSTEM                |    68 |   748 |     3   (0)| 00:00:01 |       
|* 28 |           HASH JOIN RIGHT OUTER              |                              | 10360 |    16M|  1599   (2)| 00:00:20 |       
|  29 |            TABLE ACCESS BY INDEX ROWID       | CODE_TRANSLATION             |     1 |    51 |     2   (0)| 00:00:01 |       
|* 30 |             INDEX RANGE SCAN                 | CODE_TRANS_TYPE_IDX          |     1 |       |     1   (0)| 00:00:01 |       
|  31 |            VIEW                              |                              | 10360 |    16M|  1597   (2)| 00:00:20 |       
|* 32 |             HASH JOIN RIGHT OUTER            |                              | 10360 |  7527K|  1597   (2)| 00:00:20 |       
|  33 |              TABLE ACCESS BY INDEX ROWID     | PARAMETER_CONTROL            |     1 |    38 |     2   (0)| 00:00:01 |       
|* 34 |               INDEX RANGE SCAN               | PARAMETER_CONTROL_IDX3       |     1 |       |     1   (0)| 00:00:01 |       
|* 35 |              HASH JOIN RIGHT OUTER           |                              | 10360 |  7142K|  1594   (2)| 00:00:20 |       
|  36 |               VIEW                           | V_ENTITY_FLAT                |  1742 |   282K|    35   (9)| 00:00:01 |       
|* 37 |                HASH JOIN RIGHT OUTER         |                              |  1742 |   229K|    35   (9)| 00:00:01 |       
|  38 |                 INDEX FAST FULL SCAN         | ENTITY_IDX_5                 |  1742 | 40066 |     6   (0)| 00:00:01 |       
|* 39 |                 HASH JOIN RIGHT OUTER        |                              |  1742 |   190K|    28   (8)| 00:00:01 |       
|  40 |                  INDEX FAST FULL SCAN        | ENTITY_IDX_5                 |  1742 | 47034 |     6   (0)| 00:00:01 |       
|* 41 |                  HASH JOIN RIGHT OUTER       |                              |  1742 |   144K|    21   (5)| 00:00:01 |       
|  42 |                   INDEX FAST FULL SCAN       | ENTITY_IDX_5                 |  1742 | 47034 |     6   (0)| 00:00:01 |       
|* 43 |                   HASH JOIN RIGHT OUTER      |                              |  1742 |    98K|    15   (7)| 00:00:01 |       
|  44 |                    INDEX FAST FULL SCAN      | ENTITY_IDX_5                 |  1742 | 47034 |     6   (0)| 00:00:01 |       
|  45 |                    TABLE ACCESS FULL         | ENTITY                       |  1742 | 54002 |     8   (0)| 00:00:01 |       
|* 46 |               HASH JOIN RIGHT OUTER          |                              |  2432 |  1282K|  1559   (1)| 00:00:19 |       
|  47 |                TABLE ACCESS FULL             | INSTRUMENT_ID_TYPE           |     8 |    88 |     3   (0)| 00:00:01 |       
|* 48 |                HASH JOIN RIGHT OUTER         |                              |  2432 |  1256K|  1555   (1)| 00:00:19 |       
|  49 |                 TABLE ACCESS BY INDEX ROWID  | PROCESSING_STATUS            |     1 |    76 |     1   (0)| 00:00:01 |       
|* 50 |                  INDEX UNIQUE SCAN           | PROCESSING_STATUS_PK         |     1 |       |     0   (0)| 00:00:01 |       
|* 51 |                 HASH JOIN RIGHT OUTER        |                              |  2432 |  1075K|  1554   (1)| 00:00:19 |       
|* 52 |                  TABLE ACCESS BY INDEX ROWID | CODE_TRANSLATION             |     1 |    65 |     2   (0)| 00:00:01 |       
|* 53 |                   INDEX RANGE SCAN           | CODE_TRANS_TYPE_IDX          |     1 |       |     1   (0)| 00:00:01 |       
|* 54 |                  HASH JOIN RIGHT OUTER       |                              |  2432 |   921K|  1551   (1)| 00:00:19 |       
|* 55 |                   TABLE ACCESS BY INDEX ROWID| CODE_TRANSLATION             |     1 |    65 |     2   (0)| 00:00:01 |       
|* 56 |                    INDEX RANGE SCAN          | CODE_TRANS_TYPE_IDX          |     1 |       |     1   (0)| 00:00:01 |       
|* 57 |                   TABLE ACCESS BY INDEX ROWID| POSITIONS                    |  2432 |   767K|  1549   (1)| 00:00:19 |       
|* 58 |                    INDEX RANGE SCAN          | POSITIONS_IDX_01             |  5676 |       |   737   (2)| 00:00:09 |       
|* 59 |   INDEX RANGE SCAN                           | PARAMETER_CONTROL_IDX3       |     1 |    27 |     2   (0)| 00:00:01 |       
----------------------------------------------------------------------------------------------------------------------------- 

这是另一个视图的解释计划:

explain plan for select * from v_positions_rm_base where business_date = to_date((select current_business_date from v_business_day), 'mm/dd/yyyy');
-------------------------------------------------------------------------------------------------------------------------------       
| Id  | Operation                                      | Name                         | Rows  | Bytes | Cost (%CPU)| Time     |       
-------------------------------------------------------------------------------------------------------------------------------       
|   0 | SELECT STATEMENT                               |                              |   171K|   324M|   366K  (3)| 01:13:16 |       
|*  1 |  FILTER                                        |                              |       |       |            |          |       
|*  2 |   FILTER                                       |                              |       |       |            |          |       
|*  3 |    HASH JOIN RIGHT OUTER                       |                              |  3436K|  6485M|   366K  (3)| 01:13:16 |       
|   4 |     INDEX FAST FULL SCAN                       | RM_SRC_ACCT_UDX              |   601 |  7212 |     2   (0)| 00:00:01 |       
|*  5 |     VIEW                                       |                              |  3436K|  6446M|   366K  (3)| 01:13:15 |       
|*  6 |      HASH JOIN RIGHT OUTER                     |                              |  3436K|  6806M|   366K  (3)| 01:13:15 |       
|   7 |       VIEW                                     | V_RM_FUTURES_CODE_TRANS_FLAT |     1 |    96 |     9  (12)| 00:00:01 |       
|   8 |        HASH GROUP BY                           |                              |     1 |    51 |     9  (12)| 00:00:01 |       
|   9 |         TABLE ACCESS BY INDEX ROWID            | CODE_TRANSLATION             |     3 |   153 |     8   (0)| 00:00:01 |       
|* 10 |          INDEX RANGE SCAN                      | CODE_TRANSLATION_IDX3        |     3 |       |     7   (0)| 00:00:01 |       
|* 11 |       HASH JOIN RIGHT OUTER                    |                              |  3436K|  6492M|   366K  (3)| 01:13:15 |       
|  12 |        VIEW                                    | V_RM_FUTURES_CODE_TRANS_FLAT |     1 |    96 |     9  (12)| 00:00:01 |       
|  13 |         HASH GROUP BY                          |                              |     1 |    51 |     9  (12)| 00:00:01 |       
|  14 |          TABLE ACCESS BY INDEX ROWID           | CODE_TRANSLATION             |     3 |   153 |     8   (0)| 00:00:01 |       
|* 15 |           INDEX RANGE SCAN                     | CODE_TRANSLATION_IDX3        |     3 |       |     7   (0)| 00:00:01 |       
|* 16 |        HASH JOIN RIGHT OUTER                   |                              |  3436K|  6177M|   366K  (3)| 01:13:14 |       
|  17 |         VIEW                                   | V_RM_FUTURES_CODE_TRANS_FLAT |   404 | 42420 |    12   (9)| 00:00:01 |       
|  18 |          HASH GROUP BY                         |                              |   404 | 20604 |    12   (9)| 00:00:01 |       
|  19 |           TABLE ACCESS BY INDEX ROWID          | CODE_TRANSLATION             |   404 | 20604 |    11   (0)| 00:00:01 |       
|* 20 |            INDEX RANGE SCAN                    | CODE_TRANS_TYPE_IDX          |   404 |       |     3   (0)| 00:00:01 |       
|* 21 |         HASH JOIN RIGHT OUTER                  |                              |  3436K|  5833M|   366K  (3)| 01:13:13 |       
|  22 |          VIEW                                  | V_RM_FUTURES_CODE_TRANS_FLAT |   404 | 42420 |    12   (9)| 00:00:01 |       
|  23 |           HASH GROUP BY                        |                              |   404 | 20604 |    12   (9)| 00:00:01 |       
|  24 |            TABLE ACCESS BY INDEX ROWID         | CODE_TRANSLATION             |   404 | 20604 |    11   (0)| 00:00:01 |       
|* 25 |             INDEX RANGE SCAN                   | CODE_TRANS_TYPE_IDX          |   404 |       |     3   (0)| 00:00:01 |       
|* 26 |          HASH JOIN RIGHT OUTER                 |                              |  3436K|  5489M|   366K  (3)| 01:13:13 |       
|  27 |           TABLE ACCESS FULL                    | SOURCE_SYSTEM                |    68 |   748 |     3   (0)| 00:00:01 |       
|* 28 |           HASH JOIN RIGHT OUTER                |                              |  3436K|  5453M|   365K  (3)| 01:13:12 |       
|  29 |            TABLE ACCESS BY INDEX ROWID         | CODE_TRANSLATION             |     1 |    51 |     2   (0)| 00:00:01 |       
|* 30 |             INDEX RANGE SCAN                   | CODE_TRANS_TYPE_IDX          |     1 |       |     1   (0)| 00:00:01 |       
|  31 |            VIEW                                |                              |  3436K|  5286M|   365K  (3)| 01:13:11 |       
|* 32 |             HASH JOIN RIGHT OUTER              |                              |  3436K|  2438M|   365K  (3)| 01:13:11 |       
|  33 |              TABLE ACCESS BY INDEX ROWID       | PARAMETER_CONTROL            |     1 |    38 |     2   (0)| 00:00:01 |       
|* 34 |               INDEX RANGE SCAN                 | PARAMETER_CONTROL_IDX3       |     1 |       |     1   (0)| 00:00:01 |       
|  35 |              MERGE JOIN OUTER                  |                              |  3436K|  2313M|   365K  (3)| 01:13:11 |       
|  36 |               MERGE JOIN OUTER                 |                              |  3436K|  2064M|   365K  (3)| 01:13:11 |       
|  37 |                SORT JOIN                       |                              |   806K|   357M|   365K  (3)| 01:13:10 |       
|  38 |                 MERGE JOIN OUTER               |                              |   806K|   357M|   365K  (3)| 01:13:10 |       
|  39 |                  SORT JOIN                     |                              |   806K|   348M|   365K  (3)| 01:13:10 |       
|* 40 |                   HASH JOIN RIGHT OUTER        |                              |   806K|   348M|   365K  (3)| 01:13:10 |       
|* 41 |                    TABLE ACCESS BY INDEX ROWID | CODE_TRANSLATION             |     1 |    65 |     2   (0)| 00:00:01 |       
|* 42 |                     INDEX RANGE SCAN           | CODE_TRANS_TYPE_IDX          |     1 |       |     1   (0)| 00:00:01 |       
|* 43 |                    HASH JOIN RIGHT OUTER       |                              |   806K|   298M|   365K  (3)| 01:13:10 |       
|* 44 |                     TABLE ACCESS BY INDEX ROWID| CODE_TRANSLATION             |     1 |    65 |     2   (0)| 00:00:01 |       
|* 45 |                      INDEX RANGE SCAN          | CODE_TRANS_TYPE_IDX          |     1 |       |     1   (0)| 00:00:01 |       
|* 46 |                     TABLE ACCESS FULL          | POSITIONS                    |   806K|   248M|   365K  (3)| 01:13:09 |       
|* 47 |                  SORT JOIN                     |                              |     8 |    88 |     4  (25)| 00:00:01 |       
|  48 |                   TABLE ACCESS FULL            | INSTRUMENT_ID_TYPE           |     8 |    88 |     3   (0)| 00:00:01 |       
|* 49 |                SORT JOIN                       |                              |  1742 |   282K|    36  (12)| 00:00:01 |       
|  50 |                 VIEW                           | V_ENTITY_FLAT                |  1742 |   282K|    35   (9)| 00:00:01 |       
|* 51 |                  HASH JOIN RIGHT OUTER         |                              |  1742 |   229K|    35   (9)| 00:00:01 |       
|  52 |                   INDEX FAST FULL SCAN         | ENTITY_IDX_5                 |  1742 | 40066 |     6   (0)| 00:00:01 |       
|* 53 |                   HASH JOIN RIGHT OUTER        |                              |  1742 |   190K|    28   (8)| 00:00:01 |       
|  54 |                    INDEX FAST FULL SCAN        | ENTITY_IDX_5                 |  1742 | 47034 |     6   (0)| 00:00:01 |       
|* 55 |                    HASH JOIN RIGHT OUTER       |                              |  1742 |   144K|    21   (5)| 00:00:01 |       
|  56 |                     INDEX FAST FULL SCAN       | ENTITY_IDX_5                 |  1742 | 47034 |     6   (0)| 00:00:01 |       
|* 57 |                     HASH JOIN RIGHT OUTER      |                              |  1742 |    98K|    15   (7)| 00:00:01 |       
|  58 |                      INDEX FAST FULL SCAN      | ENTITY_IDX_5                 |  1742 | 47034 |     6   (0)| 00:00:01 |       
|  59 |                      TABLE ACCESS FULL         | ENTITY                       |  1742 | 54002 |     8   (0)| 00:00:01 |       
|* 60 |               SORT JOIN                        |                              |     1 |    76 |     2  (50)| 00:00:01 |       
|  61 |                TABLE ACCESS BY INDEX ROWID     | PROCESSING_STATUS            |     1 |    76 |     1   (0)| 00:00:01 |       
|* 62 |                 INDEX UNIQUE SCAN              | PROCESSING_STATUS_PK         |     1 |       |     0   (0)| 00:00:01 |       
|  63 |      MERGE JOIN CARTESIAN                      |                              |     1 |   119 |     4   (0)| 00:00:01 |       
|  64 |       MERGE JOIN CARTESIAN                     |                              |     1 |    81 |     3   (0)| 00:00:01 |       
|  65 |        MERGE JOIN CARTESIAN                    |                              |     1 |    54 |     2   (0)| 00:00:01 |       
|* 66 |         INDEX RANGE SCAN                       | PARAMETER_CONTROL_IDX3       |     1 |    27 |     1   (0)| 00:00:01 |       
|  67 |         BUFFER SORT                            |                              |     1 |    27 |     1   (0)| 00:00:01 |       
|* 68 |          INDEX RANGE SCAN                      | PARAMETER_CONTROL_IDX3       |     1 |    27 |     1   (0)| 00:00:01 |       
|  69 |        BUFFER SORT                             |                              |     1 |    27 |     2   (0)| 00:00:01 |       
|* 70 |         INDEX RANGE SCAN                       | PARAMETER_CONTROL_IDX3       |     1 |    27 |     1   (0)| 00:00:01 |       
|  71 |       BUFFER SORT                              |                              |     1 |    38 |     3   (0)| 00:00:01 |       
|* 72 |        TABLE ACCESS BY INDEX ROWID             | PARAMETER_CONTROL            |     1 |    38 |     1   (0)| 00:00:01 |       
|* 73 |         INDEX RANGE SCAN                       | PARAMETER_CONTROL_IDX1       |     2 |       |     0   (0)| 00:00:01 |       
|* 74 |   INDEX RANGE SCAN                             | PARAMETER_CONTROL_IDX3       |     1 |    27 |     2   (0)| 00:00:01 |       
-------------------------------------------------------------------------------------------------------------------------------       

【问题讨论】:

  • 看看解释计划,看看到底发生了什么。一些问题:子查询看起来只是从该表中提取所有值,那么实际返回了多少值?是否还会返回重复的日期?
  • 子查询只返回一条记录。现在,“从 v_business_day 中选择 current_business_date”返回 '09/17/2010'
  • Oracle 认为它会提取多少条记录?
  • 好的,为什么 CURRENT_BUSINESS_DATE 还不是 DATE? v_business_day 是视图吗?该查询是什么样的?
  • 我不知道,我认为这就是问题所在。有没有办法强制它首先评估该查询,以便它知道它只是一个简单的替换?

标签: sql oracle optimization date


【解决方案1】:

您有两个查询

select * from view where date = '17-sep-10'
select * from view where date = to_date(...

首先,视图中的“日期”列与字符文字进行比较。在第二个中,它与日期进行比较。

如果第一个有效(并且很快),则视图中的“日期”列可能是 VARCHAR2 列而不是日期。您在名为 current_business_date 的列上执行 TO_DATE 的事实表明您可能使用了错误的数据类型。

在 SQL*Plus 中执行 DESC VIEW(或在您使用的任何工具中等效)。

同时为两者做一个解释计划 从日期 = '17-sep-10' 的视图中选择 * 和 select * from view where date = date '2010-09-17'

【讨论】:

  • 我认为如果 NLS 设置正确,Oracle 可能会将日期转换为文字。但是,您可能会遇到一些问题-另一种检查方法是“从日期= to_date('17-sep-10','DD-MON-YY')的视图中选择*”
  • 我使用该查询做了解释计划,它运行得很快。当我使用我们的 v_business_day 视图时,它只会变慢
【解决方案2】:

回应 Cagcowboy

列中 = 另一侧的 to_date 没有问题。

仅将 COLUMN 从类型中转换出来是一个问题。


例子:

create table index_test
as
select object_name, created as create_dt from all_objects;

create index it_create_dt_idx on index_test (create_dt) compute statistics;

INDEX 使用没有问题,TO_DATE 不在列上


set autotrace on explain
select * from index_test where create_dt = to_date('17-SEP-2000', 'DD-MON-YYYY');

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=1 Card=1 Bytes=26)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'INDEX_TEST' (TABLE) (Cos
          t=1 Card=1 Bytes=26)

   2    1     INDEX (RANGE SCAN) OF 'IT_CREATE_DT_IDX' (INDEX) (Cost=1
           Card=1)

THE INDEXED COLUMN 上的一个函数可以排除索引。


SQL> select * from index_test where trunc(create_dt) = to_date('17-SEP-2000', 'DD-MON-YYYY');


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=59 Card=3 Bytes=78
          )

   1    0   TABLE ACCESS (FULL) OF 'INDEX_TEST' (TABLE) (Cost=59 Card=
          3 Bytes=78)

【讨论】:

  • 哦,好吧,他删除了他的错误建议。我把这个留在这里,以防其他人决定发布错误的答案。
【解决方案3】:

我将探出头来,将其归结为列统计数据或偏差。

一个计划有

|* 57 | TABLE ACCESS BY INDEX ROWID| POSITIONS        | 2432 | 767K| 1549 (1)| 00:00:19 |       
|* 58 |  INDEX RANGE SCAN          | POSITIONS_IDX_01 | 5676 |     |  737 (2)| 00:00:09 |       

另一个有

|* 46 |  TABLE ACCESS FULL         | POSITIONS        |  806K| 248M| 365K (3)| 01:13:09 |       

鉴于日期为“2010 年 9 月 17 日”,Oracle 假设将返回数千行。给定另一个非特定日期,Oracle 假设的数字要大得多,以至于日期索引毫无用处。我怀疑表中的大多数行相同的少量日期(可能少于一百个不同的值 - 但您可以查看 USER_TAB_COLUMNS 中的 NUM_DISTINCT)。

我说是因为我认为统计数据可能已经过时了。表中该日期列的 USER_TAB_COLUMNS 上将有一个 LOW_VALUE 和 HIGH_VALUE(以 RAW 格式,而不是实际日期)。当面临对高于记录的 high_value 的值的查询时,10g 会做出一些假设。如果一百个不同的值有一百万行,它将假定每个值有 10,000 行 [在没有直方图的情况下],但对于高于 HIGH_VALUE 的值,它将假定少于 10,000 行。它在计算中获得所有统计数据,因此很难精确。但这足以让数据库认为 9 月 17 日的行数足够少,值得使用索引。

所以有四件事要确定。 表中有多少行,日期的分布是什么。 统计数据表明表格中有多少行,统计数据表明日期的分布情况。

【讨论】:

    【解决方案4】:

    在执行计划中,了解日期谓词应用于哪一步也会很有帮助。

    第二个计划中实际响应时间的罪魁祸首是对POSITIONS 的全面扫描。在第一个计划中,我们使用POSITIONS_IDX_01 进行索引范围扫描。该索引中有哪些列?特别是,它们是否与视图中的business_date 列有关?

    我猜v_business_day 视图基于PARAMETER_CONTROL,因为在第二个计划中似乎比在第一个计划中引用的次数更多。完全基于此表的第二个计划的部分估计基数为 1,因此问题似乎不是 Oracle 认为子查询可能返回多行(这与您在 ROWNUM 上添加条件的语句相矛盾到子查询并没有改变性能)。

    对评论的回应:听起来 POSITIONS.BUSINESS_DATE 上的统计数据使得优化器可以看到文字日期值将具有高度选择性,但任意日期值很可能是高度非选择性。您应该查看统计信息(在 USER_TABLES、USER_INDEXES 和 USER_HISTOGRAMS 中),看看它们是否已过时,以及它们对本列数据分布的指示。

    解决此问题的最简单方法可能是执行一次查询以获取当前业务日期,然后将其作为文字插入到针对复杂视图的查询中。

    【讨论】:

    • positions_idx_01 包含“BUSINESS_DATE”、“SOURCE”和“ACCOUNT_NUMBER”列。我确实尝试在第二个查询中添加索引提示,但这没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多