Was ist der Unterschied zwischen der Verwendung
SELECT ... INTO MyTable FROM...
und
INSERT INTO MyTable (...)
SELECT ... FROM ....
?
Aus BOL [ INSERT , SELECT ... INTO ] weiß ich, dass mit SELECT ... INTO die Einfügetabelle für die Standarddateigruppe erstellt wird, sofern diese noch nicht vorhanden ist, und dass die Protokollierung für diese Anweisung von der Wiederherstellung abhängt Modell der Datenbank.
- Welche Aussage ist vorzuziehen?
- Gibt es andere Auswirkungen auf die Leistung?
- Was ist ein guter Anwendungsfall für SELECT ... INTO über INSERT INTO ...?
Bearbeiten: Ich habe bereits angegeben, dass ich weiß, dass SELECT INTO ... eine Tabelle erstellt, in der es nicht existiert. Ich möchte wissen, dass SQL diese Anweisung aus einem bestimmten Grund enthält. Was ist das? Tut es etwas anderes hinter den Kulissen, um Zeilen einzufügen, oder ist es nur syntaktischer Zucker über einem CREATE TABLE
und INSERT INTO
.
sql-server
tsql
sql-server-2008
Jowenece
quelle
quelle
INSERT INTO
Zwei Schlüsselwörter (select & into) stehen ganz vorne, die die Welt wissen lassen, dass dies keine gewöhnliche SQL-Anweisung ist, während sieSELECT ... INTO
zumindest wie eine gewöhnliche SQL-Anweisung aussieht. Ein kleiner Grund, den ersteren zu bevorzugen.Antworten:
Sie machen verschiedene Dinge. Verwenden Sie diese Option,
INSERT
wenn die Tabelle vorhanden ist. Verwenden Sie,SELECT INTO
wenn dies nicht der Fall ist.Ja.
INSERT
ohne Tabellenhinweise wird normalerweise protokolliert.SELECT INTO
wird minimal protokolliert, vorausgesetzt, dass die richtigen Ablaufverfolgungsflags gesetzt sind.Nach meiner Erfahrung
SELECT INTO
wird es am häufigsten mit Zwischendatensätzen wie#temp
Tabellen oder zum Kopieren einer gesamten Tabelle wie für eine Sicherung verwendet.INSERT INTO
wird verwendet, wenn Sie in eine vorhandene Tabelle mit bekannter Struktur einfügen.BEARBEITEN
Um Ihre Bearbeitung zu adressieren, machen sie verschiedene Dinge. Wenn Sie eine Tabelle erstellen und die Struktur definieren möchten, verwenden Sie
CREATE TABLE
undINSERT
. Beispiel für ein Problem, das erstellt werden kann: Sie haben eine kleine Tabelle mit einem Varchar-Feld. Die größte Zeichenfolge in Ihrer Tabelle ist jetzt 12 Byte. Ihr realer Datensatz benötigt bis zu 200 Bytes. Wenn SieSELECT INTO
aus Ihrer kleinen Tabelle eine neue erstellen,INSERT
schlägt die spätere mit einem Kürzungsfehler fehl, da Ihre Felder zu klein sind.quelle
CREATE TABLE
und dannINSERT INTO
ist es auch einfacher, dieSELECT
Anweisung selbst zu testen , ohne die Einfügung auszuführen.SELECT INTO
, um eine temporäre Tabelle zu erstellen oder eine schnelle Sicherung einer vorhandenen Tabelle zu erstellen, mit der ich Affen spielen werde.CREATE
trotzdem eine Aussage machen.Welche Aussage ist vorzuziehen? Kommt darauf an, was du tust.
Gibt es andere Auswirkungen auf die Leistung? Wenn es sich bei der Tabelle um eine permanente Tabelle handelt, können Sie zum Zeitpunkt der Tabellenerstellung Indizes erstellen, was sich sowohl negativ als auch positiv auf die Leistung auswirkt. Durch Auswahl von werden keine Indizes neu erstellt, die für aktuelle Tabellen vorhanden sind. Daher kann die spätere Verwendung der Tabelle langsamer sein als erforderlich.
Was ist ein guter Anwendungsfall für SELECT ... INTO über INSERT INTO ...? Die Auswahl in wird verwendet, wenn Sie die Tabellenstruktur möglicherweise nicht im Voraus kennen. Es ist schneller zu schreiben als eine Tabelle und eine Einfügeanweisung zu erstellen, daher wird es manchmal verwendet, um die Entwicklung zu beschleunigen. Es ist oft schneller zu verwenden, wenn Sie eine schnelle temporäre Tabelle zum Testen von Dingen oder eine Sicherungstabelle einer bestimmten Abfrage erstellen (möglicherweise Datensätze, die Sie löschen möchten). Es sollte selten vorkommen, dass es in Produktionscode verwendet wird, der mehrmals ausgeführt wird (mit Ausnahme von temporären Tabellen), da es fehlschlägt, wenn die Tabelle bereits vorhanden war.
Es wird manchmal unangemessen von Menschen verwendet, die nicht wissen, was sie tun. Und sie können infolgedessen Chaos in der Datenbank verursachen. Ich halte es für unangemessen, SELECT INTO für etwas anderes als eine Wegwerftabelle zu verwenden (eine temporäre Sicherung, eine temporäre Tabelle, die am Ende des gespeicherten Prozesses verschwindet usw.). Permanente Tabellen erfordern echte Überlegungen zu ihrem Design. Mit SELECT INTO können Sie leicht vermeiden, an etwas zu denken, das so grundlegend ist wie die Spalten und Datentypen.
Im Allgemeinen bevorzuge ich die Verwendung der Anweisung create table und insert - Sie haben mehr Steuerelemente und es ist besser für wiederholbare Prozesse. Wenn es sich bei der Tabelle um eine permanente Tabelle handelt, sollte sie aus einem separaten Skript zum Erstellen einer Tabelle (das sich in der Quellcodeverwaltung befindet) erstellt werden, da das Erstellen permanenter Objekte im Allgemeinen im Code keine Einfügungen / Löschungen / Aktualisierungen oder Auswahlen aus a sein sollte Tabelle. Objektänderungen sollten getrennt von Datenänderungen behandelt werden, da Objekte Auswirkungen haben, die über die Anforderungen eines bestimmten Einfügens / Aktualisierens / Auswählens / Löschens hinausgehen. Sie müssen die besten Datentypen berücksichtigen, über FK-Einschränkungen, PKs und andere Einschränkungen nachdenken, Prüfanforderungen berücksichtigen, über die Indizierung nachdenken usw.
quelle
Der Hauptunterschied besteht darin, dass SELECT INTO MyTable eine neue Tabelle mit dem Namen MyTable mit den Ergebnissen erstellt, während INSERT INTO erfordert, dass MyTable bereits vorhanden ist.
Sie würden SELECT INTO nur verwenden, wenn die Tabelle nicht vorhanden war und Sie sie basierend auf den Ergebnissen Ihrer Abfrage erstellen wollten. Insofern sind diese beiden Aussagen wirklich nicht vergleichbar. Sie machen sehr unterschiedliche Dinge.
Im Allgemeinen wird SELECT INTO häufiger für einmalige Aufgaben verwendet, während INSERT INTO regelmäßig zum Hinzufügen von Zeilen zu Tabellen verwendet wird.
BEARBEITEN:
Während Sie CREATE TABLE und INSERT INTO verwenden können, um das zu erreichen, was SELECT INTO tut, müssen Sie mit SELECT INTO die Tabellendefinition nicht vorher kennen. SELECT INTO ist wahrscheinlich in SQL enthalten, da es Aufgaben wie Ad-hoc-Berichte oder das Kopieren von Tabellen erheblich vereinfacht.
quelle
Jede Anweisung hat einen eigenen Anwendungsfall. Sie sind nicht austauschbar.
SELECT...INTO MyTable...
schafft eine neue,MyTable
wo es vorher keine gab.INSERT INTO MyTable...SELECT...
wird verwendet, wennMyTable
bereits vorhanden.quelle
Tatsächlich SELECT ... INTO erstellt nicht nur die Tabelle, sondern schlägt auch fehl, wenn sie bereits vorhanden ist. Sie würden sie also grundsätzlich nur verwenden, wenn die Tabelle, in die Sie einfügen, nicht vorhanden ist.
In Bezug auf Ihre EDIT:
Ich persönlich benutze hauptsächlich SELECT ... INTO, wenn ich eine temporäre Tabelle erstelle. Das ist für mich die Hauptverwendung. Ich verwende es jedoch auch, wenn ich neue Tabellen mit vielen Spalten mit ähnlichen Strukturen wie andere Tabellen erstelle und es dann bearbeite, um Zeit zu sparen.
quelle
SELECT INTO wird normalerweise verwendet, um temporäre Tabellen zu generieren oder eine andere Tabelle (Daten und / oder Struktur) zu kopieren.
Im täglichen Code verwenden Sie INSERT, da Ihre Tabellen bereits zum Lesen, UPDATEd, DELETEd, JOINed usw. vorhanden sein sollten. Hinweis: Das Schlüsselwort INTO ist bei INSERT optional
Das heißt, Anwendungen erstellen und löschen normalerweise keine Tabellen im Rahmen des normalen Betriebs, es sei denn, es handelt sich um eine temporäre Tabelle für einen bestimmten Bereich mit eingeschränkter und spezifischer Verwendung.
Eine von SELECT INTO erstellte Tabelle hat im Gegensatz zu einer realen, persistierten, bereits vorhandenen Tabelle keine Schlüssel, Indizes oder Einschränkungen
Die 2 sind nicht direkt vergleichbar, da sie fast keine Überlappung in der Verwendung haben
quelle
Ich möchte nur den zweiten Punkt der Frage behandeln, der sich auf die Leistung bezieht, weil kein anderer Körper dies behandelt hat. Die Auswahl von Into ist bei Tabellen mit großen Datenmengen viel schneller als das Einfügen in. Ich bevorzuge die Auswahl, wenn ich eine sehr große Tabelle lesen muss. Das Einfügen in eine Tabelle mit 10 Millionen Zeilen kann Stunden dauern, während das Auswählen in in Minuten erfolgt. Wenn Sie Indizes für neue Tabellen verlieren, können Sie die Indizes per Abfrage neu erstellen und im Vergleich zu noch viel mehr Zeit sparen einfügen in.
quelle
insert into #temp with(tablock) select * from ..
ist ungefähr die gleiche wie die Leistung fürselect * into #temp from ...
Wählen Sie in, um eine neue Tabelle für Sie zu erstellen, und fügen Sie dann Datensätze aus der Quelltabelle ein. Die neu erstellte Tabelle hat dieselbe Struktur wie die Quelltabelle. Wenn Sie versuchen, select in für eine vorhandene Tabelle zu verwenden, wird ein Fehler ausgegeben, da versucht wird, eine neue Tabelle mit demselben Namen zu erstellen. Zum Einfügen in muss die Tabelle in Ihrer Datenbank vorhanden sein, bevor Sie Zeilen einfügen.
quelle
Der einfache Unterschied zwischen Auswählen in und Einfügen in ist: -> Auswählen in benötigt keine vorhandene Tabelle. Wenn Sie Daten aus Tabelle A kopieren möchten, geben Sie einfach Select * INTO [Tabellenname] aus A ein. Hier kann Tabellenname eine vorhandene Tabelle sein, oder es wird eine neue Tabelle erstellt, die dieselbe Struktur wie Tabelle A hat.
-> Einfügen in benötigt vorhandene Tabelle.INSERT INTO [Tabellenname] SELECT * FROM A;. Hier ist Tabellenname eine vorhandene Tabelle.
Die Auswahl von Into ist normalerweise beliebter, um Daten zu kopieren, insbesondere Sicherungsdaten.
Sie können gemäß Ihren Anforderungen verwenden, es ist völlig Entwicklerwahl, die in seinem Szenario verwendet werden sollte.
Leistungsmäßig ist Insert INTO schnell.
Verweise :
https://www.w3schools.com/sql/sql_insert_into_select.asp https://www.w3schools.com/sql/sql_select_into.asp
quelle
Die Auswahl für große Datenmengen ist möglicherweise nur für einen einzelnen Benutzer geeignet, der eine einzige Verbindung zur Datenbank verwendet, die eine Massenoperationsaufgabe ausführt. Ich empfehle nicht zu verwenden
Dadurch wird eine große Transaktion erstellt und eine Schemasperre zum Erstellen des Objekts erstellt. Dadurch wird verhindert, dass andere Benutzer Objekte erstellen oder auf Systemobjekte zugreifen, bis der
SELECT INTO
Vorgang abgeschlossen ist.Als Proof of Concept öffnen Sie 2 Sitzungen, versuchen Sie in der ersten Sitzung zu verwenden
und im zweiten Abschnitt versuchen
Überprüfen Sie die Sperren, das Blockieren und die Dauer der zweiten Sitzung, um ein temporäres Tabellenobjekt zu erstellen. Meine Empfehlung ist es immer eine gute Praxis, eine Anweisung zu erstellen und einzufügen und bei Bedarf für eine minimale Protokollierung das Trace-Flag 610 zu verwenden.
quelle