SQL 2008 - Tính năng phát hiện Index thiếu tính Index(Missing Index Feature)




Trong một lần làm việc khi thực thi câu truy vấn tới một bảng có sử dụng Index trong phiên bản SQL Server 2008 Management Studio thì nhận được câu thông báo sau:
/*
Missing Index Details from SQLQuery1.sql - KRANKRA\SQLEXPRESS.Index_Test (KRANKRA\NGOCSON (53))
The Query Processor estimates that implementing the following index could improve the query cost by 82.667%.
*/



Ban đầu thực sự tôi không hiểu câu thông báo này có ý nghĩa là gì và tại sao lại có thông báo như vậy. Sau khi tìm tòi thì biết được đây là một tính năng hỗ trợ mới trong SQL 2008, mấy phiên bảng trước hình như không có, mà có thì tôi cũng hem biết ^^!.

Tính năng nói trên được goi là "Missing Index Feature" tôi tạm dịch là tính năng phát hiện Index thiếu tính Index, hơi khó hiểu thì phải TT^TT, như chịu thôi bạn nào có đề nghị bảng dịnh tốt hơn thì chia sẻ cho tôi nha.

Để hiểu rõ hơn tính năng này tôi sẽ thực hiện một ví dụ đơn giản để trình bày. Đầu tiên ta cần tạo một bảng(table) để thực nghiêm.
CREATE TABLE customer
(
    cus_ID int IDENTITY,
    name varchar(255),
    birth date
)

Tiếp theo là thêm vào một ít dữ liệu cho bảng(insert data) cỡ khoảng mấy ngàn thôi ^^. Bạn thực thị các tập lệnh sau(nó chạy hơi lâu):
DECLARE @Begin Date, @End Date, @Current Date, @intFlag INT
SET @Begin = Cast('1000-01-01' as Date)
SET @End = Cast('4000-01-01' as Date)
SET @Current = @Begin
set @intFlag = 1
WHILE (@Current <= @End)
BEGIN
    INSERT INTO customer(name, birth) VALUES (dbo.fnColumnNameFromIndex(@intFlag),@Current)
    SET @Current = DateAdd(day, 1, @Current)
    SET @intFlag = @intFlag + 1
END

Như các bạn thấy hầu hết các biết của tôi đều sử dụng lại các bảng dữ liệu đã thực nghiệm trước đây nên nếu các bạn quan tâm tới các bài viết tiếp theo thì cứ giữ lại để khi cần có thể tài sử dụng.

Tiếp theo tình huống đặt ra là bạn muốn tăng tốc độ khi vấn cho cột name. Theo thồng thường thì mình sẽ tạo Index cho cột name như sau:
CREATE INDEX Index_customerName ON customer(name)

Sau khi tạo xong Index thì bạn chạy câu truy vấn(query) sau:
SELECT name FROM customer WHERE name LIKE 'D%'

Như bạn thấy bên hình dưới Index Seek đã được tạo chứng tỏ việc sử dụng Index và Index trong câu truy vấn phát huy được hiệu quả.



Nhưng nếu bạn thực hiện câu truy vấn sau:
SELECT * FROM customer WHERE name LIKE 'D%'

Bạn sẽ thấy kết quả không được như mong muốn, khi chạy câu lệnh thì chế độ thực thi của nó là quét bảng "Table Scan" như hình bên dưới.


Ngoài ra trong khi bạn còn thấy một câu thông báo là
/*
Missing Index Details from SQLQuery1.sql - KRANKRA\SQLEXPRESS.Index_Test (KRANKRA\NGOCSON (53))
The Query Processor estimates that implementing the following index could improve the query cost by 82.667%.
*/

Để xem toàn bộ chi tiết nội dung thông báo, bạn di chuyển tới vị trị câu thông báo và nhấp phải chuột chọn "Missing Index Detail..." trong bảng menu.

Sau khi chọn xong một tab soạn thảo query mới sẽ được hiển thị trông đó có toàn bộ nội dung của thông báo.
/*
Missing Index Details from SQLQuery1.sql - KRANKRA\SQLEXPRESS.Index_Test (KRANKRA\NGOCSON (53))
The Query Processor estimates that implementing the following index could improve the query cost by 82.667%.
*/

/*
USE [Index_Test]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[customer] ([name])
INCLUDE ([cus_ID],[birth])
GO
*/

Dòng trên là thông báo tình hình xử lý của câu truy vấn. Dòng 2 là gợi ý cải thiện Index của bạn, giúp câu truy vấn được thực hiên nhanh hơn.

Để tiếp tục thực nghiệm tính năng "Missing Index Feature" bạn bỏ ký hiệu của chú "/* */" của dòng thứ 2 và thực thi nó(execute). Theo đó đó bạn chạy lại câu lệnh
SELECT * FROM customer WHERE name LIKE 'D%'

Bạn sẽ thấy được hiệu quả như hình bên dưới khi thực thi câu truy vấn.


Note: Bạn cần lưu ý theo tôi thì tính năng này chỉ dừng ở mức hỗ trợ gợi ý cho chúng ta trong việc thiết lập Index cho cơ dử liệu của mình, không nên quá phụ thuộc vào nó mà ảnh hưởng tới phân tích của bản thân trong việc thiết lập Index cho database.








No comments:

Post a Comment