При выборе столбцов из таблицы MySQL, ....
Представьте себе таблицу со следующей структурой в PostgreSQL 9.0:
create table raw_fact_table (text varchar(1000));
Для упрощения я упоминаю только один текстовый столбец, на самом деле его дюжина. В этой таблице 10 миллиардов строк, и в каждом столбце много дубликатов. Таблица создается из плоского файла (csv) с помощью COPY FROM.
Чтобы повысить производительность, я хочу преобразовать в следующую структуру звездообразной схемы:
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"