INSERT INTO vs SELECT INTO


127

사용의 차이점은 무엇입니까

SELECT ... INTO MyTable FROM...

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

?

BOL [ INSERT , SELECT ... INTO ]에서 SELECT ... INTO를 사용 하면 기본 파일 그룹에 삽입 테이블 이없는 경우 삽입 테이블 작성하며이 명령문의 로깅은 복구에 따라 달라집니다 데이터베이스 모델.

  1. 어느 진술이 바람직합니까?
  2. 다른 성능 관련 영향이 있습니까?
  3. INSERT INTO ...에 대한 SELECT ... INTO의 좋은 사용 사례는 무엇입니까?

편집 : 나는 이미 SELECT INTO ...가 존재하지 않는 테이블을 생성한다는 것을 알고 있다고 말했습니다. 내가 알고 싶은 것은 SQL이 이유 때문에이 문장을 포함한다는 것입니다. 무엇입니까? 가 삽입 행에 대해 뒤에서 뭔가 다른 일을, 아니면 그것을 위에 단지 문법 설탕이다 CREATE TABLEINSERT INTO.


하나의 작은 요소 : INSERT INTO두 가지 핵심 단어 (선택 및 입력)가 맨 앞에 일반 SQL 문이 아니라는 것을 세상에 알리는 것이지만 SELECT ... INTO적어도 일반 SQL 문처럼 보이기 시작합니다. 전자를 선호하는 작은 이유.
Martin F

답변:


122
  1. 그들은 다른 일을합니다. INSERT테이블이 존재할 때 사용하십시오 . SELECT INTO그렇지 않을 때 사용하십시오 .

  2. 예. INSERT테이블 힌트가 없으면 일반적으로 기록됩니다. SELECT INTO적절한 추적 플래그가 설정되어 있다고 가정하면 최소한으로 기록됩니다.

  3. 내 경험상 SELECT INTO가장 일반적으로 #temp테이블 과 같은 중간 데이터 세트 또는 백업과 같은 전체 테이블을 복사하는 데 사용됩니다. INSERT INTO알려진 구조의 기존 테이블에 삽입 할 때 사용됩니다.

편집하다

편집 내용을 해결하기 위해 다른 작업을 수행합니다. 테이블을 만들고 구조를 정의하려는 경우 CREATE TABLE및을 사용하십시오 INSERT. 생성 할 수있는 문제의 예 : varchar 필드가있는 작은 테이블이 있습니다. 테이블에서 가장 큰 문자열은 12 바이트입니다. 실제 데이터 세트는 최대 200 바이트가 필요합니다. 당신이 경우에 SELECT INTO새로운 하나를 만들기 위해 작은 테이블에서, 나중에는 INSERT귀하의 필드가 너무 작기 때문에 절단 오류로 실패합니다.


4
내 두 센트, 나는 실패를 소개하는 것이 좋은 것이라고 생각합니다. 내 데이터가 예상 데이터 형식 / 크기와 일치하지 않는지 알고 싶습니다. 난 항상 사용하여 내 테이블을 정의하려고 CREATE TABLE하고 INSERT INTO또한, 시험 쉽게 SELECT삽입을 실행하지 않고, 그 자체로 문을.
더그 챔버 린

1
@Doug-동의합니다. 나는 거의 독점적 SELECT INTO으로 임시 테이블을 만들거나 내가 원숭이로 삼을 기존 테이블의 빠른 백업을 수행하는 데 사용합니다.
JNK

1
@JNK-BOL에서 SELECT INTO는 선택 목록에있는 열의 데이터 유형을 기반으로 구조가있는 테이블을 작성합니다. 따라서 귀하의 예에서 varchar를 충분한 크기로 명시 적으로 캐스팅하여 상황을 해결할 수 있습니다. 옳은?
jowenece

2
@Jowenece-네, 그렇게 기대합니다. 내가 그 문제에 가면 나는 계속해서 CREATE진술을 사용할 것 입니다.
JNK

24
  1. 어느 진술이 바람직합니까? 당신이하고있는 일에 달려 있습니다.

  2. 다른 성능 관련 영향이 있습니까? 테이블이 영구 테이블 인 경우 테이블 작성시 인덱스를 작성하여 성능에 부정적인 영향을 미칠 수 있습니다. select into는 현재 테이블에 존재하는 인덱스를 다시 작성하지 않으므로 테이블의 후속 사용이 필요한 것보다 느릴 수 있습니다.

  3. INSERT INTO ...에 대한 SELECT ... INTO의 좋은 사용 사례는 무엇입니까? 미리 테이블 구조를 모르는 경우 선택 위치가 사용됩니다. create table 및 insert 문보다 쓰기 속도가 빠르므로 개발 속도를 높이는 데 사용됩니다. 테스트하기 위해 빠른 임시 테이블 또는 특정 쿼리의 백업 테이블 (삭제하려는 레코드 일 수 있음)을 작성할 때 종종 사용하는 것이 더 빠릅니다. 테이블이 이미 존재하면 실패하기 때문에 임시 테이블을 제외하고 여러 번 실행되는 프로덕션 코드에서 사용되는 것을 보는 것은 드 rare니다.

