Czy ALTER TABLE COMPRESS FOR OLTP Ma Wpływ Na Partycje I Subpartycje

Polecenie ALTER TABLE modyfikuje tabelę i umożliwia zmianę zachowania tejże tabeli. Czy ustawienie tabeli jako kompresowalnej wpływa również na jej partycje i subpartycje?

Przygotowanie danych

DROP TABLE T1
/

CREATE TABLE T1(id NUMBER, status VARCHAR2(100))
PARTITION BY RANGE (id)
  SUBPARTITION BY LIST (status)
    SUBPARTITION TEMPLATE
    (
      SUBPARTITION s_status_valid VALUES ('VALID'),
      SUBPARTITION s_status_invalid VALUES ('INVALID')
    )
(
  PARTITION p1 VALUES LESS THAN (100),
  PARTITION p2 VALUES LESS THAN (200)
)

INSERT INTO T1 
  SELECT ROWNUM, CASE WHEN MOD(ROWNUM, 2) = 0 THEN 'VALID' ELSE 'INVALID' END FROM dual
 CONNECT BY ROWNUM <= 200
/

COMMIT;
/

Stan początkowy

SELECT table_name, compression, compress_for FROM dba_tables
 WHERE table_name = 'T1'
/
TABLE_NAME COMPRESSION COMPRESS_FOR
---------- ----------- ------------
    T1        (null)      (null)
SELECT table_name, partition_name, high_value, compressio, compress_for FROM dba_tab_partitions 
 WHERE table_name = 'T1'
/
TABLE_NAME PARTITION_NAME HIGH_VALUE COMPRESSION COMPRESS_FOR
---------- -------------- ---------- ----------- ------------
    T1	        P2	   200	        NONE	   (null)
    T1	        P1	   100	        NONE	   (null)
SELECT table_name, partition_name, subpartition_name, high_value, compression, compress_for FROM dba_tab_subpartitions
 WHERE table_name = 'T1'
/
TABLE_NAME SUBPARTITION_NAME PARTITION_NAME HIGH_VALUE COMPRESSION COMPRESS_FOR
---------- ----------------- -------------- ---------- ----------- ------------
T1	         P1	P1_S_STATUS_INVALID 'INVALID'	DISABLED	(null)
T1	         P1	P1_S_STATUS_VALID   'VALID'	DISABLED	(null)
T1	         P2	P2_S_STATUS_INVALID 'INVALID'	DISABLED	(null)
T1	         P2	P2_S_STATUS_VALID   'VALID'	DISABLED	(null)

Włączenie kompresji

Poniżej znajduje się polecenie ALTER TABLE z opcją COMPRESS FOR OLTP, która włącza zaawansowaną kompresję na tabeli T1. W przypadku, w którym na tabeli istnieją partycje i subpartycje poniższy ALTER nie kompresuje danych istniejących już w tabeli, tylko oznacza tabelę jak i jej partycje i subpartycje jako kompresowalne.

ALTER TABLE T1 COMPRESS FOR OLTP
/
SELECT table_name, partition_name, high_value, compression, compress_for FROM dba_tab_partitions 
 WHERE table_name = 'T1'
/
TABLE_NAME PARTITION_NAME HIGH_VALUE COMPRESSION COMPRESS_FOR
---------- -------------- ---------- ----------- ------------
    T1	        P2	   200	       ENABLED      OLTP
    T1	        P1	   100	       ENABLED      OLTP
SELECT table_name, partition_name, subpartition_name, high_value, compression, compress_for FROM dba_tab_subpartitions
 WHERE table_name = 'T1'
/
TABLE_NAME PARTITION_NAME SUBPARTITION_NAME   HIGH_VALUE COMPRESSION COMPRESS_FOR
---------- -------------- ------------------- ---------- ----------- ------------
    T1	        P1	  P1_S_STATUS_INVALID 'INVALID'	  ENABLED	OLTP
    T1	        P1	  P1_S_STATUS_VALID   'VALID'	  ENABLED	OLTP
    T1	        P2	  P2_S_STATUS_INVALID 'INVALID'	  ENABLED	OLTP
    T1	        P2	  P2_S_STATUS_VALID   'VALID'	  ENABLED	OLTP

Dodanie nowej partycji i subpartycji

Jak można się było spodziewać polecenie ALTER TABLE oznaczył wszystkie istniejące partycje jak i subpartycje jako kompresowalne, ale czy ma również impact na nowo tworzone partycje i subpartycje?

ALTER TABLE T1 ADD PARTITION P3 VALUES LESS THAN (300)
/
ALTER TABLE T1 MODIFY PARTITION P2 ADD SUBPARTITION P2_S_STATUS_ERROR VALUES ('ERROR')
/
SELECT table_name, partition_name, high_value, compression, compress_for FROM dba_tab_partitions 
 WHERE table_name = 'T1'
/
TABLE_NAME PARTITION_NAME HIGH_VALUE COMPRESSION COMPRESS_FOR
---------- -------------- ---------- ----------- ------------
   T1	        P2	   200	       ENABLED	     OLTP
   T1	        P1	   100	       ENABLED	     OLTP
   T1	        P3	   300	       ENABLED	     OLTP
SELECT table_name, partition_name, subpartition_name, high_value, compression, compress_for FROM dba_tab_subpartitions
 WHERE table_name = 'T1'
/
TABLE_NAME PARTITION_NAME SUBPARTITION_NAME   HIGH_VALUE COMPRESSION COMPRESS_FOR
---------- -------------- ------------------- ---------- ----------- ------------
    T1	        P1	  P1_S_STATUS_INVALID 'INVALID'	  ENABLED	OLTP
    T1	        P1	  P1_S_STATUS_VALID   'VALID'	  ENABLED	OLTP
    T1	        P2	  P2_S_STATUS_ERROR   'ERROR'     ENABLED	OLTP
    T1	        P2	  P2_S_STATUS_INVALID 'INVALID'	  ENABLED	OLTP
    T1	        P2	  P2_S_STATUS_VALID   'VALID'	  ENABLED	OLTP

Jak widać na załączonym przykładzie zmiany dokonywane na tabeli wpływają nie tylko na jej istniejące partycje i subpartycje, ale również na te, które zostaną utworzone w przyszłości, dzięki czemu, programista nie musi pamiętać o konieczności pisania dodatkowych linii kodu, aby zachować spójność działania.

Szymon

Komentarze |0|

Legenda *) Pola oznaczone gwiazdką są wymagane
**) Możesz używać tych znaczników i atrybutów HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>