Есть несколько вещей, которые вы могли бы / должны сделать.Во-первых:
SELECT SUM(a.deure)-SUM(a.haver) as Value
SUM()
будет касаться каждой строки, которая соответствует ... никоим образом не INDEX
этой операции.
FROM assentaments a, comptes c
При отладке запросов мне легчеиспользуйте натуральный JOIN
вместо явного JOIN
.Планировщик запросов высвобождается немного чаще, и часто выбор становится лучшим.Это не тот случай, просто общий комментарий, однако.Вот где есть вероятные несоответствия между вашими INDEX
и вашим запросом.
WHERE TRUE = TRUE
AND a.compte_id = c.id
AND c.empresa_id = 2
AND c.nivell = 11
Из этих трех запросов у вас есть следующие INDEX
:
CREATE INDEX "index_multiple" ON"public". "comptes" ИСПОЛЬЗОВАНИЕ btree (codi_compte ASC NULLS LAST, empresa_id ASC NULLS LAST, nivell ASC NULLS LAST);
Разбейте это на части, поскольку это не UNIQUE INDEX
, вы не должны видетьлюбое изменение в целостности ваших данных.Причина, по которой я это предлагаю, заключается в том, что я предполагаю, что codi_compte
имеет низкую мощность.Я предполагаю, что empresa_id
будет иметь большую мощность.В общем, создайте свои INDEX
от наивысшей мощности до наименьшего.
Я подозреваю, что три INDEX
будут быстрее выполнять растровое или хеш-соединение.Суть проблемы в том, что PostgreSQL (возможно, правильно) считает, что выполнение index_scan
более дорого, чем seq_scan
.
AND (a.data >='2007-01-01' AND a.data <='2007-01-31')
AND c.codi_compte LIKE '6%';
INDEX
на a.data
также может быть полезнымпотому что PostgreSQL, скорее всего, будет делать index_scan
на указанную дату в зависимости от количества строк в таблице assentaments
.
CREATE INDEX "index_codi_compte" ON "public"."comptes" USING btree(codi_compte ASC NULLS LAST);
CREATE INDEX "index_comptes" ON "public"."comptes" USING btree(codi_compte ASC NULLS LAST);
Я не знаю, почему у вас это INDEX
дважды.
CREATE INDEX "index_multiple" ON "public"."comptes" USING btree(codi_compte ASC NULLS LAST, empresa_id ASC NULLS LAST, nivell ASC NULLS LAST);
Как указано выше, разбить это INDEX
друг от друга.
CREATE INDEX "index_nivell" ON "public"."comptes" USING btree(nivell ASC NULLS LAST);
То, что INDEX
в порядке.
Быстрый совет:
SELECT matching, total, matching / total AS "Want this to be a small number"
FROM
(SELECT count(*)::FLOAT AS matching FROM tbl WHERE col_id = 1) AS matching,
(SELECT count(*)::FLOAT AS total FROM tbl) AS total;
matching rows | total rows | want this to be a small number
---------------+------------+--------------------------------
1 | 10 | 0.1
(1 row)
Где третий столбец в идеале равен 1/total
.