Bagikan melalui


Memaksimalkan kualitas grup baris untuk performa indeks penyimpan kolom

Kualitas grup baris ditentukan oleh jumlah baris dalam grup baris. Meningkatkan memori yang tersedia dapat memaksimalkan jumlah baris yang dikompresi indeks penyimpan kolom ke dalam setiap grup baris. Gunakan metode ini untuk meningkatkan tingkat kompresi dan performa kueri untuk indeks penyimpan kolom.

Mengapa ukuran grup baris penting

Karena indeks penyimpan kolom memindai tabel dengan memindai segmen kolom grup baris individual, memaksimalkan jumlah baris di setiap grup baris meningkatkan performa kueri. Ketika grup baris memiliki jumlah baris yang tinggi, pemadatan data meningkat yang berarti ada lebih sedikit data untuk dibaca dari disk.

Untuk informasi selengkapnya tentang kelompok baris, lihat Panduan Indeks Penyimpan Kolom.

Ukuran target untuk grup baris

Untuk performa kueri terbaik, tujuannya adalah untuk memaksimalkan jumlah baris per grup baris dalam indeks penyimpan kolom. Grup baris dapat memiliki maksimum 1.048.576 baris. Tidak apa-apa untuk tidak memiliki jumlah maksimum baris per grup baris. Indeks penyimpan kolom mencapai performa yang baik ketika grup baris memiliki setidaknya 100.000 baris.

Kelompok baris dapat dipangkas selama kompresi

Selama pemuatan massal atau pembangunan ulang indeks penyimpan kolom, terkadang tidak ada cukup memori yang tersedia untuk memadatkan semua baris yang ditunjuk untuk setiap grup baris. Ketika ada tekanan memori, indeks penyimpan kolom memangkas ukuran grup baris sehingga pemadatan ke penyimpanan kolom dapat berhasil.

Ketika memori tidak cukup untuk memadatkan setidaknya 10.000 baris ke dalam setiap grup baris, kesalahan akan dihasilkan.

Untuk informasi selengkapnya tentang pemuatan massal, lihat Memuat massal ke dalam indeks penyimpan kolom berkluster.

Cara memantau kualitas grup baris

Tampilan manajemen dinamis (DMV) (sys.dm_db_column_store_row_group_physical_stats berisi definisi tampilan yang cocok dengan SQL DB) yang mengekspos informasi yang berguna seperti jumlah baris dalam grup baris dan alasan pemangkasan jika ada pemangkasan. Anda bisa membuat tampilan berikut sebagai cara yang berguna untuk mengkueri DMV ini untuk mendapatkan informasi tentang pemangkasan grup baris.

CREATE VIEW dbo.vCS_rg_physical_stats
AS
WITH cte
AS
(
select   tb.[name]                    AS [logical_table_name]
,        rg.[row_group_id]            AS [row_group_id]
,        rg.[state]                   AS [state]
,        rg.[state_desc]              AS [state_desc]
,        rg.[total_rows]              AS [total_rows]
,        rg.[trim_reason_desc]        AS trim_reason_desc
,        mp.[physical_name]           AS physical_name
FROM    sys.[schemas] sm
JOIN    sys.[tables] tb               ON  sm.[schema_id]          = tb.[schema_id]
JOIN    sys.[pdw_table_mappings] mp   ON  tb.[object_id]          = mp.[object_id]
JOIN    sys.[pdw_nodes_tables] nt     ON  nt.[name]               = mp.[physical_name]
JOIN    sys.[dm_pdw_nodes_db_column_store_row_group_physical_stats] rg      ON  rg.[object_id]     = nt.[object_id]
                                                                            AND rg.[pdw_node_id]   = nt.[pdw_node_id]
                                        AND rg.[distribution_id]    = nt.[distribution_id]
)
SELECT *
FROM cte;

Kolom trim_reason_desc menunjukkan apakah grup baris dipangkas (trim_reason_desc = NO_TRIM menyiratkan tidak ada pemangkasan dan grup baris memiliki kualitas optimal). Alasan pemangkasan berikut menunjukkan pemangkasan kelompok baris sebelum waktu yang tepat.

  • BULKLOAD: Alasan pemangkasan ini digunakan ketika sekumpulan baris yang masuk untuk pemrosesan kurang dari 1 juta baris. Mesin akan membuat grup baris terkompresi jika ada lebih dari 100.000 baris yang dimasukkan (dibandingkan dengan menyisipkan ke penyimpanan delta) tetapi mengatur alasan pemangkasan ke BULKLOAD. Dalam skenario ini, pertimbangkan untuk meningkatkan beban batch Anda untuk menyertakan lebih banyak baris. Selain itu, evaluasi ulang skema partisi Anda untuk memastikannya tidak terlalu terperinci karena grup baris tidak dapat menjangkau batas partisi.
  • MEMORY_LIMITATION: Untuk membuat grup baris dengan 1 juta baris, sejumlah memori kerja diperlukan oleh mesin. Ketika memori yang tersedia dari sesi pemuatan kurang dari memori kerja yang diperlukan, grup baris dipangkas sebelum waktunya. Bagian berikut menjelaskan cara memperkirakan memori yang diperlukan dan mengalokasikan lebih banyak memori.
  • DICTIONARY_SIZE: Alasan pemangkasan ini menunjukkan bahwa pemangkasan grup baris terjadi karena setidaknya ada satu kolom yang berisi string dengan string yang lebar dan/atau berkardinalitas tinggi. Ukuran kamus dibatasi hingga 16 MB dalam memori dan setelah batas ini tercapai, grup baris dikompresi. Jika Anda mengalami situasi ini, pertimbangkan untuk mengisolasi kolom yang bermasalah ke dalam tabel terpisah.

