Hiệu suất của Inline-TVF so với Lượt xem


9

Tôi có một cơ sở dữ liệu nơi tôi đang sử dụng TVF nội tuyến (hàm giá trị bảng) thay vì lượt xem. Ví dụ: tôi có thể có hai bảng được gọi là [kiểu xe] và [nhà sản xuất ô tô] mà tôi đang tham gia cùng nhau trong TVF [fnCarBrands].

Các TVF này sau đó được các TVF khác gọi để xử lý và báo cáo thêm. Vì vậy, tôi có thể lấy chức năng của mình [fnCarBrands] và tham gia vào bảng [Năm mua hàng] để tạo thành một chức năng [fnCarBrandHistory]. Và như vậy đối với một số lớp TVF.

Tôi có thể có được chức năng tương tự bằng cách sử dụng các chế độ xem, vì các TVF nội tuyến của tôi thực sự chỉ là các phép nối của các bảng và các TVF khác.

Làm thế nào để hiệu suất của TVF nội tuyến được viết theo cách này so với lượt xem?


Nhiều khả năng bạn sẽ thấy các kế hoạch thực hiện tương tự và hiệu suất tương tự.
AK

đó là những gì tôi nghĩ, nhưng tôi đã nói rằng TVF hoạt động giống như dấu ngoặc đơn trong đại số - nó buộc công cụ DB phải hoàn thành truy vấn đó trước khi tối ưu hóa. Sử dụng các khung nhìn, tôi được cho biết, cho phép trình tối ưu hóa tối ưu hóa toàn bộ truy vấn dưới dạng một đơn vị.
FistOfFury

Một loại lưu ý phụ nhưng có ý tưởng nào tại sao TVF được sử dụng thay vì lượt xem không? Chỉ cần tiếp cận mã-khỉ vs dữ liệu-khỉ cho vấn đề?
Mark Storey-Smith

@ MarkStorey-Smith có, lý do là như bạn nói, cách tiếp cận mã-khỉ và dữ liệu-khỉ.
FistOfFury

Câu trả lời:


12

Trình tối ưu hóa truy vấn xử lý một hàm có giá trị của bảng nội tuyến chính xác như một khung nhìn:

CREATE FUNCTION dbo.InlineUdf(@arg1 int)
RETURNS TABLE
AS
RETURN 
(
    ... your query here ...
);

Hàm đa giá trị bảng được chạy giống như một thủ tục được lưu trữ. Chúng thường phải được thực hiện nhiều lần, thay vì được xếp vào truy vấn chính:

CREATE FUNCTION dbo.MultiStatementUdf (@col1 int)
RETURNS @result TABLE 
(
    id int primary key NOT NULL,
    ... 
)
AS
BEGIN
   DECLARE @var1 int
   set @var1 = 42

   INSERT @result
   SELECT ...
   RETURN
END;

1
@Andomar sự hiểu biết của tôi là TVF đa câu lệnh được chạy như hộp đen, công cụ không biết những gì trong đó và không thể tối ưu hóa truy vấn. Bạn có bất kỳ bài viết nào bạn có thể tham khảo nói rằng lượt xem và TVF nội tuyến là tương đương không?
FistOfFury

4

Bạn sẽ cần tạo các khung nhìn tương tự với các hàm và truy vấn từng cái nhìn vào kế hoạch thực hiện để xem những gì đang xảy ra với mỗi hàm.


Chính xác. Điểm chuẩn, nhìn thấy chính mình - đây là cách đáng tin cậy duy nhất để học.
AK

@mrdenny Không có cách nào để dự đoán cách trình tối ưu hóa sẽ xử lý từng loại truy vấn? Chắc chắn có một số quy tắc nó tuân theo.
FistOfFury

2
@FistOfFury Có, có hàng ngàn quy tắc, hàng ngàn trong số chúng, được khen ngợi với hàng trăm năm phát triển mã heuristic. Đó là lý do tại sao bạn sẽ phải kiểm tra hoặc yêu cầu Microsoft cung cấp mã nguồn tối ưu hóa.
Mark Storey-Smith

Nếu bạn muốn hiểu rõ hơn về cách công cụ cơ sở dữ liệu xác định những việc cần làm thì bạn cần đọc trên SQL Server Internals, amazon.com/s/ tựa
HLGEM

3

Tất nhiên tạo ra các quan điểm gọi các quan điểm khác cũng là một kẻ giết người hiệu suất. Đừng đi xuống tuyến đường đó. Viết các truy vấn bạn cần và không sử dụng TVF hoặc lượt xem nếu bạn muốn hiệu suất. Chính việc phân lớp đang tạo ra vấn đề, điều này hầu như luôn là điều xấu khi truy vấn cơ sở dữ liệu và bạn có thể nhanh chóng đạt đến giới hạn số lượng bảng bạn có thể tham khảo, đặc biệt là khi bạn thường xuyên tham khảo cùng bảng trong các lớp khác nhau. Hơn nữa, trong khi điều này có vẻ như nó sẽ dễ dàng hơn để duy trì, thì không. Hãy thử gỡ lỗi hoặc thêm một cột do yêu cầu mới khi lớp bạn cần sửa nằm ở dưới cùng.

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.