Bagikan melalui


Membuat dan memperbarui statistik tabel di kumpulan SQL khusus

Artikel ini menyediakan rekomendasi dan contoh untuk membuat dan memperbarui statistik pengoptimalan kueri pada tabel di kumpulan SQL khusus.

Mengapa menggunakan statistik

Semakin banyak kumpulan SQL yang dikhususkan mengetahui data Anda, maka semakin cepat pula menjalankan kueri terhadapnya. Setelah Anda memuat data ke kumpulan SQL khusus, mengumpulkan statistik pada data Anda adalah salah satu hal terpenting yang dapat Anda lakukan untuk mengoptimalkan kueri Anda.

Pengoptimal kueri kumpulan SQL khusus adalah pengoptimal berbasis biaya. Pengoptimal membandingkan biaya dari berbagai rencana kueri, dan kemudian memilih rencana dengan biaya terendah. Dalam kebanyakan kasus, ia memilih rencana yang melaksanakan dengan paling cepat.

Misalnya, pengoptimal memilih rencana tertentu jika memperkirakan bahwa tanggal yang digunakan filter kueri Anda mengembalikan satu baris. Jika pengoptimalisasi memperkirakan bahwa tanggal yang dipilih mengembalikan satu juta baris, pengoptimalisasi memilih rencana yang berbeda.

Pembuatan otomatis statistik

Saat opsi database AUTO_CREATE_STATISTICS aktif, kumpulan SQL khusus menganalisis kueri pengguna masuk untuk statistik yang hilang.

Jika statistik hilang, pengoptimal kueri membuat statistik pada kolom individual dalam predikat kueri atau kondisi gabungan untuk meningkatkan perkiraan kardinalitas dalam rencana kueri.

Catatan

Pembuatan statistik otomatis saat ini diaktifkan secara default.

Anda dapat memeriksa apakah kumpulan SQL khusus Anda telah AUTO_CREATE_STATISTICS dikonfigurasi dengan menjalankan perintah T-SQL berikut:

SELECT name, is_auto_create_stats_on
FROM sys.databases

Jika kumpulan SQL khusus Anda belum AUTO_CREATE_STATISTICS dikonfigurasi, kami sarankan Anda mengaktifkan properti ini dengan menjalankan perintah berikut. Ganti <your-datawarehouse-name> dengan nama kumpulan SQL khusus Anda.

ALTER DATABASE <your-datawarehouse-name>
SET AUTO_CREATE_STATISTICS ON

Pernyataan ini memicu pembuatan statistik otomatis:

  • SELECT
  • INSERT... SELECT
  • CREATE TABLE AS SELECT (CTAS)
  • UPDATE
  • DELETE
  • EXPLAIN ketika mengandung sebuah join atau saat keberadaan predikat terdeteksi

Catatan

Pembuatan statistik otomatis tidak dilakukan pada tabel sementara atau eksternal.

Pembuatan statistik otomatis dilakukan secara sinkron sehingga Anda mungkin mengalami sedikit penurunan performa kueri jika kolom Anda kehilangan statistik. Waktu untuk membuat statistik untuk satu kolom tergantung pada ukuran tabel.

Untuk menghindari penurunan kinerja yang terukur, Anda harus memastikan statistik telah dibuat terlebih dahulu dengan menjalankan beban kerja tolok ukur sebelum memprofilkan sistem.

Catatan

Pembuatan statistik akan dicatat dalam sys.dm_pdw_exec_requests di bawah konteks pengguna yang berbeda.

Ketika statistik otomatis dibuat, statistik tersebut mengambil formulir: _WA_Sys_<8 digit column id in Hex>_<8 digit table id in Hex>. Anda dapat melihat statistik yang telah dibuat dengan menjalankan perintah: SHOW_STATISTICS DBCC

DBCC SHOW_STATISTICS (<table_name>, <target>)

table_name adalah nama tabel yang berisi statistik yang akan ditampilkan. Tabel ini tidak dapat menjadi tabel eksternal. Targetnya adalah nama indeks target, statistik, atau kolom yang akan menampilkan informasi statistik.

Perbarui statistik

