[sql-server] INSERT INTO vs SELECT INTO

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

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.



답변

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

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

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

편집하다

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


답변

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

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

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

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

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


답변

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

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

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

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


답변

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

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

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


답변

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

편집과 관련하여 :

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


답변

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

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

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

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

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


답변

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