したいので効率よく転送データから垂直databaselayoutを水平一
-
21-08-2019 - |
質問
私は転送したいデータから垂直dbレイアウトのようになります:
--------------------- | ID | Type | Value | --------------------- | 1 | 10 | 111 | --------------------- | 1 | 14 | 222 | --------------------- | 2 | 10 | 333 | --------------------- | 2 | 25 | 444 | ---------------------
に水平一:
--------------------------------- | ID | Type10 | Type14 | Type25 | --------------------------------- | 1 | 111 | 222 | | --------------------------------- | 2 | 333 | | 444 | ---------------------------------
をレイアウトに問題ありませんが、データベースは広いの何百万のリクエリの中止した場合には時間くらい。
どのような方法で実現できるのが効率的に(そのクエリが解除).
解決
with t as
(
select 1 as ID, 10 as type, 111 as Value from dual
union
select 1, 14, 222 from dual
union
select 2, 10, 333 from dual
union
select 2, 25, 444 from dual
)
select ID,
max(case when type = 10 then Value else null end) as Type10,
max(case when type = 14 then Value else null end) as Type14,
max(case when type = 25 then Value else null end) as Type25
from t
group by id
あなたが欲しいものを返し、と私はそれがより良い方法だと思います。 MAX関数は、group by句を実行するだけで、ここであることに注意してください、任意のグループ機能は、ここで使用することができます(合計のように、分...)
他のヒント
小さなチャンクに分割して単一のトランザクションで全体をラップしません。まず、テーブルを作成し、新しいテーブルに古いテーブルからの挿入のグループを行います。それはデータベースのログを圧倒し、あまりにも時間がかかることはありません十分に小さいチャンクで、例えば、IDの範囲で挿入します。
縦表--としても知られる企業-属性-値の抗パターン--常に問題となり、時には非常に後れを実践しています。だって、チェックアウトは何ジョー Celkoえてこの手法は、きもの面倒なこのアプローチです。私は停止ができ、スマート人たちは、本サイトの罪がどの遂者が犯したのEAVテーブルデータベースです。
オプションを扱うこの種のテーブルがないか、とまで述べて悪化/遅いデータの量生産に必要なクエリーです。
の構築を宣言したグローバルの一時テーブル(DGTTはログインせずに保存するとともに進行し、ステージの水平版にEAVテーブルです。DGTTsはこのようなデータshovelingものではありませんが負ロギングオーバーヘッド。
採用の場合およびMAX()グループの前です。問題は、そのクエリに変更しかしその後も数年おきに新たなタイプに導入しておEAVます。
利用DB2、SQL-XML出版の特徴を垂直データ形式をサポートしています。以下に例を示しますが、テーブルやカラム名のお客様よりご提供いただいた:
WITH t(id, type, value) as (
VALUES (1,10,111), (1,14,222), (2,10,333), (2,25,444)
)
SELECT
XMLSERIALIZE( CONTENT
XMLELEMENT(NAME "outer",
XMLATTRIBUTES(id AS "id"),
XMLAGG(XMLELEMENT(NAME attr ,
XMLATTRIBUTES(type as "typeid"), value) ORDER BY type)
) AS VARCHAR(1024)
)
FROM t as t group by id;
の利益のSQL-XMLアプローチに関連する新しい価値をEAVテーブルを必要としない書き換えのSQLるピボットの値です。