Salah satu praktik terbaik adalah memperbarui statistik pada kolom tanggal setiap hari saat tanggal baru ditambahkan. Setiap kali baris baru dimuat ke dalam kumpulan SQL khusus, tanggal muatan baru, atau tanggal transaksi ditambahkan. Penambahan ini mengubah distribusi data dan menjadikan statistik kedaluwarsa.

Statistik pada kolom negara/wilayah dalam tabel pelanggan mungkin tidak perlu diperbarui karena distribusi nilai umumnya tidak berubah. Dengan asumsi distribusi konstan antara pelanggan, menambahkan baris baru ke variasi tabel tidak akan mengubah distribusi data.

Namun, jika kumpulan SQL khusus Anda hanya berisi satu negara/wilayah, dan Anda membawa data dari negara/wilayah baru, sehingga mengakibatkan data dari beberapa negara/wilayah disimpan, maka Anda perlu memperbarui statistik pada kolom negara/wilayah.

Berikut ini adalah rekomendasi untuk memperbarui statistik:

Atribut statistik Rekomendasi
Frekuensi pembaruan statistik Konservatif: Setiap hari
Setelah memuat atau mengubah data Anda
Pengambilan sampel Kurang dari 1 miliar baris, gunakan pengambilan sampel default (20 persen).
Dengan lebih dari 1 miliar baris, gunakan pengambilan sampel dua persen.

Salah satu pertanyaan pertama yang diajukan saat Anda memecahkan masalah kueri adalah "Apakah statistik sudah diperbarui?"

Pertanyaan ini tidak dapat dijawab berdasarkan usia data. Objek statistik terbaru mungkin sudah tua jika tidak ada perubahan material pada data yang mendasarinya. Ketika jumlah baris telah berubah secara substansial atau ada perubahan material dalam distribusi nilai untuk kolom, maka sudah waktunya untuk memperbarui statistik.

