全部产品
Search
文档中心

PolarDB:Contoh

更新时间:Jul 02, 2025

Topik ini memberikan contoh penggunaan pemangkasan partisi.

SELECT

Pernyataan EXPLAIN digunakan untuk menampilkan rencana eksekusi suatu pernyataan. Anda dapat menjalankan pernyataan EXPLAIN untuk memastikan apakah partisi dipangkas dari rencana eksekusi suatu kueri.

  1. Buat tabel yang dipartisi berdasarkan daftar.
    CREATE TABLE sales
    (
      dept_no     number,   
      part_no     varchar2,
      country     varchar2(20),
      date        date,
      amount      number
    )
    PARTITION BY LIST(country)
    (
      PARTITION europe VALUES('FRANCE', 'ITALY'),
      PARTITION asia VALUES('INDIA', 'PAKISTAN'),
      PARTITION americas VALUES('US', 'CANADA')
    );
  2. Jalankan kueri terbatas yang mengandung pernyataan EXPLAIN.
    EXPLAIN (COSTS OFF) SELECT * FROM sales WHERE country = 'INDIA';
    Rencana eksekusi yang dikembalikan menunjukkan bahwa server hanya akan memindai partisi sales_asia, yang menyimpan baris dengan nilai kolom negara INDIA:
    postgres=# EXPLAIN (COSTS OFF) SELECT * FROM sales WHERE country = 'INDIA';
                        QUERY PLAN                     
    ---------------------------------------------------
    
     Append
       ->  Seq Scan on sales
             Filter: ((country)::text = 'INDIA'::text)
       ->  Seq Scan on sales_asia
             Filter: ((country)::text = 'INDIA'::text)
    (5 rows)
  3. Anda dapat menjalankan pernyataan berikut untuk menanyakan catatan yang sesuai dengan kondisi kueri tertentu berdasarkan nilai kolom kunci non-partisi:
    EXPLAIN (COSTS OFF) SELECT * FROM sales WHERE dept_no = '30';  
    Rencana eksekusi yang dikembalikan menunjukkan bahwa server berencana untuk menanyakan semua partisi dan menemukan baris yang memenuhi kueri:
    postgres=# EXPLAIN (COSTS OFF) SELECT * FROM sales WHERE dept_no = '30';
                   QUERY PLAN               
    -----------------------------------------
     Append
       ->  Seq Scan on sales
             Filter: (dept_no = 30::numeric)
       ->  Seq Scan on sales_europe
             Filter: (dept_no = 30::numeric)
       ->  Seq Scan on sales_asia
             Filter: (dept_no = 30::numeric)
       ->  Seq Scan on sales_americas
             Filter: (dept_no = 30::numeric)
    (9 rows)
  4. Pengecualian kendala juga dapat digunakan untuk kueri pada tabel subpartisi. Pernyataan berikut memberikan contoh cara membuat tabel subpartisi:
    CREATE TABLE sales
    (
      dept_no     number,
      part_no     varchar2,
      country     varchar2(20),
      date        date,
      amount      number
    )
    PARTITION BY RANGE(date) SUBPARTITION BY LIST (country)
    (
      PARTITION "2011" VALUES LESS THAN('01-JAN-2012')
      (
        SUBPARTITION europe_2011 VALUES ('ITALY', 'FRANCE'),
        SUBPARTITION asia_2011 VALUES ('PAKISTAN', 'INDIA'),
        SUBPARTITION americas_2011 VALUES ('US', 'CANADA')
      ),
      PARTITION "2012" VALUES LESS THAN('01-JAN-2013')
      (
        SUBPARTITION europe_2012 VALUES ('ITALY', 'FRANCE'),
        SUBPARTITION asia_2012 VALUES ('PAKISTAN', 'INDIA'),
        SUBPARTITION americas_2012 VALUES ('US', 'CANADA')
      ),
      PARTITION "2013" VALUES LESS THAN('01-JAN-2014')
      (
        SUBPARTITION europe_2013 VALUES ('ITALY', 'FRANCE'),
        SUBPARTITION asia_2013 VALUES ('PAKISTAN', 'INDIA'),
        SUBPARTITION americas_2013 VALUES ('US', 'CANADA')
      )
    );
    Saat Anda menanyakan tabel, perencana kueri memangkas partisi atau subpartisi yang tidak mengandung set hasil yang diharapkan dari jalur pencarian.
    postgres=# EXPLAIN (COSTS OFF) SELECT * FROM sales WHERE country = 'US' AND date = 'Dec 12, 2012';
                                     QUERY PLAN                                 
    -----------------------------------------------------------------------------
     Append
       ->  Seq Scan on sales
             Filter: (((country)::text = 'US'::text) AND (date = '12-DEC-12 00:00:00'::timestamp without time zone))
       ->  Seq Scan on sales_2012
             Filter: (((country)::text = 'US'::text) AND (date = '12-DEC-12 00:00:00'::timestamp without time zone))
       ->  Seq Scan on sales_americas_2012
             Filter: (((country)::text = 'US'::text) AND (date = '12-DEC-12 00:00:00'::timestamp without time zone))
    (7 rows)

UPDATE dan DELETE

  1. Jalankan perintah berikut untuk membuat tabel yang dipartisi berdasarkan hash:
    create table t1_hash (id int , value int) partition by hash(id) partitions 4;
  2. Jalankan perintah berikut untuk memperbarui tabel:
    postgres=# explain update t1_hash set value = value+1 where id = least(1,2);
                                   QUERY PLAN                                
    -------------------------------------------------------------------------
     Update on t1_hash  (cost=0.00..92.18 rows=24 width=14)
       Update on t1_hash_p1
       Update on t1_hash_p2 t1_hash
       ->  Append  (cost=0.00..92.18 rows=24 width=14)
             Subplans Removed: 1
             ->  Seq Scan on t1_hash_p1  (cost=0.00..46.03 rows=12 width=14)
                   Filter: (id = LEAST(1, 2))
    (7 rows)
  3. Jalankan perintah berikut untuk menghapus tabel:
    postgres=# explain delete from t1_hash where id = least(1,2);
                                   QUERY PLAN                                
    -------------------------------------------------------------------------
     Delete on t1_hash  (cost=0.00..92.12 rows=24 width=10)
       Delete on t1_hash_p1
       Delete on t1_hash_p2 t1_hash
       ->  Append  (cost=0.00..92.12 rows=24 width=10)
             Subplans Removed: 1
             ->  Seq Scan on t1_hash_p1  (cost=0.00..46.00 rows=12 width=10)
                   Filter: (id = LEAST(1, 2))
    (7 rows)