PostgreSQL 9.0 で次の構造を持つテーブルを想像してください。
create table raw_fact_table (text varchar(1000));
簡単にするために、1 つのテキスト列だけを取り上げますが、実際には 12 のテキスト列があります。このテーブルには 100 億行あり、各列には多くの重複があります。テーブルは、COPY FROM を使用してフラット ファイル (csv) から作成されます。
パフォーマンスを向上させるために、次のスター スキーマ構造に変換したいと考えています。
create table dimension_table (id int, text varchar(1000));
ファクト テーブルは、次のようなファクト テーブルに置き換えられます。
create table fact_table (dimension_table_id int);
私の現在の方法は、基本的に次のクエリを実行してディメンション テーブルを作成することです。
Create table dimension_table (id int, text varchar(1000), primary key(id));
次に、使用するディメンション テーブルを作成します。
insert into dimension_table (select null, text from raw_fact_table group by text);
その後、次のクエリを実行する必要があります。
select id into fact_table from dimension inner join raw_fact_table on (dimension.text = raw_fact_table.text);
すべての文字列を他のすべての文字列と数回比較することで得られる恐ろしいパフォーマンスを想像してみてください。
MySQL では、COPY FROM 中にストアド プロシージャを実行できました。これにより、文字列のハッシュが作成され、その後のすべての文字列比較は、長い生の文字列ではなくハッシュに対して行われます。これは PostgreSQL ではできないようですが、どうすればよいですか?
サンプル データは、次のようなものを含む CSV ファイルになります (整数と倍精度も引用符で囲みます)。
"lots and lots of text";"3";"1";"2.4";"lots of text";"blabla"
"sometext";"30";"10";"1.0";"lots of text";"blabla"
"somemoretext";"30";"10";"1.0";"lots of text";"fooooooo"