2017-02-28 1 views
4

私は概念証明をしています。私は奇妙な動作を実験しています。 日付フィールドで範囲別にパーティション化されたテーブルがあり、固定日付またはSYSDATEで作成したものを設定すると、クエリのコストが大きく変わります。オラクルフィルタの説明プランパーティション

これらは説明のプランです:

SQL> SELECT * 
    2 FROM TP_TEST_ELEMENTO_TRAZABLE ET 
    3 WHERE ET.FEC_RECEPCION 
    4 BETWEEN TRUNC(SYSDATE-2) AND TRUNC(SYSDATE-1) 
    5 ; 

5109 filas seleccionadas. 


Plan de Ejecuci¾n 
---------------------------------------------------------- 
Plan hash value: 1151442660 

------------------------------------------------------------------------------------------------------------------------ 
| Id | Operation     | Name      | Rows | Bytes | Cost (%CPU)| Time  | Pstart| Pstop | 
------------------------------------------------------------------------------------------------------------------------ 
| 0 | SELECT STATEMENT   |       | 5008 | 85136 | 4504 (8)| 00:00:55 |  |  | 
|* 1 | FILTER     |       |  |  |   |   |  |  | 
| 2 | PARTITION RANGE ITERATOR|       | 5008 | 85136 | 4504 (8)| 00:00:55 | KEY | KEY | 
|* 3 | TABLE ACCESS FULL  | TP_TEST_ELEMENTO_TRAZABLE | 5008 | 85136 | 4504 (8)| 00:00:55 | KEY | KEY | 
------------------------------------------------------------------------------------------------------------------------ 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    1 - filter(TRUNC([email protected]!-2)<=TRUNC([email protected]!-1)) 
    3 - filter("ET"."FEC_RECEPCION">=TRUNC([email protected]!-2) AND "ET"."FEC_RECEPCION"<=TRUNC([email protected]!-1)) 


EstadÝsticas 
---------------------------------------------------------- 
      1 recursive calls 
      0 db block gets 
     376 consistent gets 
      0 physical reads 
      0 redo size 
    137221 bytes sent via SQL*Net to client 
     4104 bytes received via SQL*Net from client 
     342 SQL*Net roundtrips to/from client 
      0 sorts (memory) 
      0 sorts (disk) 
     5109 rows processed 

固定の日付を使用する:

SQL> SELECT * 
    2 FROM TP_TEST_ELEMENTO_TRAZABLE ET 
    3 WHERE ET.FEC_RECEPCION 
    4 BETWEEN TO_DATE('26/02/2017', 'DD/MM/YYYY') AND TO_DATE('27/02/2017', 'DD/MM/YYYY') 
    5 ; 

5109 filas seleccionadas. 


Plan de Ejecuci¾n 
---------------------------------------------------------- 
Plan hash value: 3903280660 

----------------------------------------------------------------------------------------------------------------------- 
| Id | Operation    | Name      | Rows | Bytes | Cost (%CPU)| Time  | Pstart| Pstop | 
----------------------------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT   |       | 5008 | 85136 | 11 (0)| 00:00:01 |  |  | 
| 1 | PARTITION RANGE ITERATOR|       | 5008 | 85136 | 11 (0)| 00:00:01 | 607 | 608 | 
|* 2 | TABLE ACCESS FULL  | TP_TEST_ELEMENTO_TRAZABLE | 5008 | 85136 | 11 (0)| 00:00:01 | 607 | 608 | 
----------------------------------------------------------------------------------------------------------------------- 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    2 - filter("ET"."FEC_RECEPCION"<=TO_DATE(' 2017-02-27 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) 


EstadÝsticas 
---------------------------------------------------------- 
      1 recursive calls 
      0 db block gets 
     376 consistent gets 
      0 physical reads 
      0 redo size 
    137221 bytes sent via SQL*Net to client 
     4104 bytes received via SQL*Net from client 
     342 SQL*Net roundtrips to/from client 
      0 sorts (memory) 
      0 sorts (disk) 
     5109 rows processed 

4504のコストと11のコストを生産違いは何ですか?あなたはSYSDATEを使用する場合、それは任意のパーティションを必要とする可能性があるため、事前に

感謝:)

+2

簡単な答えは、「コスト」は2つの異なるクエリを比較することを意図していません(たとえ類似しているとしても)。彼らは一度に一つのクエリのために異なる計画を比較する** ** **です。異なる照会を比較する場合、基数の見積もりを比較するほうが良いです。 – mathguy

+1

https://asktom.oracle.com/pls/apex/f?p=100:11:0:::P11_QUESTION_ID:313416745628 –

+1

https://jonathanlewis.wordpress.com/2017/02/28/cost-これは、 –

答えて

5

違いがあります。たとえば、毎日パーティションを作成している場合、アクセスする必要のあるパーティションは、現在と将来の間で異なります。そのため、計画はKEY:KEYです。つまり、実行時に実際のパーティションが解決されます。

固定された日付で、私たちはコンパイル時にそれが解決するパーティションを知っています。また、単一のパーティションに解決されるため、より正確にコストがかかります。