2012-04-05 12 views
0

Ich habe eine ziemlich komplexe TSQL SELECT Abfrage, die mehrere Joins dauert, die für ca. 8 Sekunden ausgeführt wird und ca. 300K Datensätze zurückgibt. Welches ist derzeit akzeptabel? Aber ich muss die Ergebnisse dieser Abfrage später mehrmals wiederverwenden, daher füge ich Ergebnisse der Abfrage in eine temporäre Tabelle ein. Die Tabelle wird im Voraus mit Spalten erstellt, die der Ausgabe der SELECT-Abfrage entsprechen. Aber sobald ich INSERT INTO ... SELECT mache - die Ausführungszeit verdoppelt sich auf mehr als 20 Sekunden! Ausführungspläne zeigen, dass 46% der Abfragekosten zu "Tabellen einfügen" und 38% zu Tabellenspool (Eager Spool) gehen.(TSQL) INSERT Verdoppelungszeit der Abfrage

Irgendeine Idee, warum das passiert und wie man es beschleunigt?

Danke!

+1

Sie verwenden die "Tempdb", wenn Sie die Einfügung in die temporäre Tabelle - das dauert auch Ressourcen ... – Oded

+0

Ich verstehe das, aber ich muss dies beschleunigen. Ich habe auch SELECT INTO anstelle von INSERT INTO versucht - und das erhöhte Zeit nur 2 Sekunden - was viel schneller ist ... Seltsam. –

+0

Haben Sie einen Index für die temporäre Tabelle deklariert? Fügen Sie die Datensätze der Reihe nach ein? – Oded

Antwort

1

Das "Warum" davon schwer zu sagen, würden wir viel mehr Informationen benötigen. (obwohl mein SWAG wäre, dass es mit der Protokollierung zu tun hat ...)

Allerdings ist die Lösung, 9 mal aus 10 SELECT INTO, um Ihre temporäre Tabelle zu machen.

+0

Yup es ist schneller definiert. Die Verwendung dieser Funktion zusammen mit keinen Locks gab einen deutlichen Schub. –

+0

(No Locks) hat keine Auswirkungen auf Anweisungen wie SELECT INTO und INSERT. – RBarryYoung

0

Ich würde mit der Suche nach Standard-Tuning-Items beginnen. Läuft die Festplatte? Sind genügend Ressourcen (IOs, RAM, CPU, etc.) vorhanden? Gibt es im RDBMS einen Engpass? Klingt nach dem Problem, aber was passiert mit dem Sperren? Gibt anderer Code ähnliche Ergebnisse? Ist anderer Code performant?

1

Ein paar Dinge, die ich vorschlagen kann, basierend auf den von Ihnen bereitgestellten Informationen. Wenn Sie nicht kümmern uns um schmutzig liest, könnte man immer die Transaktionsisolationsstufe ändern (wenn Sie mit MS T-SQL)

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
select ... 

Diese Dinge auf Ihre erste Abfrage beschleunigen können als Schleusen nicht brauchen auf die Daten durchgeführt werden, von denen Sie abfragen. Wenn Sie keinen SQL-Server verwenden, führen Sie eine Google-Suche durch, um dasselbe mit der von Ihnen verwendeten Technologie zu erreichen.

Für den Einfügeabschnitt haben Sie angegeben, dass Sie in eine temporäre Tabelle einfügen. Unterstützt Ihre Datenbank das Hinzufügen von Primärschlüsseln oder Indizes für Ihre temporäre Tabelle? Wenn dies der Fall ist, haben Sie eine Dummy-Spalte, die eine indizierte Spalte ist. Haben Sie auch versucht, eine reguläre Datenbanktabelle zu verwenden? Abhängig von Ihrer Konfiguration ist es möglich, dass Sie mit dieser Option Ihre Einfügezeiten beschleunigen.

+0

Entfernen der Verriegelung geholfen, danke! –