Hier ist die Abfrage:
SELECT "products".*
FROM "products"
WHERE (status > 100)
AND "products"."above_revenue_average" = 't'
AND ("products"."category_id" NOT IN (5))
ORDER BY "products"."start_date" DESC
Ich habe einen Index für status
und start_date
.
Jedes Mal, wenn ich die Abfrage in meiner Anwendung ausführe, wird in den Protokollen Folgendes angezeigt:
[WHITE] temporary file:
path "pg_tblspc/16386/PG_9.3_201306121/pgsql_tmp/pgsql_tmp2544.0", size 37093376
Query: SELECT "products".* FROM "products" WHERE (status > 100)
AND "products"."above_revenue_average" = 't'
AND ("products"."category_id" NOT IN (5)) ORDER BY "products"."start_date" DESC
Ich glaube, diese temporäre Dateierstellung ist die Ursache für die langsame Leistung.
Beim Ausführen eines EXPLAIN ANALYZE
bekomme ich folgende Ergebnisse:
QUERY PLAN
Sort (cost=63395.28..63403.51 rows=16460 width=524)
(actual time=524.134..562.635 rows=65294 loops=1)
Sort Key: start_date
Sort Method: external merge Disk: 36224kB
-> Bitmap Heap Scan on products
(cost=4803.40..60389.73 rows=16460 width=524)
(actual time=27.390..397.879 rows=65294 loops=1)
Recheck Cond: (status > 100)
Filter: (above_revenue_average AND (category_id <> 5))
Rows Removed by Filter: 25115
-> Bitmap Index Scan on index_products_on_status
(cost=0.00..4802.58 rows=89662 width=0)
(actual time=18.006..18.006 rows=90411 loops=1)
Index Cond: (status > 100)
Total runtime: 577.870 ms
(10 rows)
Ich habe dann http://explain.depesz.com/ verwendet , um es ein bisschen lesbarer zu machen:
Statistiken pro Knotentyp
+-------------------+-------+--------------+------------+
| node type | count | sum of times | % of query |
+-------------------+-------+--------------+------------+
| Bitmap Heap Scan | 1 | 379.873 ms | 67.5 % |
| Bitmap Index Scan | 1 | 18.006 ms | 3.2 % |
| Sort | 1 | 164.756 ms | 29.3 % |
+-------------------+-------+--------------+------------+
Pro Tabelle Statistiken
+------------------+------------+--------------+------------+
| Table name | Scan count | Total time | % of query |
+------------------+------------+--------------+------------+
| scan type | count | sum of times | % of table |
| products | 1 | 379.873 ms | 67.5 % |
| Bitmap Heap Scan | 1 | 379.873 ms | 100.0 % |
+------------------+------------+--------------+------------+
Kann ich die Datenbankleistung durch Hinzufügen weiterer Indizes erhöhen? Vielleicht einige zusammengesetzte? Irgendwelche Ideen?
EXPLAIN (BUFFERS, ANALYZE)
Erzeugt weitere für den Fall relevante Informationen (wie in den Tag-Informationen für [postgresql-performance] angegeben . Bitte geben Sie immer Ihre Version von Postgres an. Außerdem sagt uns eine einzelne Abfrage nicht, welche Ihrer Prädikate ( WHERE
Bedingungen) unveränderlich sind und welche variieren (Auf welche Weise?) Wir können nicht ernsthaft raten, wie Indizes ohne weitere Informationen optimiert werden können.