Ich habe eine Tabelle mit ungefähr 100 Millionen Zeilen. Es werden nur einmal pro Tag Daten eingefügt, aber wir müssen selectviel tun . Die selects sind normalerweise einfach, müssen aber manchmal Hunderttausende von Zeilen zurückgeben.
Es ist einzigartig basiert auf drei Säulen node_id, pricedate, hourdie integer sind, Zeitstempel, integer sind. Es war für die meisten Abfragen langsam, aber ich habe es gruppiert node_id, pricedateund das hat die Langsamkeit für die meisten Abfragen behoben. Diese Abfragen waren vom Typ:
select * from mytable where node_id in (1,2,3,4)
Gelegentlich müssen wir noch Fragen stellen wie:
select * from mytable where pricedate>='2016-05-01'
Diese sind immer noch langsam, da sie zuerst geclustert werden node_id. Wir haben bereits einen Index pricedate. Das Problem ist, dass die Benutzer häufig genügend Daten benötigen, damit die Abfrage-Engine den Index auslöst und einen seq-Scan verwendet. Sobald ein seq-Scan verwendet wird, profitiert es erheblich davon, dass die Daten so geclustert werden, wie sie abgefragt werden. Dies führt zu dem Problem, bei dem einige Abfragen von einem Clustering und andere von dem anderen profitieren:
Es wäre schön, wenn es eine Möglichkeit gäbe, zwei physische Kopien der Tabelle zu erstellen, bei denen eine Kopie auf die eine und die andere auf eine andere Weise gruppiert wird, der Benutzerzugriff darauf jedoch so aussieht, als gäbe es nur eine Tabelle, und die DB-Engine würde dies sicherstellen sind synchron. Natürlich würde dies Schreibstrafen nach sich ziehen, aber das ist für unsere Verwendung unerheblich.
Wäre so etwas möglich?
Ich vermute, es gibt keine eingebaute Möglichkeit, das zu tun, was ich beschreibe. Um es trotzdem zu tun, würde ich wahrscheinlich eine Tabelle erstellen, die mytable_dupmit der gleichen eindeutigen Schlüsselbeschränkung aufgerufen wird , aber mit dem alternativen Clustering, und dann Trigger einrichten, um sie einzufügen, wenn der Master eingefügt / aktualisiert / gelöscht wird. Das scheint machbar, aber von hier aus gibt es einen vernünftigen Weg selectvon der duplizierten Tabelle, der effizient ist?
Ich verwende PostgreSQL 9.4 zu Hause und 9.5 bei Google.