Giả sử rằng có một bảng với chỉ mục được nhóm
create table [a_table] ([key] binary(900) unique clustered);
và một số dữ liệu
insert into [a_table] ([key])
select top (1000000) row_number() over (order by @@spid)
from sys.all_columns a cross join sys.all_columns b;
Bằng cách kiểm tra số liệu thống kê lưu trữ của bảng này
select st.index_level, page_count = sum(st.page_count)
from sys.dm_db_index_physical_stats(
db_id(), object_id('a_table'), NULL, NULL, 'DETAILED') st
group by rollup (st.index_level)
order by grouping_id(st.index_level), st.index_level desc;
người ta có thể thấy
index_level page_count
----------- ----------
8 1
7 7
6 30
5 121
4 487
3 1952
2 7812
1 31249
0 125000
NULL 166659
bảng đó mất tổng cộng 166659 trang.
Tuy nhiên quét bảng
set nocount on;
set statistics io, time on;
declare @cnt int;
select @cnt = count(1) from [a_table];
set statistics io, time off;
sản xuất
Table 'a_table'. Scan count 5, logical reads 484367, ...
CPU time = 1757 ms, elapsed time = 460 ms.
số lần đọc logic cao hơn gần ba lần so với không gian được lấy bởi bảng. Khi tôi kiểm tra kế hoạch truy vấn, tôi nhận thấy rằng SqlServer đã sử dụng quét chỉ mục song song. Và đây là nơi phần đầu tiên của câu hỏi phát sinh.
Làm thế nào quét chỉ mục song song được thực hiện mà làm cho SqlServer thực hiện rất nhiều lần đọc logic?
Chỉ định option (maxdop 1)
để triệt tiêu song song
set nocount on;
set statistics io, time on;
declare @cnt2 int;
select @cnt2 = count(1) from [a_table] option (maxdop 1);
set statistics io, time off;
kết quả là
Table 'a_table'. Scan count 1, logical reads 156257, ...
CPU time = 363 ms, elapsed time = 367 ms.
So sánh thống kê để quét chỉ mục song song và không song song trong trường hợp này dẫn đến một kết luận rằng đôi khi tốt hơn là tránh quét chỉ mục song song. Và đây là nơi phát sinh phần thứ hai của câu hỏi.
Khi nào tôi nên lo lắng về việc quét chỉ mục song song? Khi nào nên tránh / triệt tiêu? Các thực hành tốt nhất là gì?
Các kết quả trên thu được trên
Máy chủ Microsoft SQL 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64)