Dies ist für Firebird 2.5.Firebird SQL-Index für mehrere Spalten
Ich habe eine Tabelle T mit einem Index aus 2 Spalten, sagen ColA und ColB. Wenn ich tue: SELECT * FROM T WHERE ColA=...
, so dass die WHERE-Klausel nur für Spalte A ist, wird Firebird einen Standardwert für die Spalte ColB setzen und den Index refinanzieren, oder kann er überhaupt diesen Index nicht verwenden?
Ein bisschen Kontext: Ich mache ein DB-Upgrade. Hier ist was ich habe:
CREATE TABLE user(
newid BIGINT NOT NULL,
oldid BIGINT NOT NULL,
anotherCol INT);
CREATE INDEX idx ON user(oldid, anotherCol);
CREATE TABLE order(
RefUser BIGINT);
order.RefUser waren oldid und ich muss sie zu neuid ändern. Ich benutze es diese Abfrage:
UPDATE order o SET o.refuser = (SELECT u.newid FROM user u WHERE u.oldId = o.refuser);
Zu diesem Zeitpunkt oldid ist immer noch einzigartig, aber später auf der Einzigkeit nur für (oldid, anotherCol) guaranted werden, daher den Index und die Schaffung von newid .
Benutzer Tabelle ist ein paar Millionen von Datensätzen, Auftragstabelle ist ein paar Dutzend Millionen: Diese Abfrage dauert mehr als eine Stunde. Ich würde gerne sehen, wie man es verbessern kann (nicht daran interessiert, einen kritischen Dienst für diese Zeitspanne abzuschalten).
Wenn für die Spalten A und B ein Index in dieser Reihenfolge vorhanden ist, verwendet der FB diesen Index, wenn WHERE Bedingungen mit A oder mit A und B gleichzeitig enthält. Der Index wird jedoch nicht verwendet, wenn nur die B-Spalte in der WHERE-Klausel vorhanden ist . –
@Andrej: ja Index ist auf A, B, und nur A ist in meiner WHERE-Klausel .. Also von dem, was Sie sagen Firebird wird den Index verwenden ... Also keine Optimierung von dieser Seite ... Vielen Dank für Diese präzise Antwort! – SoyonsPrecis
@SoyonsPrecis Sie könnten einfach einen Test machen: PREPARE Ihre Abfrage und lesen Sie ihre Ausführung PLAN - gewährt, ob dieser Index verwendet werden würde oder nicht würde von Firebird nach dem bestimmten Datum in der Tabelle entschieden werden (aka Index SELECTIVITY). Aber allgemeine Regel ist, dass zusammengesetzte Indizes möglicherweise für jede Teilmenge der ersten Spalten verwendet werden, A oder A & B oder A & B & C usw. –