interlinear

실무자와 개발자 사이비즈니스 앱과 에이전트 사이자연어와 기계어 사이

Warehouse에 데이터 넣는 세 가지 길: COPY INTO, CTAS, 크로스 쿼리

T-SQL로 Fabric Warehouse에 데이터를 적재하는 세 방식을 비교하고, 언제 무엇을 쓰면 좋은지 정리했어요.

원문: Ingest data into your Warehouse using Transact-SQL 게시일: 2026-06-23 · 저자: WilliamDAssafMSFT (Microsoft)

Warehouse에 데이터를 채워 넣는 방법은 파이프라인이나 Dataflow만 있는 게 아니에요. 이미 SQL을 쓸 줄 안다면, T-SQL 문 몇 줄로 훨씬 빠르게 끝낼 수 있는 경우가 많아요. 파일에서 바로 적재하는 방법, 기존 테이블 결과로 새 테이블을 만드는 방법, 그리고 아예 다른 Warehouse나 Lakehouse의 테이블을 조인해서 가져오는 방법까지 — 이 셋의 차이를 알아두면 상황에 맞게 고를 수 있어요.

COPY INTO — 파일에서 곧장 적재

  • 외부 스토리지(ADLS, Blob 등)에 있는 CSV, Parquet, JSONL 파일을 Warehouse 테이블로 직접 적재할 때 쓰는 T-SQL 문이에요.
  • 새로 짜는 적재 코드라면 COPY INTO가 권장 방식이에요. SQL Server나 Azure SQL Database에서 쓰던 코드를 재사용하고 싶다면 BULK INSERT도 대안이에요.
  • 원본에서 대상으로 그대로 옮기는, 변환이 필요 없는 단순한 적재에 특히 편해요.

CTAS / INSERT…SELECT — 쿼리 결과로 테이블 채우기

  • CREATE TABLE AS SELECT(CTAS)는 SELECT 쿼리 결과로 새 테이블을 만드는 문이에요. 표준 T-SQL의 SELECT INTO도 비슷한 역할을 해요.
  • CTAS는 적재 작업을 병렬로 실행하기 때문에, 데이터를 가공하면서 새 테이블을 만드는 상황에서 특히 효율적이에요.
  • 이미 있는 테이블에 데이터를 채우고 싶다면(새 테이블을 만드는 게 아니라) INSERT ... SELECT 패턴을 써요. SELECT 쪽 조건은 자유롭게 쓸 수 있는데, 대상 테이블 열과 타입이 맞아야 하고 일부 열만 지정하면 나머지는 NULL로 채워져요.
  • SELECT 원본으로 쓸 수 있는 대상은 다양해요.
    • Warehouse 안의 다른 테이블(스테이징 테이블 등)
    • Lakehouse의 Delta Lake 폴더 — /Tables 폴더 아래 저장돼 있으면 SQL analytics endpoint1에서 자동 생성된 테이블처럼 3-part 이름으로 바로 조회할 수 있어요.
    • OPENROWSET 함수로 읽는 외부 CSV·Parquet·JSONL 파일이나 OneLake 경로.
  • COPY INTO가 더 간단하지만, 값 변환이나 다른 테이블과의 조인처럼 적재하면서 데이터를 가공해야 한다면 INSERT ... SELECT가 더 유연해요.
-- Lakehouse의 Delta Lake 폴더를 3-part 이름으로 바로 조회해 새 테이블 생성
CREATE TABLE dbo.TaxiTrips_2023
AS
SELECT *
FROM MyLakehouse.dbo.TaxiTrips
WHERE DATEPART(YEAR, tpep_pickup_datetime) = '2023';

OPENROWSET — 외부 파일·OneLake 경로를 그 자리에서 읽기

CTAS나 INSERT ... SELECT의 SELECT 부분에 OPENROWSET 함수를 쓰면, 별도 준비 단계 없이 외부 파일을 바로 소스로 삼을 수 있어요.

  • Azure Data Lake나 Blob Storage에 있는 CSV·Parquet·JSONL 파일의 URL을 BULK 인자로 넘기면 그 파일을 테이블처럼 읽어요.
  • *.parquet처럼 와일드카드를 쓰거나 /year=*/month=* 같은 파티션 디렉터리 구조를 그대로 대상으로 지정해서 여러 파일을 한 번에 읽을 수도 있어요. 이때 WHERE 절로 불필요한 행·파티션을 미리 걸러내면 쿼리 실행 중 읽는 양 자체가 줄어서 성능에 도움이 돼요.
  • OneLake에 있는 파일도 같은 방식으로 읽을 수 있어요. https://onelake.dfs.fabric.microsoft.com/{workspaceId}/{lakehouseId}/Files/... 형태의 경로를 BULK 인자로 넘기면 돼요.
