Frage

Es ist mein Verständnis, dass NULL-Werte in DB2 nicht Wende sind, so gehen wir von einem riesigen Tisch (Verkäufe) mit einer Datumsspalte (sold_on) haben, die normalerweise ein Datum ist, ist aber gelegentlich (10% der Zeit) null.

Darüber hinaus nehmen wir an, dass es sich um eine Legacy-Anwendung ist, die wir nicht ändern können, so dass diese nulls bleiben und etwas bedeuten (wir Verkäufe sagen, die zurückgegeben wurden).

Wir können die folgende Abfrage schnell machen durch einen Index für die sold_on und insgesamt Spalten setzen

Select * from Sales 
where 
Sales.sold_on between date1 and date2
and Sales.total = 9.99

Aber ein Index nicht diese Abfrage macht schneller:

Select * from Sales 
where 
Sales.sold_on is null
and Sales.total = 9.99

Da die Indizierung auf dem Wert durchgeführt wird.

Kann ich Index nulls? Vielleicht durch den Indextyp zu ändern? Indexieren der Anzeigesäule?

War es hilfreich?

Lösung

Ich bin kein DB2-Experte, aber wenn 10% der Werte null ist, ich ein Index nicht, dass allein auf dieser Spalte wird jemals Ihre Abfrage helfen. 10% sind zu viele für die Verwendung eines Index zu stören - es wird nur einen Tabellenscan tun. Wenn Sie wurden etwa 2-3% sprechen, ich denke, es tatsächlich Ihren Index verwenden würde.

Denken Sie darüber nach, wie viele Datensätze sind auf einer Seite / Block - sagen wir 20. Der Grund, einen Index zu verwenden ist Abrufen von Seiten zu vermeiden, die Sie nicht benötigen. Die Wahrscheinlichkeit, dass eine gegebene Seite 0 Datensätze enthält, die null sind, ist (90%) ^ 20 oder 12%. Das sind keine gute Chancen - Sie 88% Ihrer Seiten brauchen werden sowieso geholt werden, indem der Index nicht sehr hilfreich ist

.

Wenn jedoch Ihre select-Klausel enthalten, nur wenige Spalten (und nicht *) - nur sagen salesid, werden Sie wahrscheinlich es einen Index auf (sold_on, salesid), als Lese der Datenseite wouldn verwenden zu können ‚t benötigt werden. - alle Daten im Index sein würden

Andere Tipps

Von wo haben Sie den Eindruck, dass DB2 nicht indizieren NULLs? Ich kann nichts in der Dokumentation oder Artikel finden, die Forderung zu unterstützen. Und ich ausgeführt nur eine Abfrage in einer großen Tabelle mit NULL-Einschränkung ist eine indexierte Spalte Beteiligung einen geringen Anteil an NULLs enthält; in diesem Fall verwendet DB2 sicherlich den Index (durch einen EXPLAIN verifiziert und durch die Beobachtung, dass die Datenbank sofort statt viel Zeit reagiert ein Tabellen-Scan durchzuführen).

So: Ich behaupte, dass DB2 kein Problem mit NULL-Werten in nicht-Primärschlüsselindizes hat

.

Aber wie andere geschrieben haben: Ihre Daten können in einer Art und Weise zusammengesetzt werden, in dem DB2 denkt, dass ein Index verwendet wird schneller nicht sein. Oder die Datenbank der Statistiken sind nicht up-to-date für die beteiligte Tabelle (n).

Als Faustregel ist, dass ein Index für Werte bis zu 15% der Datensätze nützlich ist. ... so könnte ein Index nützlich hier sein.

Wenn DB2 nicht Index Nullen, dann würde ich ein Booleschen Feld vorschlägt Hinzufügen IsSold, und es auf true gesetzt, wenn das sold_on Datum festgelegt wird (dies könnte in einem Trigger erfolgen).

Das ist nicht die schönste Lösung, aber es könnte sein, was Sie brauchen.

Troels korrekt ist; geraden Zeilen mit einem SOLD_ON Wert von NULL werden von einem Index auf dieser Spalte profitieren. Wenn Sie lagen im Bereich Suche auf SOLD_ON tun, können Sie sogar noch mehr profitieren, indem sie einen Clustered-Index erstellen, die mit SOLD_ON beginnt. In diesem speziellen Beispiel kann es nicht viel zusätzlichen Aufwand erfordert die Clustering, um auf SOLD_ON Basis zu halten, da neuere Zeilen hinzugefügt werden höchstwahrscheinlich ein neueres SOLD_ON Datum haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top