Я довольно новичок в SQL, и я пытаюсь решить, как ускорить сложный SQL-запрос в postgres, возможно, улучшив мое использование индексов. Это запрос:Как я могу ускорить этот SQL-запрос?
SELECT
(SELECT ev.code FROM classification_item ci, enumeration_value ev
WHERE ev.key_id = :ak_0
AND ci.entry_id = t.id AND ci.value_id = ev.id) AS axis_0,
(SELECT ev.code FROM classification_item ci, enumeration_value ev
WHERE ev.key_id = :ak_1
AND ci.entry_id = t.id AND ci.value_id = ev.id) AS axis_1,
SUM(t.amount) as amount,
(SELECT ev.code FROM classification_item ci, enumeration_value ev
WHERE ev.key_id = :key_time_id
AND ci.entry_id = t.id AND ci.value_id = ev.id) AS time
FROM "entry" t
WHERE t.dataset_id = :dataset_id
AND t.id IN (SELECT ci.entry_id FROM classification_item ci, enumeration_value ev
WHERE ev.key_id = :k_0
AND ev.code = :v_0 AND ci.value_id = ev.id)
GROUP BY time, axis_0, axis_1
Это в основном схема базы данных (как определено в Пилоны):
table_dataset = Table('dataset', meta.metadata,
Column('id', Integer, primary_key=True),
)
table_entry = Table('entry', meta.metadata,
Column('id', Integer, primary_key=True),
Column('dataset_id', Integer, ForeignKey('dataset.id')),
Column('amount', Float()),
)
table_classification_item = Table('classification_item', meta.metadata,
Column('id', Integer, primary_key=True),
Column('entry_id', Integer, ForeignKey('entry.id'), index=True),
Column('value_id', Integer, ForeignKey('enumeration_value.id'), index=True)
)
table_enumeration_value = Table('enumeration_value', meta.metadata,
Column('id', Integer, primary_key=True),
Column('key_id', Integer, ForeignKey('key.id'), index=True),
Column('code', UnicodeText(), index=True),
)
И это имеет индексы следующим образом:
"dataset_pkey" PRIMARY KEY, btree (id)
"entry_pkey" PRIMARY KEY, btree (id)
"classification_item_pkey" PRIMARY KEY, btree (id)
"ix_classification_item_entry_id" btree (entry_id)
"ix_classification_item_value_id" btree (value_id)
"enumeration_value_pkey" PRIMARY KEY, btree (id)
"ix_enumeration_value_code" btree (code)
"ix_enumeration_value_key_id" btree (key_id)
я упускаю какой-либо очевидный индекс, который ускорит запрос? В частности:
- Следует ли использовать «кластерные» индексы?
- Должен ли я также индексировать
amount
наentry
, или это не имеет значения дляSUM(t.amount) as amount
?
Благодарим за помощь. Я знаю, что это довольно сложный вопрос, поэтому, пожалуйста, скажите, могу ли я сделать что-нибудь, чтобы улучшить его.
------ ОБНОВЛЕНИЕ --------------
The output from EXPLAIN ANALYZE на приведенном выше запросе.
было бы полезно, если вы выкладываете объяснить план –
Как правило, вы всегда должны иметь кластерные индексы. Есть редкие исключения, но они ** действительно ** редки. – JNK
Извините, мне кажется, я немного смущен тем, что на самом деле представляет собой «кластеризованный» индекс. Являются ли индексы, которые у меня выше, фактически сгруппированы? Мне было интересно, могу ли я создать «совместный» индекс по двум клавишам сразу ... – AP257