INSERT INTO dbo.TaxiTrips_2023
SELECT *
FROM OPENROWSET(BULK 'https://onelake.dfs.fabric.microsoft.com/{workspaceId}/{lakehouseId}/Files/year=*/month=*/*.parquet') AS data
WHERE data.filepath(1) = '2023'

값 변환이나 다른 테이블과의 조인, 특정 파티션만 골라 담는 것처럼 적재 중에 가공이 필요한 경우 OPENROWSET + INSERT ... SELECT 조합이 COPY INTO보다 유연해요.

크로스 쿼리 — 다른 Warehouse·Lakehouse를 3-part 이름으로 조회

  • CTAS와 INSERT ... SELECT 모두 SELECT 부분에서 다른 Warehouse나 Lakehouse의 테이블을 참조할 수 있어요. 별도 이관 없이 워크스페이스 안의 여러 자산을 조인해서 바로 새 테이블을 만드는 거예요.
  • 문법은 [warehouse_또는_lakehouse_이름.][스키마명.]테이블명 형태의 3-part 이름을 쓰는 것뿐이에요.
-- taxi_lakehouse와 reference_warehouse 데이터를 조인해
-- research_warehouse에 새 테이블 생성
CREATE TABLE research_warehouse.dbo.taxi_trips
AS
SELECT *
FROM taxi_lakehouse.dbo.TaxiTrips AS latest
INNER JOIN reference_warehouse.dbo.TaxiTrips AS reference
ON latest.vendorId_lpep = reference.vendorId_lpep;
  • 이 방식의 핵심은 데이터를 미리 한곳에 복사해둘 필요가 없다는 점이에요. Warehouse, Lakehouse, 미러링된 데이터베이스가 같은 워크스페이스에 있으면 쿼리 시점에 바로 묶어서 쓸 수 있어요.

그래서 언제 뭘 쓰나

  • 단순히 파일을 그대로 적재한다면 → COPY INTO. 코드가 짧고 목적이 명확해요.
  • 값을 바꾸거나 다른 테이블과 조인하면서 적재해야 한다면 → INSERT ... SELECT 또는 CTAS.
  • 여러 Warehouse·Lakehouse에 흩어진 데이터를 한 번에 합쳐서 새 테이블을 만들고 싶다면 → 3-part 이름을 쓰는 크로스 쿼리.
  • CTAS와 INSERT ... SELECT로 실행한 적재 작업은 모두 Warehouse의 쿼리 히스토리·활동 로그에 남아서, 다른 작업과 함께 모니터링할 수 있어요.
  • 물론 T-SQL이 유일한 길은 아니에요. 정기적인 스케줄, 여러 단계로 이어지는 오케스트레이션이 필요하다면 파이프라인이나 Dataflow Gen2처럼 코드 없이 구성하는 수집 방식도 원문이 함께 안내하고 있어요. 하지만 이미 SQL로 짤 수 있는 단발성·반복 가능한 적재라면, 굳이 파이프라인부터 만들 필요 없이 T-SQL 세 가지 방법만으로도 충분한 경우가 많아요.

정리

Fabric Warehouse에 데이터를 넣는 T-SQL 방법은 목적에 따라 나뉘어요. 파일을 그대로 옮긴다면 COPY INTO, 쿼리 결과로 테이블을 만들거나 채운다면 CTAS·INSERT SELECT, 워크스페이스 안 여러 자산을 한 번에 묶고 싶다면 3-part 이름의 크로스 쿼리를 쓰면 돼요. 파이프라인을 만들기 전에 먼저 이 세 가지로 충분한지부터 확인해 보는 게 좋아요.


어휘 주석

  1. SQL analytics endpoint: Lakehouse에 저장된 Delta 테이블을 별도 변환 없이 T-SQL로 바로 조회할 수 있게 자동으로 만들어주는 읽기 전용 SQL 엔드포인트예요.