【SQL】SAP HANAでDB処理が速くなるクエリ

Code

はじまり

135ml
135ml

今回は、SAP HANAでテーブルのレコードをEXPORTするために使用したSQLを紹介します。
2012年リリースのHANA DBより以前のバージョンだと、1つのテーブルに2000万件以上レコードが存在する場合、ちゃんとEXPORT出来ないというバグが存在します。そのため、一時的にテーブルを分割したテーブルを用意する必要があり、その時のEXPORTの作業までに時短ができたクエリになります。

リサちゃん
リサちゃん

仏説摩訶般若波羅蜜多心経

観自在菩薩 行深般若波羅蜜多時 照見五蘊皆空

度一切苦厄 舎利子 色不異空 空不異色 色即是空

空即是色 受想行識亦復如是 舎利子 是諸法空相

不生不滅 不垢不浄 不増不減 是故空中・・・・・・

135ml
135ml

冒頭の文がいきなり長いからってどさくさに紛れて般若心経を唱えるんじゃあない。

はい、般若心経じゃなくて、HANA SQLどうぞ~!

速くなるSQL文

以下、クエリの紹介になります。

CREATE文

速くする前ではただ単に分割一時テーブルを作成するだけですが、速くした後ではテーブルをパーティション化させて作成します。

このALTER TABLE文の一工夫を加えることで、INSERT文でレコードを追加する処理が、およそ半分くらいの時間で済み、CPU使用率も平均して半分くらいになります。

ALTER TABLE文のPARTITIONS句の数値は、増やしていくと段々効果が無くなってくるので、そこの検証および調整が必要です。

・速くする前

CREATE COLUMN TABLE "WARDROBE_AP"."WARDROBE_INFO_TMP1" ("INFO_NUMBER" NVARCHAR(14) NOT NULL ,
         "WARDROBE_CD" NVARCHAR(5),
         "YEAR" INTEGER CS_INT,
         "CC_Q_INFO_STATUS_CD" VARCHAR(3),
         "TROUBLE_INFODB_LINK_DATE_TIME" LONGDATE CS_LONGDATE,
         "TEMP_REG_READ_START_DAY" DAYDATE CS_DAYDATE,
         "DEL_FLG" ALPHANUM() CS_ALPHANUM,
         PRIMARY KEY ("INFO_NUMBER")) UNLOAD PRIORITY 5 AUTO MERGE
;

・速くした後

CREATE COLUMN TABLE "WARDROBE_AP"."WARDROBE_INFO_TMP1" ("INFO_NUMBER" NVARCHAR(14) NOT NULL ,
         "WARDROBE_CD" NVARCHAR(5),
         "YEAR" INTEGER CS_INT,
         "CC_Q_INFO_STATUS_CD" VARCHAR(3),
         "TROUBLE_INFODB_LINK_DATE_TIME" LONGDATE CS_LONGDATE,
         "TEMP_REG_READ_START_DAY" DAYDATE CS_DAYDATE,
         "DEL_FLG" ALPHANUM() CS_ALPHANUM,
         PRIMARY KEY ("INFO_NUMBER")) UNLOAD PRIORITY 5 AUTO MERGE
;
ALTER TABLE "WARDROBE_AP"."WARDROBE_INFO_TMP1" DROP PRIMARY KEY;
ALTER TABLE "WARDROBE_AP"."WARDROBE_INFO_TMP1" PARTITION BY ROUNDROBIN PARTITIONS 8;

EXPORT文

こちらは速くした後では、分割一時テーブルからのEXPORTを並列実行してくれるようになります。カラム数が多い場合は、THREAD句の数字を減らして検証および調整が必要となります。

こちらも処理時間とCPU使用率が半分くらいになります。

・速くする前

EXPORT "WARDROBE_AP"."WARDROBE_INFO_TMP1" AS CSV INTO '/work/20211126_export' WITH REPLACE;
EXPORT "WARDROBE_AP"."WARDROBE_INFO_TMP2" AS CSV INTO '/work/20201126_export' WITH REPLACE;
EXPORT "WARDROBE_AP"."WEATHER_INFO_TMP1" AS CSV INTO '/work/20201126_export' WITH REPLACE;
EXPORT "WARDROBE_AP"."WEATHER_INFO_TMP2" AS CSV INTO '/work/20201126_export' WITH REPLACE;
EXPORT "WARDROBE_AP"."WEATHER_INFO_TMP3" AS CSV INTO '/work/20211126_export' WITH REPLACE;
EXPORT "WARDROBE_AP"."USER_INFO_TMP1" AS CSV INTO '/work/20211126_export' WITH REPLACE;
EXPORT "WARDROBE_AP"."USER_INFO_TMP2" AS CSV INTO '/work/20211126_export' WITH REPLACE;

・速くした後

EXPORT "WARDROBE_AP"."WARDROBE_INFO_TMP1", "WARDROBE_AP"."WARDROBE_INFO_TMP2", "WARDROBE_AP"."WEATHER_INFO_TMP1", "WARDROBE_AP"."WEATHER_INFO_TMP2", "WARDROBE_AP"."WEATHER_INFO_TMP3", "WARDROBE_AP"."USER_INFO_TMP1", "WARDROBE_AP"."USER_INFO_TMP2", "WARDROBE_AP"."CONSULT_PARTY_INFO", "WARDROBE_AP"."CC_Q_INFO", "WARDROBE_AP"."CC_A_INFO" AS CSV INTO '/work/20211126_export' WITH REPLACE THREAD 7;

wc⇒awk(SQLじゃなくてBashです。)

こちらはCSVをEXPORTした後に、CSVの行数がレコード数と同じかどうかを確認するために使用したBashになるのですが、時短になったのでついでに記載しておきます。

大体、処理時間が2/3くらいに削減できます。

・速くする前

wc -l /work/20211126_export/taihi/index/WARDROBE_AP/WA/WARDROBE_INFO/data.csv>linesResult.txt 2>&1

・速くした後

awk 'END {print NR}' /work/20211126_export/taihi/index/WARDROBE_AP/WA/WARDROBE_INFO/data.csv>linesResult.txt 2>&1

おしまい

135ml
135ml

今回は時短できるSQLを紹介しました! リサちゃん、どうでした?

リサちゃん
リサちゃん

得阿耨多羅三藐三菩提 故知般若波羅蜜多

是大神呪 是大明呪 是無上呪 是無等等呪

能除一切苦 真実不虚 故説般若波羅蜜多呪

即説呪日 羯諦 羯諦 波羅羯諦 波羅僧羯諦・・・・・・

135ml
135ml

ダメだ、内なる自分と戦ってるわ・・・

今回はこのへんで!

リサちゃん
リサちゃん

菩提薩婆訶 般若心経・・・!

リサちゃん
リサちゃん

うお~! 悟ったわ~!!

135ml
135ml

悟ったやつって、そんな感じぃ?

以上になります!

コメント

タイトルとURLをコピーしました