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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage