Ich verwende MS SQL und muss mehrere Abfragen in derselben Tabelle nach unterschiedlichen Kriterien ausführen. Zuerst habe ich jede Abfrage in der Originaltabelle ausgeführt, obwohl alle eine gewisse Filterung aufweisen (dh Datum, Status). Dies hat viel Zeit in Anspruch genommen (ca. 2 Minuten).
Es gibt Duplikate in Datenzeilen, und alle Indizes sind NICHT CLUSTERED. Ich interessiere mich nur für 4 Spalten für meine Kriterien und das Ergebnis sollte nur die Anzahl für alle Abfragen ausgeben.
Spalten benötigt: TABLE
, FIELD
, AFTER
, DATE
, und ein Index von auf jedem ist DATE
und TABLE
.
Nachdem ich eine temporäre Tabelle mit nur den Feldern erstellt hatte, die ich benötige, ging es auf 1:40 Minuten zurück, was immer noch sehr schlecht ist.
CREATE TABLE #TEMP
(
TABLE VARCHAR(30) NULL,
FIELD VARCHAR(30) NULL,
AFTER VARCHAR(1000) NULL,
DATE DATETIME,
SORT_ID INT IDENTITY(1,1)
)
CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID)
INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE)
SELECT TABLE, FIELD, AFTER, DATE
FROM mytbl WITH (NOLOCK)
WHERE TABLE = 'OTB' AND
FIELD = 'STATUS'
Führen Sie dies aus -> (216598 betroffene Zeile (n))
Da nicht alle Abfragen vom Datumsbereich abhängen, habe ich ihn nicht in die Abfrage aufgenommen. Das Problem ist, dass das Einfügen nur deutlich länger als 1 Minute dauert . Der obige Einsatz dauerte 1:19 Minuten
Ich möchte so etwas für mehrere Abfragen ausführen:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
Es ist ein Problem mit dem Einfügen mehr als das der Auswahl, aber die Temperatur hat viel weniger Zeilen als die ursprüngliche Tabelle, was besser sein könnte, als die Tabelle mehrmals durchzugehen.
Wie kann ich das optimieren?
BEARBEITEN
Ich habe die Sortier-ID entfernt und dachte, das Problem liege hauptsächlich in der Auswahl und nicht in der Einfügung. Es war eine Vermutung.
Ich kann für keinen Index ein eindeutiges Feld erstellen, da es keine eindeutigen Felder oder Zeilen gibt.
Ich verwende SQL Server 2012.
Tabelleninfo : Es ist ein Haufen und hat die folgende Speicherplatznutzung:
name rows reserved data index_size unused
mytbl 24869658 9204568 KB 3017952 KB 5816232 KB 370384 KB
SELECT COUNT(*) AS COUNT FROM original_table WHERE AFTER = 'R' AND DATE >= '2014-01-01' AND DATE < '2015-01-01'
, warum versuchen Sie nicht, jede (Abfrage) separat zu optimieren? Dürfen Sie der Tabelle keine Indizes hinzufügen?
TABLE
und FIELD
Spalten aus der #temp
Tabelle entfernen (alle Zeilen haben schließlich TABLE = 'OTB' AND FIELD = 'STATUS'
für die spezifische temporäre Tabelle.)
CREATE TABLE
Anweisung). Die Abwahl erfolgte, weil die Frage nicht klar war.