2012-02-08 62 views
11

Tôi đang cố gắng tạo chế độ xem được lập chỉ mục trong SQL Server và tôi đã tự hỏi Nếu tôi cần lập chỉ mục các cột chế độ xem.Chế độ xem chỉ mục SQL Server

Tôi hỏi điều này vì chế độ xem bao gồm một bảng đã có các cột được lập chỉ mục.

Vì vậy nếu TABLE1 có cột FOO đã được lập chỉ mục dưới dạng chỉ mục không nhóm, tôi có phải thêm chỉ mục cho cột FOO vào chế độ xem mới được tạo cho SQL Server để sử dụng chỉ mục không?

Hoặc SQL Server có biết sử dụng chỉ mục trong TABLE1 khi tìm kiếm chế độ xem không?

Quan điểm trông như thế này

CREATE VIEW [dbo].[v_eventActivity] 
WITH SCHEMABINDING 
AS 
    SELECT ea.id, 
     e.eventID, 
     e.name, 
     ea.userID, 
     ea.activityTypeID, 
     ea.timeStamp, 
     ea.visitDuration 
    FROM dbo.table1 e, 
     dbo.table2 ea 
    WHERE e.eventID = ea.eventID 

Tôi sẽ được tìm kiếm trên tất cả các cột với nhau.

Như đã nêu trước đó, table1 và table2 tất cả đã có các cột được lập chỉ mục.

+0

Tôi nghĩ tôi biết câu trả lời cho điều này nhưng bằng văn bản xác định rằng trên thực tế tôi không làm như vậy. Tốt Q! cách tốt nhất để biết có thể là thử và xem. bạn cũng nên chỉ định phiên bản SS nào. – JNK

+0

Thông thường một khung nhìn được lập chỉ mục không đại diện cho toàn bộ bảng, do đó biểu diễn chỉ mục trên một cột cụ thể thường không có ý nghĩa. Bạn đã tạo chế độ xem chưa? Bạn có thể chia sẻ cấu trúc bảng, chỉ mục bạn đang nói đến và định nghĩa cho chế độ xem (bao gồm các chỉ mục của nó) không? –

+0

Tôi thực sự đã thử. Kế hoạch thực hiện truy vấn nói rằng nó sử dụng chỉ mục của các bảng gốc. Nhưng tôi chỉ muốn chắc chắn. – KDV

Trả lời

4

Chế độ xem được lập chỉ mục trong SQL Server, gần như không tạo ra sự khác biệt, được gọi là chế độ xem vật hoá ở nơi khác. Nếu chế độ xem của bạn có truy vấn cơ bản sử dụng các chỉ mục được xác định trên các bảng cơ sở, thì lựa chọn trên chế độ xem cũng sẽ sử dụng chỉ mục, đó không phải là những gì mà một chế độ xem được lập chỉ mục.

Nếu bạn đang sử dụng chế độ xem khá thường xuyên và hiệu suất, bạn có thể chọn bỏ thêm dung lượng đĩa (và thời gian cpu) và tạo chỉ mục nhóm duy nhất trên màn hình, do đó cho phép truy vấn nhanh hơn trên màn hình, bởi vì SQL Server sẽ không phải quay trở lại bảng cơ sở hoặc các bảng và nhận mọi thứ cần thiết từ chỉ mục của khung nhìn.

Có giao diện here.

+1

Nếu đó là chế độ xem được lập chỉ mục, bạn không thể thêm chỉ mục nhóm duy nhất trên chế độ xem. Đó là định nghĩa của chế độ xem được lập chỉ mục (bạn không thể tạo chỉ mục không phải là duy nhất hoặc không được nhóm trên một chế độ xem trừ khi chỉ mục nhóm duy nhất đã tồn tại). –

+1

@AaronBertrand: chế độ xem phải không có chỉ mục trước, tôi không ngụ ý rằng nó có! (Các) bảng có thể có các chỉ mục. – Mithrandir

+1

Cách tôi đọc nó, mô tả của bạn làm cho nó giống như bạn nên thêm một chỉ mục nhóm duy nhất vào một khung nhìn được lập chỉ mục. –

7

Chế độ xem sẽ chỉ sử dụng chỉ mục bảng trừ khi gợi ý NOEXPAND được cung cấp (tài liệu here).

Bạn có thể kiểm tra điều này bản thân như sau:

CREATE TABLE [test].[TestTable] (
    id INT IDENTITY PRIMARY KEY, 
    foo INT 
) 

CREATE NONCLUSTERED INDEX ixFoo 
ON [test].[TestTable] (foo) 

CREATE VIEW [test].[TestTableView] WITH SCHEMABINDING 
AS 
    SELECT 
     t.id, 
     t.foo 
    FROM [test].[TestTable] t 
GO 

CREATE UNIQUE CLUSTERED INDEX ixFooId 
ON [test].[TestTableView] (id) 

CREATE NONCLUSTERED INDEX ixFooView 
ON [test].[TestTableView] (foo) 

Dưới đây là kế hoạch thực hiện cho ba truy vấn riêng biệt:

SELECT 
    t.[id], 
    t.[foo] 
FROM [test].[TestTable] t 
ORDER BY t.[foo] 

The table query execution plan

SELECT 
    v.[id], 
    v.[foo] 
FROM [test].[TestTableView] v 
ORDER BY v.[foo] 

The view with no hint

SELECT 
    v.[id], 
    v.[foo] 
FROM [test].[TestTableView] v WITH (NOEXPAND) 
ORDER BY v.[foo] 

The view with the NOEXPAND hint

Các vấn đề liên quan