Я храню большие векторы (1,4 миллиона значений) удвоений в таблице PostgreSQL. Заявление о создании этой таблицы следует.Улучшение производительности запросов массива PostgreSQL
CREATE TABLE analysis.expression
(
celfile_name character varying NOT NULL,
core double precision[],
extended double precision[],
"full" double precision[],
probeset double precision[],
CONSTRAINT expression_pkey PRIMARY KEY (celfile_name)
)
WITH (
OIDS=FALSE
);
ALTER TABLE analysis.expression ALTER COLUMN core SET STORAGE EXTERNAL;
ALTER TABLE analysis.expression ALTER COLUMN extended SET STORAGE EXTERNAL;
ALTER TABLE analysis.expression ALTER COLUMN "full" SET STORAGE EXTERNAL;
ALTER TABLE analysis.expression ALTER COLUMN probeset SET STORAGE EXTERNAL;
Каждая запись в этой таблице записывается только один раз и, возможно, много раз читается случайными индексами. PostgreSQL doesn't seem to scale terribly well for lookups as the vector length grows even with STORAGE set to EXTERNAL (O(n)). Это приводит к следующим запросам: мы выбрали много отдельных значений в массиве, очень, очень медленно (минуты - часы).
SELECT probeset[2], probeset[15], probeset[102], probeset[1007], probeset[10033], probeset[200101], probeset[1004000] FROM expression LIMIT 1000;
Если есть достаточно отдельных индексов, они могут быть даже медленнее, чем тянуть весь массив.
Есть ли способ сделать такие запросы быстрее?
редактирует
- Я использую PostgreSQL 9.3.
Все запросы я бегу простые ВЫБИРАЕТ возможно
SELECT probeset[2], probeset[15], probeset[102], probeset[1007], probeset[10033], probeset[200101], probeset[1004000] FROM expression JOIN samples s USING (celfile_name) WHERE s.study = 'x';
В одном сценарии результаты этих запросов будут кормить через модели прогнозирования. Вероятность прогноза сохраняется в БД в другой таблице. В других случаях элементы выбора вытягиваются из массивов для последующего анализа.
В настоящее время 1,4 млн. Является самым длинным одиночным массивом, остальные короче, с самым маленьким существом - 22 тыс., А среднее - ~ 100 тыс. Единиц.
- В идеале я бы сохранил данные массива в виде широкой таблицы, но с 1,4 миллионами записей это невозможно, а длинные таблицы (т.е. строки с celfile_name, index, value) намного медленнее, чем массивы PostgreSQL, если мы хотим вытащить полный массив из данных из БД. Мы делаем это, чтобы загрузить наши нисходящие хранилища данных, когда мы анализируем полный набор данных.
Я подозреваю, что Postgres должен прочитать весь массив перед выполнением каких-либо операций над ним. Возможно, вам лучше хранить значения в виде строк в таблице, даже если представление таблицы больше. –
Вы на самом деле не ** сохраняете свои большие массивы в PostgreSQL, вы только сохраняете ссылки на внешнее хранилище. Если вы не используете данные из массивов в запросах, которые объединяют их с данными из других отношений, использование PostgreSQL будет неэффективным. Как вы используете данные в PostgreSQL? Можете ли вы рассказать о том, что представляют данные в массивах (например, временные ряды?) И взаимосвязь между четырьмя массивами (f.i. - это данные с одним и тем же индексом в каждом связанном массиве?)? Все четыре массива 1.4M значения длинны или являются совокупным размером? – Patrick
Это должно быть очевидно для вопроса производительности, чтобы предоставить версию Postgres в использовании. Не нужно сначала спрашивать. –