Tidak ada tampilan manajemen dinamis untuk menentukan apakah data dalam tabel telah berubah sejak terakhir kali statistik diperbarui. Dua kueri berikut ini dapat membantu Anda menentukan apakah statistik Anda basi.

  • Kueri 1: Temukan perbedaan antara jumlah baris dari statistik (stats_row_count) dan jumlah baris aktual (actual_row_count).

    select 
    objIdsWithStats.[object_id], 
    actualRowCounts.[schema], 
    actualRowCounts.logical_table_name, 
    statsRowCounts.stats_row_count, 
    actualRowCounts.actual_row_count,
    row_count_difference = CASE
        WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN actualRowCounts.actual_row_count - statsRowCounts.stats_row_count
        ELSE statsRowCounts.stats_row_count - actualRowCounts.actual_row_count
    END,
    percent_deviation_from_actual = CASE
        WHEN actualRowCounts.actual_row_count = 0 THEN statsRowCounts.stats_row_count
        WHEN statsRowCounts.stats_row_count = 0 THEN actualRowCounts.actual_row_count
        WHEN actualRowCounts.actual_row_count >= statsRowCounts.stats_row_count THEN CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (actualRowCounts.actual_row_count - statsRowCounts.stats_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
        ELSE CONVERT(NUMERIC(18, 0), CONVERT(NUMERIC(18, 2), (statsRowCounts.stats_row_count - actualRowCounts.actual_row_count)) / CONVERT(NUMERIC(18, 2), actualRowCounts.actual_row_count) * 100)
    END
    from
    (
        select distinct object_id from sys.stats where stats_id > 1
    ) objIdsWithStats
    left join
    (
        select object_id, sum(rows) as stats_row_count from sys.partitions group by object_id
    ) statsRowCounts
    on objIdsWithStats.object_id = statsRowCounts.object_id 
    left join
    (
        SELECT sm.name [schema] ,
            tb.name logical_table_name ,
            tb.object_id object_id ,
            SUM(rg.row_count) actual_row_count
        FROM sys.schemas sm
             INNER JOIN sys.tables tb ON sm.schema_id = tb.schema_id
             INNER JOIN sys.pdw_table_mappings mp ON tb.object_id = mp.object_id
             INNER JOIN sys.pdw_nodes_tables nt ON nt.name = mp.physical_name
             INNER JOIN sys.dm_pdw_nodes_db_partition_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
        WHERE rg.index_id = 1
        GROUP BY sm.name, tb.name, tb.object_id
    ) actualRowCounts
    on objIdsWithStats.object_id = actualRowCounts.object_id
    
    
  • Kueri 2: Temukan usia statistik Anda dengan memeriksa terakhir kali statistik Anda diperbarui pada setiap tabel.

    Catatan

    Jika ada perubahan material dalam distribusi nilai untuk kolom, Anda harus memperbarui statistik terlepas dari terakhir kali nilai tersebut diperbarui.

    SELECT
        sm.[name] AS [schema_name],
        tb.[name] AS [table_name],
        co.[name] AS [stats_column_name],
        st.[name] AS [stats_name],
        STATS_DATE(st.[object_id],st.[stats_id]) AS [stats_last_updated_date]
    FROM
        sys.objects ob
        JOIN sys.stats st
            ON  ob.[object_id] = st.[object_id]
        JOIN sys.stats_columns sc
            ON  st.[stats_id] = sc.[stats_id]
            AND st.[object_id] = sc.[object_id]
        JOIN sys.columns co
            ON  sc.[column_id] = co.[column_id]
            AND sc.[object_id] = co.[object_id]
        JOIN sys.types  ty
            ON  co.[user_type_id] = ty.[user_type_id]
        JOIN sys.tables tb
            ON  co.[object_id] = tb.[object_id]
        JOIN sys.schemas sm
            ON  tb.[schema_id] = sm.[schema_id]
    WHERE
        st.[user_created] = 1;
    

Kolom tanggal di kumpulan SQL khusus, misalnya, biasanya memerlukan pembaruan statistik yang frekuen. Setiap kali baris baru dimuat ke dalam kumpulan SQL khusus, tanggal muatan baru, atau tanggal transaksi ditambahkan. Penambahan ini mengubah distribusi data dan menjadikan statistik kedaluwarsa.

Sebaliknya, statistik pada kolom jenis kelamin dalam tabel pelanggan mungkin tidak perlu diperbarui. Dengan asumsi distribusi konstan antara pelanggan, menambahkan baris baru ke variasi tabel tidak akan mengubah distribusi data.

Jika kumpulan SQL khusus Anda hanya berisi satu jenis kelamin dan persyaratan baru yang menghasilkan beberapa jenis kelamin, maka Anda perlu memperbarui statistik pada kolom jenis kelamin.

Untuk informasi selengkapnya, lihat panduan umum untuk Statistik.

Mengimplementasikan manajemen statistik

Seringkali merupakan ide yang baik untuk memperluas proses pemuatan data Anda untuk memastikan bahwa statistik diperbarui di akhir proses pemuatan untuk menghindari atau meminimalkan pemblokiran atau kontensi sumber daya antara kueri bersamaan.

Beban data adalah ketika tabel paling sering mengubah ukurannya atau distribusi nilainya. Pemuatan data adalah tempat yang logis untuk mengimplementasikan beberapa proses manajemen.

Prinsip panduan berikut disediakan untuk memperbarui statistik Anda:

  • Pastikan bahwa setiap tabel yang dimuat memiliki setidaknya satu objek statistik yang diperbarui. Ini memperbarui informasi ukuran tabel (jumlah baris dan jumlah halaman) sebagai bagian dari pembaruan statistik.
  • Fokus pada kolom yang berpartisipasi dalam klausul JOIN, GROUP BY, ORDER BY, dan DISTINCT.
  • Pertimbangkan untuk lebih sering memperbarui kolom kunci naik seperti tanggal transaksi, karena nilai-nilai ini tidak disertakan dalam histogram statistik.
  • Pertimbangkan untuk memperbarui kolom distribusi statis dengan lebih jarang.
  • Ingat, setiap objek statistik diperbarui secara berurutan. Menerapkan UPDATE STATISTICS <TABLE_NAME> tidak selalu ideal, terutama untuk tabel yang luas dengan banyak objek statistik.

Untuk informasi selengkapnya, lihat Perkiraan Kardinalitas.

Contoh: Membuat statistik

Contoh-contoh ini menunjukkan cara menggunakan bermacam opsi untuk membuat statistik. Opsi yang Anda gunakan untuk setiap kolom bergantung pada karakteristik data Anda dan bagaimana kolom digunakan dalam kueri.

Membuat statistik kolom tunggal dengan opsi default

Untuk membuat statistik pada kolom, berikan nama untuk objek statistik dan nama kolom.

Sintaks ini menggunakan semua opsi default. Secara default, 20 persen tabel diambil sampelnya saat membuat statistik.

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]);

