Lượt xem có được tối ưu hóa khi tôi thêm mệnh đề WHERE cho chúng không?


28

Liệu nó có tạo ra sự khác biệt nếu bạn lọc Chế độ xem bên trong hoặc bên ngoài Chế độ xem không?

Ví dụ, có sự khác biệt nào giữa hai truy vấn này không?

SELECT Id
FROM MyTable
WHERE SomeColumn = 1

Hoặc là

SELECT Id
FROM MyView
WHERE SomeColumn = 1

MyViewđược định nghĩa là

SELECT Id, SomeColumn
FROM MyTable

Và câu trả lời có khác nhau không nếu bảng nguồn được đặt trên Máy chủ được liên kết?

Tôi đang hỏi bởi vì tôi phải truy vấn một bảng lớn (44 triệu hàng) hai lần từ một máy chủ được liên kết và nhận được tổng hợp các kết quả. Tôi muốn biết liệu tôi nên tạo hai chế độ xem để truy cập dữ liệu, một cho mỗi truy vấn hoặc nếu tôi có thể thoát khỏi một chế độ xem và một WHEREmệnh đề.


1
Tại sao bạn thậm chí sẽ sử dụng chế độ xem nếu bạn chỉ có một bảng trong đó?
HLGEM

3
@HLGEM bảo mật?
JNK

2
@HLGEM Chế độ xem thực sự chứa nhiều truy vấn đến nhiều cơ sở dữ liệu trên các máy chủ khác nhau và nó kết hợp tất cả chúng với nhau UNION ALL. Sử dụng Chế độ xem dễ dàng hơn nhiều so với việc phải viết lại truy vấn UNION bất cứ khi nào tôi cần dữ liệu.
Rachel


1
@datagod Tôi sẽ ghi nhớ điều đó, cảm ơn :) Trong trường hợp này, có một ứng dụng khá nhỏ thu thập dữ liệu từ một loạt các máy chủ, chạy một số tính toán và đưa ra một loạt các báo cáo. Nó có cơ sở dữ liệu riêng vì một số tính toán khá tốn tài nguyên và tôi muốn tách nó ra khỏi mọi thứ khác.
Rachel

Câu trả lời:


12

Bạn sẽ thấy hoàn toàn không có sự khác biệt trong kế hoạch hoặc hiệu suất giữa hai lựa chọn này. Khi chế độ xem được truy vấn, nó được mở rộng ra một truy vấn đối với bảng cơ sở, điều đó có nghĩa là cùng tìm kiếm hoặc quét sẽ được sử dụng.

Bây giờ, tùy thuộc vào loại dữ liệu và độ chọn lọc của MyColumn, nếu bạn muốn tạo một chỉ mục được lọc trên bảng cơ sở (khi bạn chuyển sang SQL Server 2008+), bạn có thể có hiệu suất tốt hơn, nhưng điều này một lần nữa sẽ không khác qua chế độ xem hoặc không có.


3
Thế còn câu hỏi này , câu hỏi tại sao một truy vấn có wheremệnh đề bên ngoài khung nhìn lại mất nhiều thời gian hơn so với khi nó được đưa vào dạng xem?
Rachel

1
Nếu lượt xem không dành cho hiệu suất thì chúng chỉ dành cho cấu trúc?
profimedica

1
Các khung nhìn được lập chỉ mục @profimedica có thể được tạo vì lý do hiệu suất (ví dụ: để lưu trữ các kết quả trung gian như tổng hợp thay vì tính toán chúng khi chạy). Nếu một khung nhìn không được cụ thể hóa, nó có thể vì nhiều lý do: DRY (nối chung hoặc bộ lọc được thực hiện trong nhiều truy vấn khác nhau), bảo mật, obfuscation, đơn giản hóa lược đồ.
Aaron Bertrand

5

Đây chỉ là một ví dụ nhanh cho thấy rằng không nên có sự khác biệt. Cơ sở dữ liệu là AdventureWorkscơ sở dữ liệu.

Định nghĩa hai khung nhìn:

create view Person.vContactWhere
as

    select *
    from person.Contact
    where ContactID = 24

go

create view Person.vContactNoWhere
as

    select *
    from person.Contact

go

Đây sẽ là truy vấn đầu tiên, với WHEREmệnh đề được bao gồm trong định nghĩa khung nhìn:

select *
from person.vContactWhere

Đây là kế hoạch thực hiện:

