Wenn Sie eine Spalte haben, nach der Sie häufig eine Tabelle abfragen, sollten Sie normalerweise einen Index darauf kleben. Aber lohnt es sich auch, eine Tabelle nach dieser Spalte zu partitionieren, wenn alle möglichen Werte im Voraus bekannt sind? Angenommen , Sie haben eine Tabelle AUDITmit einer TenantIdSpalte, die nur Werte enthalten kann: 1, 2 .
Alle SELECT Anweisungen hätten eine WHEREKlausel mit einem TenantIdParameter.
Wäre es also vorteilhaft, diese Tabelle nach TenantId zu partitionieren ? Wenn ja, würden Sie auch einen Index für die TenantIdSpalte erstellen ?
partition by list (TENANTID)
(
partition TENANT1 values (1),
partition TENANT2 values (2)
)
Ich habe ein kleines Experiment durchgeführt: 1 Million Datensätze mit zufällig generierter TenantId eingefügt, wodurch Folgendes erstellt wurde:
- 499652 Datensätze mit TenantId = 1
- 500348 Datensätze mit TenantId = 2
Hier sind die Abfragepläne für die Anweisung:
SELECT * FROM table1 WHERE TENANTID=2
Einfache Tabelle (keine Indizes, keine Partitionen)
Bitmap-Index:
Partitionen:

Übrigens, wenn ich sowohl den Index als auch die Partitionen habe, verwendet der Abfrageplan eine Partition und keinen Index, daher sieht der Plan genauso aus wie der oben gezeigte zweite.
Natürlich gewinnt die Partition, aber doch? Anscheinend ist die Kostenspalte in einem Ausführungsplan keine zuverlässige Methode, um die tatsächlichen Kosten einer Antwortzeit für SQL-Anweisungen zu beurteilen .
Also, was ist dann der beste Weg? Wie wählt man einen über den anderen?