Mulai cepat: Memuat data secara massal menggunakan pernyataan COPY

Dalam panduan cepat ini, Anda akan memuat data dalam jumlah besar ke dalam kumpulan SQL yang didedikasikan menggunakan perintah COPY yang sederhana dan fleksibel untuk penyerapan data dengan throughput tinggi. Pernyataan COPY adalah utilitas pemuatan yang direkomendasikan karena memungkinkan Anda memuat data dengan lancar dan fleksibel dengan menyediakan fungsionalitas untuk:

  • Izinkan pengguna dengan hak istimewa yang lebih rendah dimuat tanpa memerlukan izin CONTROL yang ketat pada gudang data
  • Manfaatkan hanya satu pernyataan T-SQL tanpa harus membuat objek database tambahan
  • Manfaatkan model izin yang lebih baik tanpa mengekspos kunci akun penyimpanan menggunakan Share Access Signatures (SAS)
  • Tentukan akun penyimpanan yang berbeda untuk lokasi file error (REJECTED_ROW_LOCATION)
  • Menyesuaikan nilai default untuk setiap kolom target dan menentukan bidang data sumber untuk dimuat ke kolom target tertentu
  • Tentukan terminator baris kustom untuk file CSV
  • Pelolosan string, kolom, dan pembatas baris untuk file CSV
  • Memanfaatkan format Tanggal SQL Server untuk file CSV
  • Tentukan karakter pengganti dan beberapa berkas pada jalur lokasi penyimpanan

Prasyarat

Panduan cepat ini mengandaikan Anda sudah memiliki kumpulan data SQL khusus. Jika kumpulan SQL khusus belum dibuat, gunakan panduan kilat Create and Connect - portal.

Menyiapkan izin yang diperlukan

-- 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>

Buat tabel target

Dalam contoh ini, kita akan memuat data dari himpunan data taksi New York. Kami akan memuat tabel bernama Trip yang mewakili perjalanan taksi yang diambil dalam satu tahun. Jalankan yang berikut ini untuk membuat tabel:

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
);

Jalankan pernyataan COPY

Jalankan pernyataan COPY berikut yang akan memuat data dari akun penyimpanan blob Azure ke dalam tabel Trip.

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

Memantau beban

Periksa apakah beban Anda mengalami kemajuan dengan menjalankan kueri berikut secara berkala:

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;

Langkah berikutnya