Đây là một nỗ lực cải thiện công việc của Max Vernon . Trong giải pháp của mình, ông đề nghị sử dụng 2 chỉ mục trên chế độ xem và đối tượng thống kê.
Chỉ mục thứ nhất được phân cụm, điều này thực sự cần thiết vì không giống như chỉ mục không được bao gồm trên bảng, sẽ xảy ra lỗi nếu tạo chỉ mục không được bao gồm trên chế độ xem mà không có chỉ mục được nhóm trước.
Chỉ mục thứ 2 là một chỉ mục không bao gồm, được sử dụng làm chỉ mục đằng sau truy vấn. Trong phần bình luận câu trả lời của anh ấy, tôi đã hỏi điều gì sẽ xảy ra nếu một chỉ mục được sử dụng thay vì một chỉ mục không bao gồm.
Các phân tích sau đây cố gắng trả lời câu hỏi này.
Tôi đang sử dụng cùng một mã chính xác của mình, ngoại trừ tôi không tạo chỉ mục không bao gồm trong chế độ xem.
Tôi cũng không tạo ra một đối tượng thống kê. Nếu bạn đang theo dõi và sử dụng SQL Server Management Studio (SSMS) để nhập mã bên dưới, bạn nên lưu ý rằng bạn có thể thấy một số dòng nguệch ngoạc màu đỏ - trông giống như lỗi. Đây không phải là lỗi, nhưng liên quan đến một vấn đề với intellisense.
Bạn có thể vô hiệu hóa intellisense hoặc chỉ cần bỏ qua các lỗi và chạy các lệnh. Họ nên hoàn thành mà không có lỗi.
-- Create the test table that uses a computed column.
USE tempdb;
CREATE TABLE dbo.PersistedViewTest
(
PersistedViewTest_ID INT NOT NULL
CONSTRAINT PK_PersistedViewTest
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, SomeData VARCHAR(2000) NOT NULL
, TestComputedColumn AS (PersistedViewTest_ID - 1) PERSISTED
);
GO
-- Insert some test data into the table.
INSERT INTO dbo.PersistedViewTest (SomeData)
SELECT o.name + o1.name + o2.name
FROM sys.objects o
CROSS JOIN sys.objects o1
CROSS JOIN sys.objects o2;
GO
Kế hoạch thực hiện sau (không có chế độ xem / chỉ mục) được tạo sau khi truy vấn sau được chạy với bảng:
SELECT pv.PersistedViewTest_ID, pv.TestComputedColumn
FROM dbo.PersistedViewTest pv
WHERE pv.TestComputedColumn = CONVERT(INT, 26)
GO
Điều này đưa ra một đường cơ sở để so sánh với. Lưu ý rằng sau khi truy vấn hoàn thành, một đối tượng thống kê đã được tạo (_WA_Sys_00000003_1FCDBCEB). Đối tượng thống kê PK_PersistedViewTest đã được tạo khi chỉ mục bảng phân cụm được tạo.
Tiếp theo, chế độ xem được lọc và chỉ mục được nhóm trên chế độ xem đó được tạo:
-- Create filtered view on the computed column.
CREATE VIEW dbo.PersistedViewTest_View
WITH SCHEMABINDING
AS
SELECT PersistedViewTest_ID, SomeData, TestComputedColumn
FROM dbo.PersistedViewTest
WHERE TestComputedColumn < CONVERT(INT, 27);
GO
-- Create unique clustered index to persist the values, including the computed column.
CREATE UNIQUE CLUSTERED INDEX IX_PersistedViewTest
ON dbo.PersistedViewTest_View(PersistedViewTest_ID);
GO
Bây giờ, hãy thử chạy lại truy vấn, nhưng lần này ngược lại với chế độ xem:
SELECT pv.PersistedViewTest_ID, pv.TestComputedColumn
FROM dbo.PersistedViewTest_View pv
WHERE pv.TestComputedColumn = CONVERT(INT, 26)
GO
Kế hoạch thực hiện mới là bây giờ:
Nếu kế hoạch mới được tin tưởng, sau khi thêm chế độ xem và chỉ mục cụm trên chế độ xem đó, số liệu thống kê xuất hiện cho biết thời gian cần thiết để thực hiện truy vấn hiện đã tăng gấp đôi. Ngoài ra, lưu ý rằng không có đối tượng thống kê mới nào được tạo để hỗ trợ chỉ mục mới sau khi truy vấn được chạy, khác với truy vấn trên bảng.
Kế hoạch truy vấn vẫn cho thấy rằng việc tạo một chỉ mục không bao gồm sẽ khá hữu ích trong việc cải thiện hiệu suất của truy vấn. Vì vậy, điều đó có nghĩa là chỉ số không được bao gồm phải được thêm vào chế độ xem trước khi có thể cải thiện hiệu suất mong muốn? Có một điều cuối cùng để thử. Sửa đổi truy vấn để sử dụng tùy chọn "VỚI NOEXPAND":
SELECT pv.PersistedViewTest_ID, pv.TestComputedColumn
FROM dbo.PersistedViewTest_View pv WITH (NOEXPAND)
WHERE pv.TestComputedColumn = CONVERT(INT, 26)
GO
Điều này dẫn đến kế hoạch truy vấn sau đây:
Kế hoạch thực hiện này trông khá giống với kế hoạch được tạo ra với chỉ số không bao gồm trong câu trả lời của Max Vernon. Nhưng, điều này được thực hiện với một chỉ số ít hơn (không bao gồm) và một đối tượng thống kê ít hơn.
Hóa ra tùy chọn NOEXPAND phải được sử dụng với các phiên bản SQL Server tiêu chuẩn và nhanh để sử dụng đúng chế độ xem được lập chỉ mục. Paul White có một bài viết tuyệt vời giải thích về lợi ích của việc sử dụng tùy chọn NOEXPAND. Ông cũng khuyến nghị tùy chọn này được sử dụng với phiên bản doanh nghiệp để đảm bảo đảm bảo tính duy nhất được cung cấp bởi các chỉ mục xem được sử dụng bởi trình tối ưu hóa.
Phân tích trên được thực hiện với phiên bản Express của SQL Sever 2014. Tôi cũng đã thử nó với phiên bản dành cho nhà phát triển của SQL Server 2016. Tùy chọn NOEXPAND dường như không bắt buộc với phiên bản phát triển để đạt được hiệu suất, nhưng vẫn được khuyến nghị .
Chưa đầy 5 tháng trước, Microsoft đã tạo ra các phiên bản dành cho nhà phát triển miễn phí . Giấy phép hạn chế sử dụng chỉ để phát triển, có nghĩa là cơ sở dữ liệu không thể được sử dụng trong môi trường sản xuất. Vì vậy, nếu bạn đang tìm cách kiểm tra các bảng được tối ưu hóa bộ nhớ, mã hóa, R, v.v. thì bạn không còn có lý do không có giấy phép. Tôi đã cài đặt thành công nó trên máy tính của tôi vài ngày trước cùng với SQL Server 2014 Express mà không gặp vấn đề gì.
WHERE (sintMarketID = 2 AND strType = 'CARD' AND strTier1 LIKE 'GG%')
mặc dù.