パーティション・テーブルの別の点について


ずいぶん前にパーティションテーブルに関するブログ(http://www.cnblogs.com/wingsless/archive/2012/08/06/2625809.html)を書きましたが、実際の作業では、私たちのストレージにはこのような書き方がたくさんあることがわかりました.
     
CREATE OR REPLACE PROCEDURE P_TEST_PAR(V_DAY IN VARCHAR2) AS
  V_SQL VARCHAR2(1000);
BEGIN
  V_SQL := 'INSERT INTO TEST_PAR
    SELECT * FROM TEST_PAR T WHERE T.DAY_ID =' || V_DAY;
  EXECUTE IMMEDIATE V_SQL;
  COMMIT;
END

 
この中のv_dayは、ストレージ中に入力された変数です.
このパーティションテーブルはday_idフィールド範囲パーティションで、パーティションのフィールドはvarchar 2型です.このv_sql印刷は次のようになります.
     
INSERT INTO TEST_PAR
    SELECT * FROM TEST_PAR T WHERE T.DAY_ID =20130101

主に下のselect文を見ます.
      有关分区表的另一点_第1张图片
ほら、20130101日のデータしか選択していませんが、パーティションを読み込むときにすべてのパーティションを読み取りました.これは明らかに私たちの要求に達していません.問題は簡単です.次の暗黙的なタイプ変換にあります.文を次のように置き換えると違います.
     
SELECT * FROM TEST_PAR T WHERE T.DAY_ID ='20130101'

     有关分区表的另一点_第2张图片
これでいいのですが、costも下がりました.以前、インデックスが使用できないと書いたことがあります(http://www.cnblogs.com/wingsless/archive/2011/11/19/2255647.html)、同じタイミングでパーティションでも起きたとは思いませんでした.
プロセスは次のように変更されます.
    
CREATE OR REPLACE PROCEDURE P_TEST_PAR(V_DAY IN VARCHAR2) AS
  V_SQL VARCHAR2(1000);
BEGIN
  V_SQL := 'INSERT INTO TEST_PAR
    SELECT * FROM TEST_PAR T WHERE T.DAY_ID =''' || V_DAY ||'''';
  EXECUTE IMMEDIATE V_SQL;
  COMMIT;
END;

その後、パーティション条件がnumber型である場合、SQL文の条件に単一引用符を書いた場合、適切なパーティションを選択できるかという問題が見つかりました.今出勤しています.時間がありますから、スクリーンショットをしています.