Mulai Cepat: Memuat data secara massal menggunakan pernyataan COPY

Dalam mulai cepat ini, Anda akan memuat data secara massal ke kumpulan SQL khusus menggunakan pernyataan 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:

  • Mengizinkan pengguna dengan hak istimewa yang lebih rendah memuat tanpa memerlukan izin CONTROL yang ketat di gudang data
  • Memanfaatkan hanya satu pernyataan T-SQL tanpa harus membuat objek database tambahan apa pun
  • Memanfaatkan model izin yang lebih baik tanpa memperlihatkan kunci akun penyimpanan menggunakan Share Access Signatures (SAS)
  • Menentukan akun penyimpanan lain untuk lokasi ERRORFILE (REJECTED_ROW_LOCATION)
  • Menyesuaikan nilai default untuk setiap kolom target dan menentukan bidang data sumber untuk dimuat ke kolom target tertentu
  • Menentukan terminator baris kustom untuk file CSV
  • String escape, bidang, dan pemisah baris untuk file CSV
  • Memanfaatkan format Tanggal SQL Server untuk file CSV
  • Menentukan kartubebas dan beberapa file di jalur lokasi penyimpanan

Prasyarat

Mulai cepat ini mengasumsikan Anda sudah memiliki kumpulan SQL khusus. Jika kumpulan SQL khusus belum dibuat, gunakan mulai cepat Buat dan Sambungkan - 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>

Membuat tabel target

Dalam contoh ini, kita akan memuat data dari himpunan data taksi New York. Kita akan memuat tabel bernama Trip yang mewakili perjalanan taksi yang ditempuh dalam waktu satu tahun. Jalankan perintah berikut 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
);

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

Periksa apakah muatan 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