Cara memperkirakan persyaratan memori

Memori maksimum yang diperlukan untuk memadatkan satu grup baris adalah, kira-kira, sebagai berikut:

  • 72 MB +
  • #rows * #columns * 8 bytes +
  • #rows * #short-string-columns * 32 byte +
  • #long-string-columns * 16 MB digunakan untuk kamus kompresi

Nota

Di mana kolom string-pendek menggunakan tipe data string < = 32 byte dan kolom string-panjang menggunakan tipe data string > 32 byte.

String panjang dikompresi dengan metode kompresi yang dirancang untuk mengompresi teks. Metode pemadatan ini menggunakan kamus untuk menyimpan pola teks. Ukuran maksimum kamus adalah 16 MB. Hanya ada satu kamus untuk setiap kolom string panjang di grup baris.

Cara mengurangi persyaratan memori

Gunakan teknik berikut untuk mengurangi persyaratan memori untuk mengompresi grup baris ke dalam indeks penyimpan kolom.

Menggunakan lebih sedikit kolom

Jika memungkinkan, desain tabel dengan lebih sedikit kolom. Saat grup baris dikompresi ke dalam penyimpan kolom, indeks penyimpan kolom memadatkan setiap segmen kolom secara terpisah. Oleh karena itu persyaratan memori untuk memadatkan grup baris meningkat saat jumlah kolom meningkat.

Menggunakan lebih sedikit kolom string

Kolom jenis data string memerlukan lebih banyak memori daripada jenis data numerik dan tanggal. Untuk mengurangi persyaratan memori, pertimbangkan untuk menghapus kolom string dari tabel fakta dan menempatkannya dalam tabel dimensi yang lebih kecil.

Persyaratan memori tambahan untuk pemadatan string:

  • Jenis data string hingga 32 karakter dapat memerlukan 32 byte tambahan per nilai.
  • Jenis data string dengan lebih dari 32 karakter dikompresi menggunakan metode kamus. Setiap kolom dalam grup baris dapat memerlukan hingga 16 MB tambahan untuk membangun kamus.

Hindari partisi berlebihan

Indeks penyimpan kolom membuat satu atau beberapa grup baris per partisi. Untuk pergudangan data di Azure Synapse Analytics, jumlah partisi tumbuh dengan cepat karena data didistribusikan dan setiap distribusi dipartisi. Jika tabel memiliki terlalu banyak partisi, mungkin tidak ada cukup baris untuk mengisi grup baris. Kurangnya baris tidak menciptakan tekanan memori selama pemadatan, tetapi menyebabkan grup baris yang tidak mencapai performa kueri penyimpan kolom terbaik.

Alasan lain untuk menghindari partisi berlebihan adalah ada overhead memori untuk memuat baris ke dalam indeks penyimpan kolom pada tabel yang dipartisi. Saat pemrosesan muatan, banyak partisi dapat menerima baris yang masuk yang disimpan dalam memori sampai setiap partisi memiliki cukup baris untuk dikompresi. Memiliki terlalu banyak partisi menciptakan tekanan memori tambahan.

Sederhanakan kueri untuk pemuatan

Database membagi alokasi memori untuk sebuah kueri di antara semua operator dalam kueri. Saat kueri beban memiliki pengurutan dan gabungan yang kompleks, memori yang tersedia untuk pemadatan berkurang.

Desain kueri beban untuk fokus hanya pada pemuatan kueri. Jika Anda perlu menjalankan transformasi pada data, jalankan terpisah dari kueri beban. Misalnya, tahapkan data dalam tabel tumpukan, jalankan transformasi, lalu muat tabel penahapan ke dalam indeks penyimpan kolom.

Sesuaikan MAXDOP

Setiap distribusi memadatkan grup baris ke dalam penyimpan kolom secara paralel ketika ada lebih dari satu inti CPU yang tersedia per distribusi. Paralelisme membutuhkan sumber daya memori tambahan, yang dapat menyebabkan tekanan memori dan pemangkasan grup baris.

Untuk mengurangi tekanan memori, Anda dapat menggunakan petunjuk kueri MAXDOP untuk memaksa operasi pemuatan berjalan dalam mode serial dalam setiap distribusi.

CREATE TABLE MyFactSalesQuota
WITH (DISTRIBUTION = ROUND_ROBIN)
AS SELECT * FROM FactSalesQuota
OPTION (MAXDOP 1);

Cara mengalokasikan lebih banyak memori

Ukuran DWU dan kelas sumber daya pengguna bersama-sama menentukan berapa banyak memori yang tersedia untuk kueri pengguna. Untuk meningkatkan pemberian memori untuk kueri beban, Anda dapat meningkatkan jumlah DWU atau meningkatkan kelas sumber daya.

Langkah berikutnya

Untuk menemukan cara lain untuk meningkatkan performa di Synapse SQL, lihat Gambaran umum performa.