Contohnya:

CREATE STATISTICS col1_stats ON dbo.table1 (col1);

Membuat statistik kolom tunggal dengan memeriksa setiap baris

Tingkat pengambilan sampel default sebesar 20 persen cukup untuk sebagian besar situasi. Namun, Anda dapat menyesuaikan laju pengambilan sampel.

Untuk mengambil sampel tabel lengkap, gunakan sintaks ini:

CREATE STATISTICS [statistics_name] ON [schema_name].[table_name]([column_name]) WITH FULLSCAN;

Contohnya:

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH FULLSCAN;

Membuat statistik kolom tunggal dengan menentukan ukuran sampel

Atau, Anda dapat menentukan ukuran sampel sebagai persen:

CREATE STATISTICS col1_stats ON dbo.table1 (col1) WITH SAMPLE = 50 PERCENT;

Membuat statistik kolom tunggal hanya pada beberapa baris

Anda juga dapat membuat statistik pada sebagian baris dalam tabel Anda. Ini disebut statistik yang difilter.

Misalnya, Anda dapat menggunakan statistik yang difilter saat berencana untuk mengkueri partisi tertentu dari tabel besar yang dipartisi. Dengan membuat statistik hanya pada nilai partisi, akurasi statistik meningkat, yang meningkatkan performa kueri.

Contoh ini membuat statistik pada rentang nilai. Nilai dapat dengan mudah ditentukan agar sesuai dengan rentang nilai dalam partisi.

CREATE STATISTICS stats_col1 ON table1(col1) WHERE col1 > '2000101' AND col1 < '20001231';

Catatan

Agar pengoptimal kueri mempertimbangkan menggunakan statistik yang difilter saat memilih paket kueri terdistribusi, kueri harus pas di dalam definisi objek statistik. Menggunakan contoh sebelumnya, klausa WHERE kueri perlu menentukan nilai col1 antara 2000101 dan 20001231.

Membuat statistik kolom tunggal dengan semua opsi

Anda juga dapat menggabungkan opsi bersama-sama. Contoh berikut membuat objek statistik yang difilter dengan ukuran sampel kustom:

CREATE STATISTICS stats_col1 ON table1 (col1) WHERE col1 > '2000101' AND col1 < '20001231' WITH SAMPLE = 50 PERCENT;

Untuk referensi lengkapnya, lihat MEMBUAT STATISTIK.

Membuat statistik multi kolom

Untuk membuat objek statistik multi kolom, gunakan contoh sebelumnya, tapi tentukan kolom lainnya.

Catatan

Histogram, yang digunakan untuk memperkirakan jumlah baris dalam hasil kueri, hanya tersedia untuk kolom pertama yang tercantum dalam definisi objek statistik.

Dalam contoh ini, histogram ada di product_category. Statistik lintas kolom dihitung pada product_category dan product_sub_category:

CREATE STATISTICS stats_2cols ON table1 (product_category, product_sub_category) WHERE product_category > '2000101' AND product_category < '20001231' WITH SAMPLE = 50 PERCENT;

Karena ada korelasi antara product_category dan product_sub_category, objek statistik multi-kolom dapat berguna jika kolom ini diakses secara bersamaan.

Membuat statistik pada semua kolom dalam tabel

Salah satu cara untuk membuat statistik adalah dengan mengeluarkan CREATE STATISTICS perintah setelah membuat tabel:

