INSERT INTO vs SELECT INTO


127

Kullanmak arasındaki fark nedir

SELECT ... INTO MyTable FROM...

ve

INSERT INTO MyTable (...)
SELECT ... FROM ....

?

BOL [ INSERT , SELECT ... INTO ] 'dan, SELECT ... INTO kullanmanın , önceden mevcut değilse varsayılan dosya grubunda ekleme tablosunu oluşturacağını ve bu ifade için günlüğe kaydetmenin kurtarmaya bağlı olduğunu biliyorum. veritabanı modeli.

  1. Hangi ifade tercih edilir?
  2. Başka performans etkileri var mı?
  3. SELECT ... INTO over INSERT INTO ... için iyi bir kullanım örneği nedir?

Düzenleme: SELECT INTO'nun var olmayan bir tablo oluşturduğunu bildiğimi zaten belirtmiştim. Bilmek istediğim şey, SQL'in bu ifadeyi bir nedenle içerdiği, nedir? O takmadan satırlar için perde arkasında farklı bir şey yapıyor mu, yoksa bunu bir üstünde sadece sözdizimsel şeker olduğunu CREATE TABLEve INSERT INTO.


Küçük bir faktör: en azından sıradan bir SQL ifadesi gibi görünmeye başlarken, INSERT INTOdünyanın sıradan bir SQL ifadesi olmadığını bilmesini sağlayan iki anahtar kelimeye (seç ve içeri) sahiptir SELECT ... INTO. İlkini tercih etmek için küçük bir neden.
Martin F

Yanıtlar:


122
  1. Farklı şeyler yapıyorlar. INSERTTablo mevcut olduğunda kullanın . Olmadığında kullanın SELECT INTO.

  2. Evet. INSERThiçbir tablo ipucu olmadan normalde günlüğe kaydedilir. SELECT INTOuygun izleme bayraklarının ayarlandığı varsayılarak minimum düzeyde günlüğe kaydedilir.

  3. Tecrübelerime göre SELECT INTO, en çok #temptablolar gibi ara veri kümeleri ile veya bir yedek gibi tüm tabloyu kopyalamak için kullanılır. INSERT INTObilinen bir yapıya sahip mevcut bir tabloya eklediğinizde kullanılır.

DÜZENLE

Düzenlemenizi ele almak için farklı şeyler yaparlar. Eğer tablo yapma ve yapı kullanımını tanımlamak istiyorsanız CREATE TABLEve INSERT. Oluşturulabilecek bir soruna örnek: Varchar alanı olan küçük bir tablonuz var. Tablonuzdaki en büyük dize şimdi 12 bayttır. Gerçek veri kümenizin 200 bayta kadar ihtiyacı olacaktır. Bunu yaparsanız SELECT INTOyenisini yapmak için küçük tablodan sonra INSERTsenin alanları çok küçük olduğu için bir kesme hatası ile başarısız olur.


4
Benim iki sentim, bence başarısızlığa giriş iyi bir şey. Verilerimin beklenen veri formatım / boyutumla eşleşip eşleşmediğini bilmek istiyorum. Her zaman tablomu CREATE TABLEve ardından kullanarak tanımlamaya çalışırım. INSERT INTOAyrıca, SELECTeki çalıştırmadan ifadeyi kendi başına test etmek daha kolaydır .
Doug Chamberlain

1
@Doug - Katılıyorum. Neredeyse yalnızca SELECT INTOgeçici bir tablo yapmak veya maymunluk yapacağım mevcut bir tablonun hızlı bir yedeklemesini yapmak için kullanıyorum.
JNK

1
@JNK - BOL'den, SELECT INTO, seçilen listedeki sütunların veri türlerine dayalı bir yapıya sahip bir tablo oluşturur. Dolayısıyla, örneğinizde, varchar'ı yeterli olacak bir boyuta açıkça çevirerek durumu düzeltebilirsiniz. Doğru?
jowenece

2
@Jowenece - evet öyle bekliyorum. Eğer bu zahmete girersem, devam edip bir CREATEifade kullanacağım .
JNK

24
  1. Hangi ifade tercih edilir? Ne yaptığına bağlı.

  2. Başka performans etkileri var mı? Tablo kalıcı bir tablo ise, tablo oluşturma sırasında hem olumsuz hem de pozitif performans üzerinde etkileri olan dizinler oluşturabilirsiniz. İçine seç, geçerli tablolarda bulunan dizinleri yeniden oluşturmaz ve bu nedenle tablonun sonraki kullanımı olması gerekenden daha yavaş olabilir.

  3. SELECT ... INTO over INSERT INTO ... için iyi bir kullanım örneği nedir? Tablo yapısını önceden bilmiyorsanız, içine seçim kullanılır. Yazmak, tablo ve insert deyimi oluşturmaktan daha hızlıdır, bu nedenle zaman zaman gelişmeyi hızlandırmak için kullanılır. Bir şeyleri test etmek için hızlı bir geçici tablo oluştururken veya belirli bir sorgunun yedek tablosunu (belki sileceğiniz kayıtlar) kullanmak genellikle daha hızlıdır. Birden çok kez (geçici tablolar dışında) çalışacak olan üretim kodunda kullanıldığını görmek nadirdir çünkü tablo zaten mevcutsa başarısız olacaktır.

