Kho lưu trữ dữ liệu trong Microsoft Fabric sử dụng một trình tối ưu hóa truy vấn để tạo kế hoạch thực thi cho một truy vấn SQL cụ thể. Khi bạn gửi một truy vấn, trình tối ưu hóa truy vấn cố gắng liệt kê tất cả các kế hoạch có thể và chọn ra ứng viên hiệu suất tốt nhất. Để xác định kế hoạch nào sẽ yêu cầu ít công việc nhất (I/O, CPU, bộ nhớ), trình động cần có khả năng đánh giá số lượng công việc hoặc hàng mà có thể được xử lý tại mỗi toán tử. Sau đó, dựa trên chi phí của mỗi kế hoạch, nó chọn ra kế hoạch có chi phí ước tính ít nhất.Thống kê là các đối tượng chứa thông tin liên quan về dữ liệu của bạn, giúp trình tối ưu hóa truy vấn ước lượng các chi phí này.
Cách tận dụng số liệu thống kê
Để đạt được hiệu suất truy vấn tối ưu, việc có thống kê chính xác là rất quan trọng. Hiện nay, Microsoft Fabric hỗ trợ các cách sau để cung cấp thống kê liên quan và cập nhật:
- Thống kê do người dùng định nghĩa
- Người dùng thực hiện lệnh DDL (Data Definition Language) để tạo, cập nhật và xóa thống kê khi cần thiết
- Thống kê tự động
Thống kê thủ công cho tất cả các bảng
Lựa chọn truyền thống để duy trì sức khỏe thống kê có sẵn trong Microsoft Fabric. Người dùng có thể tạo, cập nhật và xóa thống kê dựa trên histogram cho một cột đơn. CREATE STATISTICS , UPDATE STATISTICS và DROP STATISTICS tương ứng. Người dùng cũng có thể xem nội dung của thống kê dựa trên histogram cho một cột đơn. DBCC SHOW_STATISTICS . Hiện tại, chỉ có một phiên bản giới hạn của các câu lệnh này được hỗ trợ.
- Nếu tạo thống kê thủ công, hãy xem xét tập trung vào những thống kê được sử dụng nhiều trong khối lượng công việc truy vấn của bạn (đặc biệt là trong các GROUP BY, ORDER BY, bộ lọc và JOIN).
- Hãy xem xét cập nhật thống kê cấp cột thường xuyên sau các thay đổi dữ liệu mà ảnh hưởng đáng kể đến số hàng hoặc phân phối của dữ liệu.
Ví dụ về bảo trì thống kê thủ công
Để tạo thống kê trên bảng dbo.DimCustomer, dựa trên tất cả các hàng trong cột CustomerKey:
SQL
CREATE STATISTICS DimCustomer_CustomerKey_FullScan
ON dbo.DimCustomer (CustomerKey) WITH FULLSCAN;
Để cập nhật thủ công đối tượng thống kê DimCustomer_CustomerKey_FullScan, có lẽ sau một cập nhật dữ liệu lớn:
SQL
UPDATE STATISTICS dbo.DimCustomer (DimCustomer_CustomerKey_FullScan) WITH FULLSCAN;
Để hiển thị thông tin về đối tượng thống kê:
SQL
DBCC SHOW_STATISTICS ("dbo.DimCustomer", "DimCustomer_CustomerKey_FullScan");
Để chỉ hiển thị thông tin về histogram của đối tượng thống kê:
SQL
DBCC SHOW_STATISTICS ("dbo.DimCustomer", "DimCustomer_CustomerKey_FullScan") WITH HISTOGRAM;
Để thả đối tượng thống kê theo cách thủ công DimCustomer_CustomerKey_FullScan:
SQL
DROP STATISTICS dbo.DimCustomer.DimCustomer_CustomerKey_FullScan;
Các đối tượng T-SQL sau đây cũng có thể được sử dụng để kiểm tra cả thống kê được tạo thủ công và tự động trong Microsoft Fabric:
- Xem danh mục sys.stats
- Chế độ xem danh mục sys.stats_columns
- Chức năng hệ thống STATS_DATE
Tự động thống kê trong truy vấn
Khi bạn thực hiện một truy vấn và trình tối ưu hóa truy vấn yêu cầu thống kê để khám phá kế hoạch, Microsoft Fabric sẽ tự động tạo thống kê đó nếu chúng chưa tồn tại. Sau khi thống kê đã được tạo, trình tối ưu hóa truy vấn có thể sử dụng chúng để ước lượng chi phí kế hoạch của truy vấn kích hoạt. Ngoài ra, nếu trình động truy vấn xác định rằng thống kê hiện tại liên quan đến truy vấn không còn chính xác phản ánh dữ liệu, thì thống kê sẽ được tự động làm mới. Bởi vì các hoạt động tự động này được thực hiện đồng bộ, bạn có thể mong đợi thời gian thực hiện truy vấn sẽ bao gồm thời gian này nếu thống kê cần thiết vẫn chưa tồn tại hoặc có các thay đổi dữ liệu đáng kể kể từ lần làm mới thống kê cuối cùn
Để xác nhận thống kê tự động trong thời gian truy vấn
Có nhiều trường hợp mà bạn có thể mong đợi một loại thống kê tự động. Phổ biến nhất là thống kê dựa trên histogram, được trình tối ưu hóa truy vấn yêu cầu cho các cột được tham chiếu trong các GROUP BY, JOIN, DISTINCT clauses, filters (WHERE clauses), và ORDER BYs. Ví dụ, nếu bạn muốn xem sự tạo ra tự động của những thống kê này, một truy vấn sẽ kích hoạt sự tạo ra nếu thống kê cho COLUMN_NAME vẫn chưa tồn tại. Ví dụ:
SQL
SELECT <COLUMN_NAME>
FROM <YOUR_TABLE_NAME>
GROUP BY <COLUMN_NAME>;
Trong trường hợp này, bạn nên mong đợi thống kê cho COLUMN_NAME đã được tạo ra. Nếu cột cũng là một cột varchar, bạn cũng sẽ thấy thống kê về độ dài trung bình của cột được tạo ra. Nếu bạn muốn xác nhận rằng thống kê đã được tạo tự động, bạn có thể chạy truy vấn sau:
SQL
select
object_name(s.object_id) AS [object_name],
c.name AS [column_name],
s.name AS [stats_name],
s.stats_id,
STATS_DATE(s.object_id, s.stats_id) AS [stats_update_date],
s.auto_created,
s.user_created,
s.stats_generation_method_desc
FROM sys.stats AS s
INNER JOIN sys.objects AS o
ON o.object_id = s.object_id
INNER JOIN sys.stats_columns AS sc
ON s.object_id = sc.object_id
AND s.stats_id = sc.stats_id
INNER JOIN sys.columns AS c
ON sc.object_id = c.object_id
AND c.column_id = sc.column_id
WHERE o.type = 'U' -- Only check for stats on user-tables
AND s.auto_created = 1
AND o.name = '<YOUR_TABLE_NAME>'
ORDER BY object_name, column_name;
Truy vấn này chỉ xem xét thống kê dựa trên cột. Nếu bạn muốn xem tất cả thống kê tồn tại cho bảng này, hãy loại bỏ các JOIN trên sys.stats_columns và sys.columns
Bây giờ, bạn có thể tìm statistics_name của thống kê histogram được tạo tự động (có thể là một cái gì đó giống như _WA_Sys_00000007_3B75D760) và chạy câu lệnh T-SQL sau:
SQL
DBCC SHOW_STATISTICS ('<YOUR_TABLE_NAME>', '<statistics_name>');
Ví dụ:
SQL
DBCC SHOW_STATISTICS ('sales.FactInvoice', '_WA_Sys_00000007_3B75D760');
Giá Updatedtrị trong tập kết quả của DBCC SHOW_STATISTICS Nên là một ngày (theo giờ UTC) tương tự như khi bạn thực hiện truy vấn GROUP BY ban đầu.
Những thống kê được tạo tự động này sau đó có thể được tận dụng trong các truy vấn sau bởi trình động truy vấn để cải thiện chi phí kế hoạch và hiệu suất thực thi. Nếu có đủ thay đổi trong bảng, trình động truy vấn cũng sẽ làm mới những thống kê đó để cải thiện tối ưu hóa truy vấn. Cùng với đó, bài tập thực hành mẫu trước đó có thể được áp dụng lại sau khi thay đổi bảng một cách đáng kể. Trong Fabric, trình động truy vấn SQL sử dụng ngưỡng tái biên so với SQL Server 2016 (13.x) để làm mới thống kê.
Các loại thống kê được tạo tự động
Trong Microsoft Fabric, có nhiều loại thống kê được tự động tạo ra bởi hệ thống để cải thiện kế hoạch truy vấn. Hiện tại, chúng có thể được tìm thấy trong sys.stats mặc dù không phải tất cả đều có thể thực hiện hành động:
- Thống kê biểu đồ
- Tạo ra cho mỗi cột cần thống kê biểu đồ tại thời điểm truy vấn.
- Những đối tượng này chứa thông tin biểu đồ và mật độ về phân phối của một cột cụ thể. Tương tự như các thống kê tự động được tạo ra tại thời điểm truy vấn trong các cụm dành riêng của Azure Synapse Analytics.
- Tên bắt đầu bằng _WA_Sys_.
- Contents can be viewed withg DBCC SHOW_STATISTICS
- Thống kê độ dài trung bình của cột
- Được tạo ra cho các cột ký tự biến đổi (varchar) có độ dài lớn hơn 100 cần độ dài trung bình của cột tại thời điểm truy vấn.
- Những đối tượng này chứa một giá trị đại diện cho kích thước hàng trung bình của cột varchar tại thời điểm tạo thống kê.
- Tên bắt đầu bằng ACE-AverageColumnLength_.
- Nội dung không thể xem và không thể thực hiện hành động bởi người dùng.
- Thống kê số lượng thẻ dựa trên bảng
- Được tạo ra cho mỗi bảng cần ước lượng độ đa dạng tại thời điểm truy vấn.
- Những đối tượng này chứa một ước lượng về số hàng của một bảng.
- Được đặt tên là ACE-Cardinality.
- Nội dung không thể xem và không thể thực hiện hành động bởi người dùng.
- Nội dung không thể được xem và người dùng không thể thực hiện được.
Hạn chế
- Chỉ có thể tạo và chỉnh sửa thống kê biểu đồ cho một cột duy nhất một cách thủ công.
- Việc tạo thống kê đa cột không được hỗ trợ.
- Các đối tượng thống kê khác có thể xuất hiện trong sys.stats , ngoại trừ thống kê được tạo ra thủ công và tự động. Những đối tượng này không được sử dụng cho việc tối ưu hóa truy vấn.
Nguồn: https://learn.microsoft.com/en-us/fabric/data-warehouse/statistics