CREATE TABLE dbo.table1
(
   col1 int
,  col2 int
,  col3 int
)
WITH
  (
    CLUSTERED COLUMNSTORE INDEX
  )
;

CREATE STATISTICS stats_col1 on dbo.table1 (col1);
CREATE STATISTICS stats_col2 on dbo.table2 (col2);
CREATE STATISTICS stats_col3 on dbo.table3 (col3);

Menggunakan prosedur yang disimpan untuk membuat statistik pada semua kolom dalam kumpulan SQL

Kumpulan SQL khusus tidak memiliki prosedur tersimpan sistem yang setara sp_create_stats dengan di SQL Server. Prosedur yang disimpan ini membuat objek statistik kolom tunggal pada setiap kolom dalam kumpulan SQL yang belum memiliki statistik.

Contoh berikut menunjukkan cara memulai desain kumpulan SQL Anda. Jangan ragu untuk menyesuaikannya dengan kebutuhan Anda.

CREATE PROCEDURE    [dbo].[prc_sqldw_create_stats]
(   @create_type    tinyint -- 1 default 2 Fullscan 3 Sample
,   @sample_pct     tinyint
)
AS

IF @create_type IS NULL
BEGIN
    SET @create_type = 1;
END;

IF @create_type NOT IN (1,2,3)
BEGIN
    THROW 151000,'Invalid value for @stats_type parameter. Valid range 1 (default), 2 (fullscan) or 3 (sample).',1;
END;

IF @sample_pct IS NULL
BEGIN;
    SET @sample_pct = 20;
END;

IF OBJECT_ID('tempdb..#stats_ddl') IS NOT NULL
BEGIN;
    DROP TABLE #stats_ddl;
END;

CREATE TABLE #stats_ddl
WITH    (   DISTRIBUTION    = HASH([seq_nmbr])
        ,   LOCATION        = USER_DB
        )
AS
WITH T
AS
(
SELECT      t.[name]                        AS [table_name]
,           s.[name]                        AS [table_schema_name]
,           c.[name]                        AS [column_name]
,           c.[column_id]                   AS [column_id]
,           t.[object_id]                   AS [object_id]
,           ROW_NUMBER()
            OVER(ORDER BY (SELECT NULL))    AS [seq_nmbr]
FROM        sys.[tables] t
JOIN        sys.[schemas] s         ON  t.[schema_id]       = s.[schema_id]
JOIN        sys.[columns] c         ON  t.[object_id]       = c.[object_id]
LEFT JOIN   sys.[stats_columns] l   ON  l.[object_id]       = c.[object_id]
                                    AND l.[column_id]       = c.[column_id]
                                    AND l.[stats_column_id] = 1
LEFT JOIN    sys.[external_tables] e    ON    e.[object_id]        = t.[object_id]
WHERE       l.[object_id] IS NULL
AND            e.[object_id] IS NULL -- not an external table
)
SELECT  [table_schema_name]
,       [table_name]
,       [column_name]
,       [column_id]
,       [object_id]
,       [seq_nmbr]
,       CASE @create_type
        WHEN 1
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+')' AS VARCHAR(8000))
        WHEN 2
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH FULLSCAN' AS VARCHAR(8000))
        WHEN 3
        THEN    CAST('CREATE STATISTICS '+QUOTENAME('stat_'+table_schema_name+ '_' + table_name + '_'+column_name)+' ON '+QUOTENAME(table_schema_name)+'.'+QUOTENAME(table_name)+'('+QUOTENAME(column_name)+') WITH SAMPLE '+CONVERT(varchar(4),@sample_pct)+' PERCENT' AS VARCHAR(8000))
        END AS create_stat_ddl
FROM T
;

