Hash Partitioned Tablolar Arasında Performanslı Veri Aktarımı

Arkadaşlar Selam,

Bu yazıda, yaşadığım spesifik bir problemin çözümünü paylaşacağım. Benzer problemi yaşayanlar için farkındalık yaratacağını düşünüyorum.

ETL(Extraction-Transformation-Load) developement yaparken çok yoğun bir şekilde büyük hacimli data içeren tablolar arasında veri aktarımına ihtiyaç duyuyoruz. Bu işler doğası gereği datanın hacmine göre oldukça uzun sürebiliyor. Zaman zaman bu süreyi kısaltmak için yazdığımız sorgulara /*+parallel*/ hinti veriyoruz veya DIY (Do-It-Yourself Parallelism) tekniklerini uyguluyoruz. Bu yöntemleri gerçeklemek bazen uzun sürebiliyor, bazense işe yaramayabiliyor. Şimdi anlatacağım tekniği bu probleme uygun yerlerde kullandığınızda çok büyük performans kazançları olacağını gözlemleyebilirsiniz.

Eğer veri taşıdığımız tablolar arasında birebir veri aktarımı gerçekleşiyorsa. Yani source ve target tablolarımızdaki verileri aynı key alanlarını kullanarak aktarma işlemi gerçekleştiriyorsak her 2 tablonun metadatasını hash partitioned layıp verileri karşılıklı partitionedlar arasında transfer etmek performansı oldukça hızlandıracak. Bunun temel nedeni aslında işimizi partioned sayısı kadar paralel çalışmasını sağlamak aslında. Şimdi durumu örnek ile gösterelim.

Aşağıdaki gibi 1 source ve 1 de target tablom olsun ve bu tabloların 2 side key alanlarına göre 8 hash partition’a bölünmüş tablolar olsun (Tablolarım key alanlarına göre hash partitionlanmamış olabilir, metadatayı kendimizde çevirebiliriz, bu işleme uygun hale geitrebiliriz).

Ben direk bu problemin çözümüne uygun olarak 2 tablomu yaratıyorum ve source tablomun içerisine 50M kayıt insert ediyorum.

CREATE TABLE SRC_TRANS
(
TRANS_ID NUMBER,
TRANS_NAME VARCHAR2 (10),
TRANS_DATE DATE
)
PARALLEL (DEGREE 8 INSTANCES DEFAULT)
PARTITION BY HASH
(TRANS_ID)
(
PARTITION P1,
PARTITION P2,
PARTITION P3,
PARTITION P4,
PARTITION P5,
PARTITION P6,
PARTITION P7,
PARTITION P8);

CREATE TABLE TRG_TRANS
(
TRANS_ID NUMBER,
TRANS_NAME VARCHAR2 (10),
TRANS_DATE DATE
)
PARALLEL (DEGREE 8 INSTANCES DEFAULT)
PARTITION BY HASH
(TRANS_ID)
(
PARTITION P1,
PARTITION P2,
PARTITION P3,
PARTITION P4,
PARTITION P5,
PARTITION P6,
PARTITION P7,
PARTITION P8);

BEGIN
FOR i IN 1 .. 50000000
LOOP
EXECUTE IMMEDIATE 'insert into src_trans values(:1,:2,:3)'
USING i, 'Deneme', SYSDATE;
END LOOP;

COMMIT;
END;

İşlemim tamam şimdi hiç bir şey yapmadan 2 tablo arasında veri transferi gerçekleştirip süresini inceleyeceğim.

SET TIMING ON

INSERT INTO TRG_TRANS
SELECT /*+ parallel (t 4) */ * FROM SRC_TRANS T;

COMMIT;

50000000 rows created.
Elapsed: 00:00:35.60

Şimdi bu işlemi 8 ayrı parçaya bölünmüş şekilde yapalım. Oracle’da her partition farklı bir fiziksel tablo olarak yaratıldığı için bu işlemleri farklı ana sessionlar olarak başlatıp işlemi gerçek anlamda paralelleştirebiliriz. Eğer resource havuzumuz yeteri kadar genişse her bir parçayıda kendi içine parallel hale getirebiliriz. Her iki tabloda aynı alana göre hash partitionlandığı için karşılıklı partitionlar aynı datayı tutacaktır. Bu bağlamda partitionlara karşılıklı data taşıyacak SQL’leri yazıyorum ve paralel sessionlar açarak SQL’leri çalıştırıp toplam süreye bakıyorum .

INSERT INTO TRG_TRANS PARTITION (P1) SELECT /*+ parallel (t 4) */ * FROM SRC_TRANS  PARTITION(P1) T;

INSERT INTO TRG_TRANS PARTITION (P2) SELECT /*+ parallel (t 4) */ * FROM SRC_TRANS PARTITION(P2) T;

INSERT INTO TRG_TRANS PARTITION (P3) SELECT /*+ parallel (t 4) */ * FROM SRC_TRANS PARTITION(P3) T;

INSERT INTO TRG_TRANS PARTITION (P4) SELECT /*+ parallel (t 4) */ * FROM SRC_TRANS PARTITION(P4) T;

INSERT INTO TRG_TRANS PARTITION (P5) SELECT /*+ parallel (t 4) */ * FROM SRC_TRANS PARTITION(P5) T;

INSERT INTO TRG_TRANS PARTITION (P6) SELECT /*+ parallel (t 4) */ * FROM SRC_TRANS PARTITION(P6) T;

INSERT INTO TRG_TRANS PARTITION (P7) SELECT /*+ parallel (t 4) */ * FROM SRC_TRANS PARTITION(P7) T;

INSERT INTO TRG_TRANS PARTITION (P8) SELECT /*+ parallel (t 4) */ * FROM SRC_TRANS PARTITION(P8) T;

COMMIT;

Elapsed: 00:00:09.60

Evet aradaki fark neredeyse 4 kat. Eğer sistem kaynaklarınız her alt iş için daha fazla parallel almaya müsaitse bu işlem çok daha kısa sürebilir.
Büyük hacimli tablolar arasında bu işlem yapıldığında arada muazzam bir fark olduğunu göreceksiniz. Umarım benim işime yaradığı gibi sizinde uygulayabileceğiniz işlerde de performans üst seviyelerde olacaktır.

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Uncategorized and tagged , , , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s