nhập mô tả hình ảnh ở đây

Và truy vấn thứ hai, với WHERE mệnh đề không nằm trong định nghĩa khung nhìn, nhưng trong SELECTtruy vấn:

select *
from person.vContactNoWhere
where ContactID = 24

Đây là kế hoạch thực hiện:

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy từ các kế hoạch thực hiện này, chúng giống hệt nhau với kết quả giống hệt nhau. Tôi không biết tình huống mà loại logic / thiết kế này sẽ dẫn đến kết quả khác nhau. Vì vậy, tôi sẵn sàng nói rằng bạn an toàn dù bằng cách nào, và đi theo sở thích cá nhân (hoặc thủ tục mua sắm).


1
Thế còn câu hỏi này , câu hỏi tại sao một truy vấn có wheremệnh đề bên ngoài khung nhìn lại mất nhiều thời gian hơn so với khi nó được đưa vào dạng xem?
Rachel

1
@Rachel Tôi nghĩ gbn đã giải thích nó khá tốt trong bài viết của anh ấy, và bài báo anh ấy đã chỉ. Tôi không biết làm thế nào khác để đặt nó.
Thomas Stringer

Tôi đã liên kết rằng bởi vì trong trường hợp đó, các kế hoạch thực hiện không giống nhau, khác với những gì câu trả lời của bạn nói.
Rachel

1
@Rachel Vấn đề trong ví dụ đó là quy tắc chuyển đổi bị thiếu . Nó không chỉ áp dụng cho các khung nhìn mà cả CTE và các biểu thức bảng khác. Trong trường hợp chung, không hợp lệ để đẩy biến vị ngữ xuống thành biểu thức bảng có chứa các hàm xếp hạng vì điều đó sẽ thay đổi kết quả. Lý do nó hợp lệ trong trường hợp này là vì Wheremệnh đề phù hợp với PARTITION BY. SQL Server 2008 dường như có một quy tắc mới SelOnSeqPrjđể nhận ra trường hợp cụ thể này.
Martin Smith


2

Dựa trên những gì tôi đọc , SQL sẽ sử dụng chế độ xem chuẩn như truy vấn phụ khi xác định kế hoạch thực hiện.

Vì vậy, sử dụng truy vấn mẫu của tôi,

SELECT Id
FROM MyView
WHERE SomeColumn = 1

nơi MyViewđược định nghĩa là

SELECT Id, SomeColumn
FROM MyTable

nó sẽ tạo ra kế hoạch thực hiện giống như

SELECT Id
FROM 
(
    SELECT Id, SomeColumn
    FROM MyTable
) as T
WHERE SomeColumn = 1

nhưng kế hoạch thực hiện này có thể khác với những gì sẽ được tạo ra với

SELECT Id
FROM MyTable
WHERE SomeColumn = 1

Tôi không chắc câu trả lời này có giống với Chế độ xem được lập chỉ mục không


Tôi không nghĩ đó là một sự thay thế văn bản rõ ràng như thế.
Aaron Bertrand

@AaronBertrand Bạn có thể đúng. Tôi thực sự không có ý tưởng ... Tôi đang học khi tôi đi :) Giả định đó dựa trên những thứ khác mà tôi đã đọc về cách các lượt xem giống như macro. Tôi đã chỉnh sửa câu hỏi một chút để xác định rằng tôi đang đề cập đến chế độ xem chuẩn, không phải là lượt xem được lập chỉ mục.
Rachel

@Rachel - Sự thay thế xảy ra với cây bị tách ra không ở cấp độ văn bản.
Martin Smith

@MartinSmith Hrrmm không phải là những gì tôi nói? Rằng các kế hoạch thực hiện phải giống nhau, không phải là văn bản sẽ giống nhau? Tôi không chắc chắn rằng tôi hiểu "cây bị tách ra"
Rachel

Đó chỉ là phản hồi cho nhận xét của bạn về chính Q nói rằng nó "chèn văn bản của Chế độ xem vào truy vấn của bạn" và nhận xét của Aaron ở trên. Một số thông tin về các giai đoạn phân tích / biên dịch ở đây . Trên thực tế câu trả lời của bạn không đề cập đến thay thế văn bản là tốt. Cho dù đây là một sự phân biệt đáng làm. Không chắc! Nhưng tôi đoán nó giải thích tại sao sp_refreshviewcần thiết mà khái niệm thay thế văn bản sẽ không.
Martin Smith
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.