Bazen ne yaptıklarını bilmeyen insanlar tarafından uygunsuz bir şekilde kullanılır. Ve sonuç olarak veri tabanında hasara neden olabilirler. Bir atılabilir tablo dışında herhangi bir şey için SELECT INTO kullanmanın uygun olmadığını düşünüyorum (geçici bir yedekleme, depolanan işlemin sonunda kaybolacak geçici bir tablo, vb.). Kalıcı tablolar , tasarımları konusunda gerçek düşünceye ihtiyaç duyarlar ve SELECT INTO, hangi sütunlar ve hangi veri türleri gibi temel şeyler hakkında düşünmekten kaçınmayı kolaylaştırır.

Genel olarak, create table ve insert deyiminin kullanılmasını tercih ederim - daha fazla kontrole sahipsiniz ve tekrarlanabilir işlemler için daha iyi. Ayrıca, tablo kalıcı bir tablo ise, ayrı bir oluşturma tablosu komut dosyasından (kaynak kontrolünde olan) oluşturulmalıdır, çünkü kalıcı nesneler oluşturma genel olarak kodda eklemeler / silmeler / güncellemeler veya bir tablo. Nesne değişiklikleri, veri değişikliklerinden ayrı olarak ele alınmalıdır çünkü nesneler, belirli bir ekleme / güncelleme / seçme / silme gereksinimlerinin ötesinde etkilere sahiptir. En iyi veri türlerini göz önünde bulundurmanız, FK kısıtlamaları, PK'ler ve diğer kısıtlamalar hakkında düşünmeniz, denetim gereksinimlerini göz önünde bulundurmanız, indekslemeyi düşünmeniz vb.


5

Birincil fark, SELECT INTO MyTable'ın sonuçlarla MyTable adında yeni bir tablo oluşturması, INSERT INTO ise MyTable'ın zaten var olmasını gerektirmesidir.

SELECT INTO’yu yalnızca tablonun olmadığı ve sorgunuzun sonuçlarına göre oluşturmak istediğiniz durumlarda kullanırsınız. Bu nedenle, bu iki ifade gerçekten karşılaştırılamaz. Çok farklı şeyler yapıyorlar.

Genel olarak, SELECT INTO tek seferlik görevler için daha sık kullanılırken, INSERT INTO tablolara satır eklemek için düzenli olarak kullanılır.

DÜZENLEME:
SELECT INTO'nun yaptıklarını gerçekleştirmek için CREATE TABLE ve INSERT INTO kullanabilirsiniz, ancak SELECT INTO ile tablo tanımını önceden bilmeniz gerekmez. SELECT INTO muhtemelen SQL'e dahil edilmiştir çünkü geçici raporlama veya tabloları kopyalama gibi görevleri çok daha kolay hale getirir.


CREATE TABLE ve SELECT INTO hemen hemen aynı şeylerdir (SELECT INTO'nun yaptığı şeyi başarmak için INSERT INTO'ya gerek yoktur) ve SELECT INTO'nun tavsiye edilmediğini düşünüyorum. Dba.stackexchange.com/questions/156105/… bakın .
Rick

4

Her bir ifadenin farklı bir kullanım alanı vardır. Değiştirilemezler.

SELECT...INTO MyTable...daha MyTableönce olmayan bir yerde yeni bir şey yaratır .

INSERT INTO MyTable...SELECT...MyTablezaten var olduğunda kullanılır .


4
Sorularıma cevap vermedin ve cevabını çoktan söyledim
jowenece

5
Sorularınızın cevapları ima edilmektedir. Daha açık hale getirmek için, her birinin farklı bir kullanım durumu olduğu için "tercih edilebilir" bir ifade yoktur. İfadeler birbirinin yerine kullanılamaz. Mevcut olmayan yeni bir tablo oluşturmak istediğinizde ilk sürümü kullanın. Tablo zaten mevcutsa ikinci versiyonu kullanın.
Joe Stefanelli

2
Neden bunu yapmak yerine geçici bir tablo oluşturmak ve sonra içine eklemek isteyeyim? Bir avantaj var mı?
jowenece

4

Aslında SELECT ... INTO sadece tabloyu oluşturmakla kalmaz, aynı zamanda zaten mevcutsa başarısız olur, bu nedenle temelde onu kullanacağınız tek zaman, eklediğiniz tablonun olmadığı zamandır.

DÜZENLEMENİZ ile ilgili olarak:

Kişisel olarak, bir geçici tablo oluştururken çoğunlukla SELECT ... INTO kullanıyorum . Benim için asıl kullanım bu. Bununla birlikte, diğer tablolara benzer yapılara sahip birçok sütuna sahip yeni tablolar oluştururken ve daha sonra zamandan kazanmak için düzenlerken de kullanıyorum.


