PostgreSQL-Abfrage dauert zu lange
Ich habe eine Datenbank mit einigen hundert Millionen Zeilen. Ich führe die folgende Abfrage aus:
select * from "Payments" as p
inner join "PaymentOrders" as po
on po."Id" = p."PaymentOrderId"
inner join "Users" as u
On u."Id" = po."UserId"
INNER JOIN "Roles" as r
on u."RoleId" = r."Id"
Where r."Name" = 'Moses'
LIMIT 1000
Wenn die where-Klausel eine Übereinstimmung in der Datenbank findet, erhalte ich das Ergebnis in einigen Millisekunden, aber wenn ich die Abfrage ändere und eine nicht vorhandene spezifizierer."Name"
In der WHERE-Klausel dauert das Ausfüllen zu lange. Ich vermute, dass PostgreSQL einen sequentiellen Scan auf dem ausführtPayments
Tabelle (die die meisten Zeilen enthält), wobei jede Zeile einzeln verglichen wird.
Ist postgresql nicht schlau genug, um zuerst zu prüfen, obRoles
Tabelle enthält jede Zeile mitName
'Moses'
?
Die Rollentabelle enthält nur 15 Zeilen, während Zahlungen ~ 350 Millionen enthalten.
Ich verwende PostgreSQL 9.2.1.
Übrigens benötigt dieselbe Abfrage für dasselbe Schema / dieselben Daten 0,024 ms, um auf MS SQL Server ausgeführt zu werden.
Ich werde die Frage aktualisieren und in ein paar Stunden EXPLAIN ANALYZE-Daten veröffentlichen.
Hier erklären wir die Analyseergebnisse:http://explain.depesz.com/s/7e7
Und hier ist die Serverkonfiguration:
version PostgreSQL 9.2.1, compiled by Visual C++ build 1600, 64-bit
client_encoding UNICODE
effective_cache_size 4500MB
fsync on
lc_collate English_United States.1252
lc_ctype English_United States.1252
listen_addresses *
log_destination stderr
log_line_prefix %t
logging_collector on
max_connections 100
max_stack_depth 2MB
port 5432
search_path dbo, "$user", public
server_encoding UTF8
shared_buffers 1500MB
TimeZone Asia/Tbilisi
wal_buffers 16MB
work_mem 10MB
Ich verwende postgresql auf einer i5-CPU (4 Kerne, 3,3 GHz), 8 GB RAM und einer Crucial m4 SSD mit 128 GB
AKTUALISIEREN Dies sieht aus wie ein Fehler im Abfrageplaner. Mit der Empfehlung von Erwin Brandstetter habe ich es gemeldetMailing-Liste mit Postgresql-Fehlern.