DECLARE @i INT              = 1
,       @t INT              = (SELECT COUNT(*) FROM #stats_ddl)
,       @s NVARCHAR(4000)   = N''
;

WHILE @i <= @t
BEGIN
    SET @s=(SELECT create_stat_ddl FROM #stats_ddl WHERE seq_nmbr = @i);

    PRINT @s
    EXEC sp_executesql @s
    SET @i+=1;
END

DROP TABLE #stats_ddl;

Untuk membuat statistik pada semua kolom dalam tabel menggunakan opsi default, jalankan prosedur tersimpan.

EXEC [dbo].[prc_sqldw_create_stats] 1, NULL;

Untuk membuat statistik pada semua kolom dalam tabel menggunakan opsi fullscan, panggil prosedur ini.

EXEC [dbo].[prc_sqldw_create_stats] 2, NULL;

Untuk membuat statistik sampel pada semua kolom dalam tabel, masukkan 3, dan persen sampel. Prosedur ini menggunakan laju sampel 20 persen.

EXEC [dbo].[prc_sqldw_create_stats] 3, 20;

Contoh: Memperbarui statistik

Untuk memperbarui statistik, Anda dapat:

  • Memperbarui satu objek statistik. Menentukan nama objek statistik yang ingin Anda perbarui.
  • Memperbarui semua objek statistik pada tabel. Menentukan nama tabel dan bukan satu objek statistik tertentu.

Memperbarui satu objek statistik tertentu

Gunakan sintaks berikut untuk memperbarui objek statistik tertentu:

UPDATE STATISTICS [schema_name].[table_name]([stat_name]);

Contohnya:

UPDATE STATISTICS [dbo].[table1] ([stats_col1]);

Dengan memperbarui objek statistik tertentu, Anda dapat meminimalkan waktu dan sumber daya yang diperlukan untuk mengelola statistik. Melakukan pembaruan membutuhkan beberapa pemikiran untuk memilih objek statistik terbaik untuk diperbarui.

Memperbarui semua statistik pada tabel

Metode sederhana untuk memperbarui semua objek statistik pada tabel adalah:

UPDATE STATISTICS [schema_name].[table_name];

Contohnya:

UPDATE STATISTICS dbo.table1;

Pernyataan UPDATE STATISTICS ini mudah digunakan. Ingatlah bahwa itu memperbarui semua statistik pada tabel, dan oleh sebab itu mungkin melakukan lebih banyak pekerjaan daripada yang diperlukan. Jika performa bukan masalah, ini adalah cara termampu dan paling lengkap untuk menjamin bahwa statistik sudah diperbarui.

Catatan

Saat Anda memperbarui semua statistik pada tabel, kumpulan SQL khusus melakukan pemindaian untuk mengambil sampel tabel untuk setiap objek statistik. Jika tabel besar dan memiliki banyak kolom dan banyak statistik, akan lebih efisien memperbarui statistik individual berdasarkan kebutuhan.

Untuk implementasi UPDATE STATISTICS prosedur, lihat Tabel Sementara. Metode implementasinya sedikit berbeda dari prosedur CREATE STATISTICS sebelumnya, tetapi hasilnya sama.

Untuk sintaks lengkapnya, lihat Statistik Pembaruan.

Statistik metadata

Ada beberapa tampilan dan fungsi sistem yang dapat Anda gunakan untuk menemukan informasi tentang statistik. Misalnya, Anda dapat melihat apakah objek statistik mungkin sudah kedaluwarsa dengan menggunakan fungsi tanggal statistik untuk melihat kapan statistik terakhir dibuat atau diperbarui.

Tampilan katalog untuk statistik

Tampilan sistem ini menyediakan informasi tentang statistik:

Tampilan katalog Deskripsi
sys.columns Satu baris untuk setiap kolom
sys.objects Satu baris untuk setiap objek dalam database
sys.schemas Satu baris untuk setiap skema dalam database
sys.stats Satu baris untuk setiap objek statistik
sys.stats_columns Satu baris untuk setiap kolom dalam objek statistik; tautan kembali ke sys.columns
sys.tables Satu baris untuk setiap tabel (menyertakan tabel eksternal)
sys.table_types Satu baris untuk setiap jenis data

Fungsi sistem untuk statistik

Fungsi sistem ini berguna untuk bekerja dengan statistik:

Fungsi sistem Deskripsi
STATS_DATE Tanggal objek statistik terakhir diperbarui
DBCC SHOW_STATISTICS Tingkat ringkasan dan informasi terperinci tentang distribusi nilai seperti yang dipahami oleh objek statistik

Menggabungkan kolom dan fungsi statistik ke dalam satu tampilan

Tampilan ini menggabungkan kolom yang terkait dengan statistik dan hasil dari fungsi STATS_DATE().

CREATE VIEW dbo.vstats_columns
AS
SELECT
        sm.[name]                           AS [schema_name]
,       tb.[name]                           AS [table_name]
,       st.[name]                           AS [stats_name]
,       st.[filter_definition]              AS [stats_filter_definition]
,       st.[has_filter]                     AS [stats_is_filtered]
,       STATS_DATE(st.[object_id],st.[stats_id])
                                            AS [stats_last_updated_date]
,       co.[name]                           AS [stats_column_name]
,       ty.[name]                           AS [column_type]
,       co.[max_length]                     AS [column_max_length]
,       co.[precision]                      AS [column_precision]
,       co.[scale]                          AS [column_scale]
,       co.[is_nullable]                    AS [column_is_nullable]
,       co.[collation_name]                 AS [column_collation_name]
,       QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS two_part_name
,       QUOTENAME(DB_NAME())+'.'+QUOTENAME(sm.[name])+'.'+QUOTENAME(tb.[name])
                                            AS three_part_name
FROM    sys.objects                         AS ob
JOIN    sys.stats           AS st ON    ob.[object_id]      = st.[object_id]
JOIN    sys.stats_columns   AS sc ON    st.[stats_id]       = sc.[stats_id]
                            AND         st.[object_id]      = sc.[object_id]
JOIN    sys.columns         AS co ON    sc.[column_id]      = co.[column_id]
                            AND         sc.[object_id]      = co.[object_id]
JOIN    sys.types           AS ty ON    co.[user_type_id]   = ty.[user_type_id]
JOIN    sys.tables          AS tb ON  co.[object_id]        = tb.[object_id]
JOIN    sys.schemas         AS sm ON  tb.[schema_id]        = sm.[schema_id]
WHERE   1=1
AND     st.[user_created] = 1
;

Contoh DBCC SHOW_STATISTICS()

DBCC SHOW_STATISTICS() menunjukkan data yang disimpan dalam objek statistik. Data ini muncul dalam tiga bagian:

  • Header
  • Vektor kepadatan
  • Histogram

Metadata header tentang statistik. Histogram menampilkan distribusi nilai di kolom kunci pertama dari objek statistik. Vektor kepadatan mengukur korelasi lintas kolom.

Catatan

Kumpulan SQL khusus menghitung perkiraan kardinalitas dengan salah satu data dalam objek statistik.

Menampilkan header, kepadatan, dan histogram

Contoh sederhana ini menampilkan semua tiga bagian objek statistik:

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>)

Contohnya:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1);