1
Geçici tablolar için de çoğunlukla SELECT..INTO kullanımlarını görüyorum, ancak CREATE TABLE deyimiyle geçici bir tablo oluşturmayı tercih etmek için bir neden var mı? Örneğin - performans kazancı?
jowenece

3
@jowenece Temelde basitlik için düşünüyorum ... Ayrıca dinamik bir sorgunuz olduğunu söyleyin. Yapısını bilmiyorsunuz, tabloyu önceden oluşturamazsınız ve SELECT ... INTO'yu kullanmak dinamik bir tablo oluşturmaktan çok daha kolaydır.
AJC

3

SELECT INTO genellikle geçici tablolar oluşturmak veya başka bir tabloyu (veri ve / veya yapı) kopyalamak için kullanılır.

Günlük kodda INSERT kullanırsınız çünkü tablolarınız zaten okunacak, UPDATEd, DELETEd, JOINed vb. İçin mevcut olmalıdır. Not: INTO anahtar sözcüğü INSERT ile isteğe bağlıdır.

Yani uygulamalar, bazı kapsam sınırlı ve özel kullanım için geçici bir tablo olmadığı sürece normal işlemlerin bir parçası olarak tablolar oluşturmaz ve bırakmaz.

SELECT INTO tarafından oluşturulan bir tablonun gerçek, kalıcı, zaten var olan bir tablonun aksine hiçbir anahtarı veya indeksi veya kısıtlaması olmayacaktır.

2'si doğrudan karşılaştırılamaz çünkü kullanımda neredeyse hiç çakışmazlar


2

Sorunun yalnızca performansla ilgili ikinci noktasını ele almak istiyorum, çünkü bunu başka hiçbir kurum kapsamadı. Konu büyük veri kümelerine sahip tablolar söz konusu olduğunda, Giriş'i seçmek, içine eklemekten çok daha hızlıdır. Çok büyük bir tablo okumam gerektiğinde içine seçim yapmayı tercih ederim. 10 milyon satırlık bir tablo için ekleme işlemi saatler sürebilirken, içine seçme işlemi dakikalar içinde yapacaktır ve yeni tablodaki dizinlerin kaybedilmesi söz konusu olduğu için, dizinleri sorguya göre yeniden oluşturabilir ve buna kıyasla çok daha fazla zaman kazanabilirsiniz. takın.


Bu doğru, ancak bunun nedeni çoğunlukla SQL Server'ın hedef tablo için herhangi bir çekişme olmadığını bilmesidir. İçin performans insert into #temp with(tablock) select * from ..kabaca select * into #temp from ...
Brian'ın

1

İçine seçim, sizin için o anda yeni tablo oluşturur ve ardından kaynak tablodan bu tabloya kayıtlar ekler. Yeni oluşturulan tablo, kaynak tablo ile aynı yapıya sahiptir.Eğer mevcut bir tablo için select into kullanmaya çalışırsanız, aynı isimde yeni bir tablo oluşturmaya çalışacağından bir hata verecektir. Ekle, tablonun siz tabloları eklemeden önce veritabanınızda var olmasını gerektirir.


1

İçeriye Seç ve İçine Ekle arasındaki basit fark şudur: -> Varolan tabloya ihtiyaç duymamak için İçine öğesini seçin. Tablo A verilerini kopyalamak istiyorsanız, sadece A'dan * INTO [tablo adı] seçin. Burada tablo adı mevcut bir tablo olabilir veya tablo A ile aynı yapıya sahip yeni bir tablo oluşturulacaktır.

-> İçine Ekle var olan tabloya ihtiyacınız var. INSERT INTO [tabloadı] SELECT * FROM A ;. Burada tablename mevcut bir tablodur.

İçine Seçme, verileri özellikle yedeklenen verileri kopyalamak için genellikle daha popülerdir.

Gereksiniminize göre kullanabilirsiniz, onun senaryosunda kullanılması gereken tamamen geliştirici seçimidir.

Performans açısından INTO Ekle hızlıdır.

Referanslar :

https://www.w3schools.com/sql/sql_insert_into_select.asp https://www.w3schools.com/sql/sql_select_into.asp


-2

Büyük veri kümeleri için seçim, toplu işlem görevi gerçekleştiren veri tabanına tek bir bağlantı kullanan tek bir kullanıcı için iyi olabilir. Kullanmanızı tavsiye etmiyorum

SELECT * INTO table

çünkü bu büyük bir işlem oluşturur ve nesneyi oluşturmak için şema kilidi oluşturur ve diğer kullanıcıların SELECT INTOişlem tamamlanana kadar nesne oluşturmasını veya sistem nesnelerine erişmesini engeller .

Kavram kanıtı olarak 2 seans açın, ilk seansta kullanmayı deneyin

select into temp table from a huge table 

ve ikinci bölümde deneyin

create a temp table 

ve geçici bir tablo nesnesi oluşturmak için kilitleri, engellemeyi ve ikinci oturumun süresini kontrol edin. Benim tavsiyem, ifade oluşturmak ve eklemek her zaman iyi bir uygulamadır ve minimum günlük kaydı için gerekirse izleme bayrağı 610'u kullanın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.