Оптимизация SQL-запроса с проверкой специальных правил - PullRequest
0 голосов
/ 13 июля 2010

(Прежде всего, извините за мой английский. Я не являюсь носителем языка)

У меня проблема с выбором данных.

Моя проблема в том, что я неНе знаю, как оптимизировать SELECT из таблицы «компонент».Как я понимаю, я не могу создать индексы, которые помогут Postgres сделать выбор на основе набора правил из другой таблицы.

У меня есть следующая схема: Компонент может иметь несколько параметров и одного владельца.Параметры и владельцы могут быть добавлены в любые группы.Есть несколько конвейеров, где эти компоненты должны появиться.Существуют специальные правила фильтрации, основанные на группах и владельцах компонентов.Это правило может разрешить компонент или заблокировать его.Правила могут быть любым числом, и для них может быть применена дополнительная логика.

Таблица «компонент» может содержать большой объем данных.Каждый конвейер должен обрабатывать компоненты по частям (или по страницам).

Знайте, что я делаю так: 1.Введите идентификатор конвейера и выберите все его правила во временной таблице.2. Пройдите через все компоненты и вызовите мою функцию для каждого, который принимает component_id и owner_id, и используйте временную таблицу из шага 1 для проверки правил.

выглядит так:

SELECT *
FROM component
WHERE check_rules(component_id, owner_id)
LIMIT p_limit OFFSET p_offset

Но в этомcase Postgres каждый раз должен просматривать все записи в таблице, что снижает производительность.Эта структура должна работать в среде высокой нагрузки с большим объемом данных.Поэтому мне нужен способ оптимизировать эту ситуацию или иметь возможность ее масштабировать.Вероятно, использование Postgres в этом случае не является хорошим решением, и мне нужно использовать какую-то другую систему (например, MapReduce или BigTable, но я не работаю с ними).

Порекомендуйте что-нибудь, пожалуйста.Большое спасибо.

Вот некоторый SQL-код, если мне сказали, что он неясен.

CREATE TABLE component(
    component_id int,
    component_name varchar,
    owner_id int);

CREATE TABLE parameter(
    parameter_id int,
    name varchar);

–component can have several parameters
CREATE TABLE component_parameter(
    component_id int,
    parameter_id int);

--tables for grouping parameters and owners 
CREATE TABLE parameter_group(
    group_id int,
    parameter_id int);

CREATE TABLE owner_group(
    group_id int,
    owner_id int)

CREATE TABLE conveyor(
    conveyor_id int,
    conveyor_name varchar)

CREATE TABLE conveyor_rule(
    conveyor_id int,
    rule_id int,
    allow_work boolean)

CREATE TABLE conveyor_rule_item(
    rule_id int,
    parameter_group_id int,
    owner_group_id int)

1 Ответ

0 голосов
/ 15 июля 2010

Я бы предложил избавиться как от функции в WHERE-операторе, так и от использования временных таблиц.Вместо них попробуйте использовать ВНУТРЕННИЕ СОЕДИНЕНИЯ.Если это невозможно, попробуйте хотя бы одну из них убрать, например, создав временную таблицу и присоединившись к ней, или создайте функцию, которая не использует временную таблицу.

...