Memperlihatkan satu atau beberapa bagian dari DBCC SHOW_STATISTICS()

Jika Anda hanya tertarik untuk menampilkan bagian tertentu, gunakan klausa WITH dan tentukan bagian mana yang ingin Anda lihat:

DBCC SHOW_STATISTICS([<schema_name>.<table_name>],<stats_name>) WITH stat_header, histogram, density_vector

Contohnya:

DBCC SHOW_STATISTICS (dbo.table1, stats_col1) WITH histogram, density_vector

Perbedaan DBCC SHOW_STATISTICS()

DBCC SHOW_STATISTICS() diimplementasikan lebih ketat dalam kumpulan SQL khusus dibandingkan dengan SQL Server:

  • Fitur yang tidak didokumentasikan tidak didukung.
  • Tidak dapat menggunakan Stats_stream.
  • Tidak dapat menggabungkan hasil untuk subset data statistik tertentu. Contohnya,STAT_HEADER JOIN DENSITY_VECTOR.
  • NO_INFOMSGS tidak dapat diatur untuk penekanan pesan.
  • Kurung siku di sekitar nama statistik tidak dapat digunakan.
  • Tidak dapat menggunakan nama kolom untuk mengidentifikasi objek statistik.
  • Kesalahan kustom 2767 tidak didukung.

Memantau beban kerja kumpulan SQL khusus Azure Synapse Analytics Anda menggunakan DMV