Hallo Andreas!
Ich glaube wir reden die ganze Zeit aneinander vorbei:
Zum Thema Bitmap Index: Kann PostgreSQL “CREATE BITMAP INDEX name_index_idx ON tabellenname (feld1, feld2);” ???
Wenn ja, bitte um Link zur Doku! Ich habe bisher nur gefunden Bitmap Indexes - und btrees anzulegen in der Hoffnung der Optimizer wird immer magischerweise einen Bitmap HeapScan machen, von dem mehr an Speicherverbrauch durch Btrees ganz zu schweigen, finde ich das etwas spröde…
Davon mal abgesehen das das im Moment nicht das dringendste Problem ist (komme ich am Ende nochmal drauf).
Ja Nein Jein, ich habe hier kein OLTP System, sondern lang laufende Querys auf fetten Fakttabellen, die sich aus den kleinen Dimensionstabellen (die sie sich leider mit anderen Aggregat Fakten teilen) Informationen herauslesen. Was ich jetzt mache ist, die Dimensionsjoins vor den langlaufenden Fakttabellen Querys zu erledigen um sie in Sekunden “woanders” materialisieren zu lassen. Somit sind Locks und joins natürlich unterschiedliche Sachen, die ich aber im Zusammenhang sehen muss… das musste ich erstmal lernen… wie auch das es nicht wirklich die Locks sind, sondern die DB einfach mal dicht ist (siehe Post vorher)…
Aus fachlicher Sicht ist halt bei einem reinen select Statement eine Read Lock völlig überflüssig, da ich beim täglichen Load ODER bei der Abfrage drauf achte, das keine Daten heraus gelesen werden zu denen noch Änderungen passieren - h.h eine (sehr sinnvolle) Funktionlität des DBMS behindert mich…
Und dass hier ein hoch entwickeltes (O)RDBMS durch ein einwenig verkorkstes DB Design/Architektur, im Grunde genommen die Staging Area, die dafür nicht ausgelegt/vorgesehen ist, vergniedelt werden muss ist mir auch klar - nur kann ich es erstmal nicht ändern…
Rate mal was ich die ganze Zeit mache, aus einem 8h query ist nun noch ein Problem übrig geblieben (braucht zw. 2h und 4h):
explain select
bla_id,
user_id,
group_last(result_id) as result_id,
max(date_id) as date_id
from (
select
bla_id as bla_id
, user_id as user_id
, result_id as result_id
, date_id as date_id
from
partitions.irgendwas_2008_11_08
order by user_id, bla_id, result_id, timestamp
) tmp
group by bla_id, user_id, variable_result_id;
GroupAggregate (cost=87615745.28…91171486.64 rows=8000000 width=16)
→ Sort (cost=87615745.28…88188368.84 rows=229049424 width=16)
Sort Key: irgendwas_2008_11_08.bla_id, irgendwas_2008_11_08.user_id, irgendwas_2008_11_08.result_id
→ Sort (cost=45119031.86…45691655.42 rows=229049424 width=24)
Sort Key: irgendwas_2008_11_08.user_id, irgendwas_2008_11_08.bla_id, irgendwas_2008_11_08.result_id, irgendwas_2008_11_08.“timestamp”
→ Seq Scan on irgendwas_2008_11_08 (cost=0.00…3919669.24 rows=229049424 width=24)
(6 rows)
In der Detailtabelle gibt es zu jeder bla_id und user_id und Datum mehrere Einträge (1-n untersiedliche result_ids). Ich möchte daraus pro Datum, bla_id und user_id eine (die letzte) result_id haben.
Ich lasse mir gerne attestieren das das SQL grottig ist - irgendwelche Vorschläge?