자신이하는 일을 모르는 사람들이 때때로 부적절하게 사용합니다. 결과적으로 DB에 혼란을 초래할 수 있습니다. 나는 버림받은 테이블 (임시 백업, 저장된 proc의 끝에서 사라질 임시 테이블 등) 이외의 다른 용도로는 SELECT INTO를 사용하는 것이 부적절하다고 생각합니다. 영구 테이블은 디자인에 대한 실질적인 생각이 필요 하며 SELECT INTO를 사용하면 열 및 데이터 유형과 같은 기본 사항에 대한 생각조차 쉽게 피할 수 있습니다.

일반적으로 create table 및 insert 문을 사용하는 것이 좋습니다. 더 많은 제어 기능이 있으며 반복 가능한 프로세스에 더 좋습니다. 또한 테이블이 영구 테이블 인 경우 일반적으로 영구 오브젝트를 작성하는 코드는 일반적으로 코드에서 삽입 / 삭제 / 업데이트 또는 표. 객체 변경은 데이터 변경과 별도로 처리해야합니다. 객체는 특정 삽입 / 업데이트 / 선택 / 삭제의 필요 이상으로 영향을 미치기 때문입니다. 최상의 데이터 유형을 고려하고 FK 제약 조건, PK 및 기타 제약 조건, 감사 요구 사항, 인덱싱 등을 고려해야합니다.


5

주요 차이점은 SELECT INTO MyTable이 결과와 함께 MyTable이라는 새 테이블을 생성하는 반면 INSERT INTO는 MyTable이 이미 존재해야한다는 것입니다.

테이블이 존재하지 않고 쿼리 결과에 따라 테이블을 생성하려는 경우에만 SELECT INTO를 사용합니다. 따라서이 두 진술은 실제로 비교할 수 없습니다. 그들은 매우 다른 일을합니다.

일반적으로 SELECT INTO는 일회성 작업에 더 자주 사용되는 반면 INSERT INTO는 정기적으로 테이블에 행을 추가하는 데 사용됩니다.

편집 :
CREATE TABLE 및 INSERT INTO를 사용하여 SELECT INTO의 기능을 수행 할 수 있지만 SELECT INTO를 사용하면 미리 테이블 정의를 알 필요가 없습니다. SELECT INTO는 임시보고 또는 테이블 복사와 같은 작업을 훨씬 쉽게하기 때문에 SQL에 포함될 수 있습니다.


CREATE TABLE과 SELECT INTO는 거의 동일합니다 (SELECT INTO의 기능을 수행하기 위해 INSERT INTO가 필요하지 않음). SELECT INTO는 권장하지 않습니다. dba.stackexchange.com/questions/156105/…를 참조하십시오 .
Rick

4

각 문장에는 고유 한 사용 사례가 있습니다. 그들은 서로 바꿔 쓸 수 없습니다.

SELECT...INTO MyTable...MyTable이전에 존재하지 않았던 새로운 곳을 만듭니다 .

INSERT INTO MyTable...SELECT...MyTable이미 존재 하는 경우에 사용됩니다 .


4
당신은 내 질문에 대답하지 않았고 나는 당신의 대답을 이미 언급했습니다.
jowenece

5
귀하의 질문에 대한 답변이 내포되어 있습니다. 더 명확하게하기 위해 각각 고유 한 사용 사례가 있으므로 "바람직한"문은 없습니다. 진술은 상호 교환 할 수 없습니다. 존재하지 않는 새 테이블을 만들려면 첫 번째 버전을 사용하십시오. 테이블이 이미 존재하면 두 번째 버전을 사용하십시오.
Joe Stefanelli

2
임시 테이블을 만든 다음 삽입하는 이유는 무엇입니까? 장점이 있습니까?
jowenece

4

실제로 SELECT ... INTO 는 테이블을 만들뿐만 아니라 이미 존재하는 경우 실패하므로 기본적으로 삽입하려는 테이블이 존재하지 않을 때만 사용하십시오.

편집과 관련하여 :

개인적으로 임시 테이블을 만들 때 주로 SELECT ... INTO를 사용 합니다. 그게 주된 용도입니다. 그러나 다른 테이블과 비슷한 구조로 많은 열이있는 새 테이블을 만든 다음 시간을 절약하기 위해 편집 할 때도 사용합니다.


