Programming

INSERT INTO vs SELECT INTO

procodes 2020. 7. 14. 21:03
반응형

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를 사용합니다. 참고 : INSERT와 함께 INTO 키워드는 선택 사항입니다.

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

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

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


I only want to cover second point of the question that is related to performance, because no body else has covered this. Select Into is a lot more faster than insert into, when it comes to tables with large datasets. I prefer select into when I have to read a very large table. insert into for a table with 10 million rows may take hours while select into will do this in minutes, and as for as losing indexes on new table is concerned you can recreate the indexes by query and can still save a lot more time when compared to insert into.


Select into creates new table for you at the time and then insert records in it from the source table. The newly created table has the same structure as of the source table.If you try to use select into for a existing table it will produce a error, because it will try to create new table with the same name. Insert into requires the table to be exist in your database before you insert rows in it.


The simple difference between select Into and Insert Into is: --> Select Into don't need existing table. If you want to copy table A data, you just type Select * INTO [tablename] from A. Here, tablename can be existing table or new table will be created which has same structure like table A.

--> Insert Into do need existing table.INSERT INTO [tablename] SELECT * FROM A;. Here tablename is an existing table.

Select Into is usually more popular to copy data especially backup data.

You can use as per your requirement, it is totally developer choice which should be used in his scenario.

Performance wise Insert INTO is fast.

References :

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


Select into for large datasets may be good only for a single user using one single connection to the database doing a bulk operation task. I do not recommend to use

SELECT * INTO table

as this creates one big transaction and creates schema lock to create the object, preventing other users to create object or access system objects until the SELECT INTO operation completes.

As proof of concept open 2 sessions, in first session try to use

select into temp table from a huge table 

and in the second section try to

create a temp table 

and check the locks, blocking and the duration of second session to create a temp table object. My recommendation it is always a good practice to create and Insert statement and if needed for minimal logging use trace flag 610.

참고URL : https://stackoverflow.com/questions/6947983/insert-into-vs-select-into

반응형