Chế độ xem được lập chỉ mục trong SQL Server


11

Tôi có một bảng và một khung nhìn được lập chỉ mục trên đó như

Create table mytable1 (ID int identity(1,1), Name nvarchar(100))

Create table mytable2 (ID int identity(1,1), Name nvarchar(100))

Create view myview 
with schemabinding 
as 
   select a.name, b.name
   from mytable1 a 
   join mytable2 b on a.Id = b.Id

Bây giờ nếu tôi chạy truy vấn sau

select a.name, b.name
from mytable1 a 
join mytable2 b on a.Id = b.Id

Nó không sử dụng chế độ xem được lập chỉ mục của tôi. Có bất kỳ gợi ý (hoặc cách nào khác) để buộc SQL Server sử dụng chế độ xem được lập chỉ mục thay thế không?

Tôi có một hệ thống lớn, và cần tối ưu hóa nó. Tôi không thể thay đổi tất cả các tập lệnh SQL của mình để chọn từ chế độ xem thay vì bảng. Tôi muốn tạo các khung nhìn được lập chỉ mục và buộc SQL Server lấy dữ liệu từ chúng thay vì các bảng.

Tôi đang sử dụng SQL Server 2014 Enterprise Edition.


Tôi có một hệ thống lớn, và cần tối ưu hóa nó. Tôi không thể thay đổi tất cả các tập lệnh sql của tôi để chọn từ chế độ xem thay vì bảng. Tôi muốn tạo các khung nhìn được lập chỉ mục và buộc máy chủ sql lấy dữ liệu từ chúng thay vì các bảng.
Artash Khachatryan

Câu trả lời:


23

Tôi xây dựng các khung nhìn được lập chỉ mục trong SQL Server mọi lúc để điều chỉnh các sản phẩm hiện có. Trình tối ưu hóa đủ thông minh để sử dụng chỉ mục nếu bạn đang sử dụng các cột thích hợp.

Sử dụng ví dụ của bạn, có vẻ như bạn đã tạo chế độ xem nhưng thực tế không tạo chỉ mục cho nó.

if object_id(N'mytable1') is not null 
drop table mytable1
if object_id(N'mytable2') is not null 
drop table mytable2
go

Create table mytable1 (ID int identity(1,1), Name1 nvarchar(100))
GO
Create table mytable2 (ID int identity(1,1), Name2 nvarchar(100))
GO

insert into mytable1 values ('steve')
insert into mytable1 values ('jack') 
insert into mytable1 values ('mike') 
insert into mytable1 values ('ralph') 
insert into mytable1 values ('simon')

insert into mytable2 values ('smith')
insert into mytable2 values ('jackson') 
insert into mytable2 values ('mikaelson') 
insert into mytable2 values ('montalvo') 
insert into mytable2 values ('singer')
go

if object_id(N'myview') is not null
drop view myview
go

Create view myview 
with schemabinding 
as 
select a.id, a.name1, b.name2
from dbo.mytable1 a 
join dbo.mytable2 b on a.Id = b.Id
GO

select a.name1, b.name2
from mytable1 a join mytable2 b on a.Id = b.Id
GO

Vì không có chỉ mục trên chế độ xem này, chúng tôi quét trên các bảng cơ sở: nhập mô tả hình ảnh ở đây

Nhưng một khi chúng ta thêm một chỉ mục, trình tối ưu hóa có thể sử dụng nó:

CREATE UNIQUE CLUSTERED INDEX [ix_cl_names] ON [myview]
(
    [name1] ASC,
    [name2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

Điều này được sử dụng một cách thích hợp quan điểm: nhập mô tả hình ảnh ở đây

Tôi không thể thay đổi tất cả các tập lệnh SQL của mình để chọn từ chế độ xem thay vì bảng. Tôi muốn tạo các khung nhìn được lập chỉ mục và buộc SQL Server lấy dữ liệu từ chúng thay vì các bảng.

Không có gợi ý hoặc phương pháp nào khác để buộc SQL Server sử dụng chế độ xem được lập chỉ mục khi nó không được tham chiếu trong truy vấn.

Thông tin bổ sung (từ Geoff Patterson )

Một điểm nữa là trong khi trình tối ưu hóa có thể, chỉ trong Phiên bản doanh nghiệp, sử dụng chế độ xem được lập chỉ mục trong trường hợp này, có thể có ý nghĩa trực tiếp tham chiếu chế độ xem bằng cách sử dụng NOEXPANDgợi ý nếu bạn cần chắc chắn 100% về chỉ mục chế độ xem được sử dụng hoặc nếu bạn muốn nó được sử dụng trong Standard Edition.

Tôi thường thấy các truy vấn ngay cả trong Phiên bản doanh nghiệp nơi trình tối ưu hóa không nhận thấy thực tế là chỉ mục xem có thể được sử dụng trừ khi NOEXPANDđược sử dụng. Nó phổ biến hơn với các truy vấn phức tạp, nhưng cũng có thể xảy ra với các truy vấn đơn giản.

Paul White có một trong những bài viết hay hơn mà tôi đã đọc khám phá các sắc thái của NOEXPAND; ngoài việc sử dụng chỉ mục chế độ xem, gợi ý còn có thể tác động đến những thứ như liệu số liệu thống kê có được tạo tự động trên chế độ xem được lập chỉ mục và ước tính số lượng thẻ cho kế hoạch hay không.

Và từ Zane : Là một lưu ý phụ, hãy cẩn thận với các chế độ xem được lập chỉ mục như mọi chỉ mục khác, nó sẽ thêm vào bản cập nhật, chèn và xóa thời gian của bạn.


-5

Nếu bạn không thể thay đổi mã ứng dụng của mình thành tên đối tượng mới, có lẽ bạn có thể thay đổi người dùng ứng dụng của mình để sử dụng lược đồ mặc định mới và tạo các khung nhìn được lập chỉ mục trong một lược đồ khác sử dụng cùng tên đối tượng? Ví dụ:

create view iv.MyTest 
as 
 select Col1, Col2 from dbo.MyTest 

Tất nhiên điều này sẽ chỉ hoạt động nếu bạn chưa sử dụng tên lược đồ trong mã ứng dụng.

Nếu bạn có, bạn có thể thử di chuyển tất cả các đối tượng sang một lược đồ mới và thay vào đó giới thiệu các khung nhìn trong lược đồ cũ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.