다음을 통해 공유


빠른 시작: COPY 문을 사용하여 데이터 대량 로드

이 빠른 시작에서는 처리량이 높은 데이터 수집을 위해 간단하고 유연한 COPY 문을 사용하여 전용 SQL 풀로 데이터를 대량 로드합니다. COPY 문은 다음과 같은 기능을 제공하여 데이터를 원활하고 유연하게 로드할 수 있도록 권장되는 로드 유틸리티입니다.

  • 데이터 웨어하우스에 대한 엄격한 제어 권한이 없어도 권한이 낮은 사용자가 로드할 수 있도록 허용
  • 추가 데이터베이스 개체를 만들 필요 없이 단일 T-SQL 문만 활용합니다.
  • SAS(공유 액세스 서명)를 사용하여 스토리지 계정 키를 노출하지 않고 보다 세부적인 사용 권한 모델 활용
  • ERRORFILE 위치(REJECTED_ROW_LOCATION)에 대해 다른 스토리지 계정을 지정
  • 각 대상 열에 대한 기본값을 사용자 지정하고 원본 데이터 필드를 지정하여 특정 대상 열에 로드
  • CSV 파일에 대한 사용자 지정 행 종결자 지정
  • CSV 파일에 대한 이스케이프 문자열, 필드 및 행 구분 기호
  • CSV 파일에 대한 SQL Server 날짜 형식 활용
  • 스토리지 위치 경로에 와일드카드 및 여러 파일 지정

필수 조건

이 빠른 시작에서는 전용 SQL 풀이 이미 있다고 가정합니다. 전용 SQL 풀이 생성되지 않은 경우 만들기 및 연결 - 포털 빠른 시작을 사용합니다.

필수 권한 설정

-- List the permissions for your user
select  princ.name
,       princ.type_desc
,       perm.permission_name
,       perm.state_desc
,       perm.class_desc
,       object_name(perm.major_id)
from    sys.database_principals princ
left join
        sys.database_permissions perm
on      perm.grantee_principal_id = princ.principal_id
where name = '<yourusername>';

--Make sure your user has the permissions to CREATE tables in the [dbo] schema
GRANT CREATE TABLE TO <yourusername>;
GRANT ALTER ON SCHEMA::dbo TO <yourusername>;

--Make sure your user has ADMINISTER DATABASE BULK OPERATIONS permissions
GRANT ADMINISTER DATABASE BULK OPERATIONS TO <yourusername>

--Make sure your user has INSERT permissions on the target table
GRANT INSERT ON <yourtable> TO <yourusername>

대상 테이블 만들기

이 예제에서는 뉴욕 택시 데이터 세트에서 데이터를 로드합니다. 단일 연도 내에서 수행된 택시 여행을 나타내는 Trip이라는 테이블을 로드합니다. 다음을 실행하여 테이블을 만듭니다.

CREATE TABLE [dbo].[Trip]
(
    [DateID] int NOT NULL,
    [MedallionID] int NOT NULL,
    [HackneyLicenseID] int NOT NULL,
    [PickupTimeID] int NOT NULL,
    [DropoffTimeID] int NOT NULL,
    [PickupGeographyID] int NULL,
    [DropoffGeographyID] int NULL,
    [PickupLatitude] float NULL,
    [PickupLongitude] float NULL,
    [PickupLatLong] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [DropoffLatitude] float NULL,
    [DropoffLongitude] float NULL,
    [DropoffLatLong] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [PassengerCount] int NULL,
    [TripDurationSeconds] int NULL,
    [TripDistanceMiles] float NULL,
    [PaymentType] varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [FareAmount] money NULL,
    [SurchargeAmount] money NULL,
    [TaxAmount] money NULL,
    [TipAmount] money NULL,
    [TollsAmount] money NULL,
    [TotalAmount] money NULL
)
WITH
(
    DISTRIBUTION = ROUND_ROBIN,
    CLUSTERED COLUMNSTORE INDEX
);

COPY 문 실행

Azure Blob 스토리지 계정에서 Trip 테이블로 데이터를 로드하는 다음 COPY 문을 실행합니다.

COPY INTO [dbo].[Trip] FROM 'https://nytaxiblob.blob.core.windows.net/2013/Trip2013/'
WITH (
   FIELDTERMINATOR='|',
   ROWTERMINATOR='0x0A'
) OPTION (LABEL = 'COPY: dbo.trip');

부하 모니터링

다음 쿼리를 주기적으로 실행하여 부하가 진행 중인지 확인합니다.

SELECT  r.[request_id]                           
,       r.[status]                               
,       r.resource_class                         
,       r.command
,       sum(bytes_processed) AS bytes_processed
,       sum(rows_processed) AS rows_processed
FROM    sys.dm_pdw_exec_requests r
              JOIN sys.dm_pdw_dms_workers w
                     ON r.[request_id] = w.request_id
WHERE [label] = 'COPY: dbo.trip' and session_id <> session_id() and type = 'WRITER'
GROUP BY r.[request_id]                           
,       r.[status]                               
,       r.resource_class                         
,       r.command;

다음 단계