1
주로 임시 테이블에 SELECT..INTO를 사용하는 것을 보았지만 CREATE TABLE 문으로 임시 테이블을 만드는 것을 선호하는 이유가 있습니까? 예-성능 향상?
jowenece

3
@ jowenece 나는 주로 단순성을 위해 생각합니다 ... 또한 동적 쿼리가 있다고 가정하십시오. 나는 당신이 구조를 모른다, 당신은 미리 테이블을 만들 수 없으며, SELECT ... INTO를 사용하는 것이 훨씬 쉽습니다.
AJC

3

SELECT INTO는 일반적으로 임시 테이블을 생성하거나 다른 테이블 (데이터 및 / 또는 구조)을 복사하는 데 사용됩니다.

매일의 코드에서는 테이블을 읽거나 업데이트하고 삭제하고 참여하기 위해 이미 존재해야하므로 INSERT를 사용합니다. 참고 : INTO 키워드는 INSERT와 함께 선택 사항입니다.

즉, 응용 프로그램은 일부 범위 제한 및 특정 사용을위한 임시 테이블이 아닌 한 정상적인 작업의 일부로 테이블을 만들고 삭제하지 않습니다.

SELECT INTO에 의해 생성 된 테이블에는 기존의 실제 테이블과 달리 키나 인덱스 또는 제약 조건이 없습니다.

2는 사용량이 거의 겹치지 않기 때문에 직접 비교할 수 없습니다.


2

다른 사람이 이것을 다루지 않았기 때문에 성능과 관련된 질문의 두 번째 요점 만 다루고 싶습니다. 큰 데이터 집합이있는 테이블의 경우 삽입을 선택하는 것이 삽입 속도보다 훨씬 빠릅니다. 나는 매우 큰 테이블을 읽을 때 선택하는 것을 선호합니다. 1000 만 개의 행이있는 테이블에 삽입하려면 선택하면 몇 분 안에이 작업을 수행하는 데 몇 시간이 걸릴 수 있으며 새 테이블에서 인덱스가 손실되는 경우 쿼리로 인덱스를 다시 만들 수 있으며 다음과 비교할 때 더 많은 시간을 절약 할 수 있습니다 에 집어 넣다.


사실이지만 SQL Server가 대상 테이블에 대한 경합이 없다는 것을 알고 있기 때문입니다. 의 성능은 다음의 성능과 insert into #temp with(tablock) select * from ..거의 동일합니다.select * into #temp from ...
Brian

1

를 선택하면 해당 시점에 새 테이블이 생성 된 다음 소스 테이블에서 레코드를 삽입합니다. 새로 작성된 테이블은 소스 테이블과 동일한 구조를 갖습니다. 기존 테이블에 대해 select into를 사용하려고하면 동일한 이름으로 새 테이블을 작성하려고하기 때문에 오류가 발생합니다. 삽입하려면 테이블을 행에 삽입하기 전에 데이터베이스에 테이블이 있어야합니다.


1

select Into와 Insert Into의 간단한 차이점은 다음과 같습니다.-> Select Into 기존 테이블이 필요하지 않습니다. 테이블 A 데이터를 복사하려면 A에서 Select * INTO [tablename]을 입력하면됩니다. 여기서 tablename은 기존 테이블이거나 테이블 A와 같은 구조를 가진 새 테이블이 작성됩니다.

-> Insert Into 기존 테이블이 필요합니다. Insert INTO [tablename] SELECT * FROM A ;. 여기서 tablename은 기존 테이블입니다.

데이터 백업, 특히 백업 데이터를 복사하는 데 일반적으로 더 많이 선택하십시오.

요구 사항에 따라 사용할 수 있으며, 시나리오에서 사용해야 할 것은 전적으로 개발자의 선택입니다.

현명한 성능 INTO 삽입이 빠릅니다.

참고 문헌 :

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


-2

대량 데이터 작업의 경우 대량 작업 작업을 수행하는 데이터베이스에 대한 단일 연결을 사용하는 단일 사용자에게만 적합 할 수 있습니다. 나는 사용하지 않는 것이 좋습니다

SELECT * INTO table

이는 하나의 큰 트랜잭션을 작성하고 스키마 잠금을 작성하여 오브젝트를 작성하므로 SELECT INTO조작이 완료 될 때까지 다른 사용자가 오브젝트를 작성하거나 시스템 오브젝트에 액세스 할 수 없습니다.

개념 증명 공개 2 세션, 첫 번째 세션에서 사용하려고

select into temp table from a huge table 

두 번째 섹션에서

create a temp table 

임시 테이블 오브젝트를 작성하기 위해 잠금, 블로킹 및 두 번째 세션 지속 기간을 점검하십시오. 내 권장 사항은 항상 명령문을 작성하고 삽입하는 것이 좋으며 최소 로깅에 필요한 경우 추적 플래그 610을 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.