1

次のような垂直 db レイアウトからデータを転送したい:

----------------------
| | ID | タイプ | 値 |
----------------------
| | 1 | 10 | 111 |
----------------------
| | 1 | 14 | 222 |
----------------------
| | 2 | 10 | 333 |
----------------------
| | 2 | 25 | 444 |
----------------------

水平のものに:

----------------------------------
| | ID | タイプ10 | タイプ14 | タイプ25 |
----------------------------------
| | 1 | 111 | 222 | | |
----------------------------------
| | 2 | 333 | | | 444 |
----------------------------------

レイアウトの作成は問題ではありませんが、データベースはかなり大きく、数百万のエントリがあり、クエリに時間がかかるとキャンセルされます。

これを効率的に行うにはどうすればよいですか (クエリがキャンセルされないようにするため)。

4

3 に答える 3

0
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関数はgroupby句を実行するためにここにあることに注意してください。ここでは、任意のグループ関数を使用できます(sum、min ...など)。

于 2009-07-01T15:46:04.107 に答える
0

Entity-Attribute-Value アンチパターンとしても知られる垂直テーブルは、常に問題になり、実際に導入された直後に発生することもあります。まだ行っていない場合は、Joe Celko がこの戦術について述べていることを確認してください。このアプローチがいかに厄介であるかをさらに証明することができます。あなたはこのサイトに来ることを知っていた賢明な人であり、あなたのデータベースの EAV テーブルを実行した有罪ではあるが善意の当事者ではないので、ここでやめておきます。

このタイプのテーブルを処理するためのオプションはきれいではなく、あなたが述べたように、本番クエリに必要なデータの量が増えるにつれて、それらは悪化/遅くなります。

  1. ログに記録されず、コミットされた行を保持する宣言済みグローバル一時テーブル (DGTT) を作成し、それを使用して、EAV テーブルのコンテンツの水平バージョンをステージングします。DGTT は、ロギングのオーバーヘッドが発生しないため、この種のデータ シャベルに適しています。

  2. 前の推奨事項で示したように、従来の CASE および MAX() グループ化を使用します。問題は、新しい TYPE が EAV テーブルに導入されるたびにクエリが変更されることです。

  3. DB2 の SQL-XML パブリッシング機能を使用して、垂直データを 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 を書き直す必要がないことです。

于 2009-07-02T06:29:45.880 に答える
0

小さなチャンクに分割し、すべてを 1 つのトランザクションにラップしないでください。最初にテーブルを作成してから、古いテーブルから新しいテーブルへの挿入のグループを実行します。ID の範囲ごとに挿入します。たとえば、データベースのログを圧倒したり、時間がかかりすぎたりしないように、十分に小さいチャンクで挿入します。

于 2009-07-01T15:43:03.537 に答える