Chức năng Định giá Bảng (TVF) so với Chế độ xem


83

Sự khác biệt giữa các chức năng có giá trị bảng và chế độ xem là gì? Có điều gì bạn có thể làm với 1 cái khó hoặc không thể làm với cái kia không? Hay sự khác biệt nằm ở hiệu quả?

Câu trả lời:


134

Một TVF nội tuyến không tham số và một Chế độ xem không hiện thực hóa rất giống nhau. Dưới đây là một vài điểm khác biệt về chức năng.

Lượt xem

Accepts Parameters               - No
Expanded out by Optimiser        - Yes
Can be Materialized in advance   - Yes (through indexed views)
Is Updatable                     - Yes 
Can contain Multiple Statements  - No
Can have triggers                - Yes
Can use side-effecting operator  - Yes  

TVF nội tuyến

Accepts Parameters               - Yes
Expanded out by Optimiser        - Yes
Can be Materialized in advance   - No
Is Updatable                     - Yes
Can contain Multiple Statements  - No
Can have triggers                - No
Can use side-effecting operator  - No    

TVF đa cấp

Accepts Parameters               - Yes
Expanded out by Optimiser        - No
Can be Materialized in advance   - No
Is Updatable                     - No
Can contain Multiple Statements  - Yes
Can have triggers                - No
Can use side-effecting operator  - No    

Tại thời gian chạy Chế độ xem và TVF nội tuyến đều được nội tuyến và xử lý tương tự như các bảng hoặc CTE dẫn xuất. Chúng có thể không được đánh giá toàn bộ (hoặc thậm chí là hoàn toàn trong một số trường hợp) hoặc có thể được đánh giá nhiều lần ở những người khác . Các TVF đa câu sẽ luôn được đánh giá và lưu trữ trong loại bảng trả về (về cơ bản là một biến bảng)

Đôi khi khả năng tham số hóa các TVF nội tuyến trực tiếp có thể dẫn đến một kế hoạch thực thi tốt hơn so với truy vấn được tham số tương đương đối với một chế độ xem.


3
ý bạn là Is Updatablegì tvf ?
Royi Namir

2
@RoyiNamir - Một TVF nội tuyến có thể được sử dụng để cập nhật bảng cơ sở tương tự như một khung nhìn.
Martin Smith

ý bạn là TVF có thể cập nhật bảng returend từ chính nó?
Royi Namir

12
@RoyiNamir - Ví dụCREATE TABLE T(C INT);EXEC('CREATE FUNCTION F () RETURNS TABLE AS RETURN (SELECT * FROM T)');INSERT INTO F() VALUES(1);SELECT * FROM T;
Martin Smith

Một vài điểm khác biệt khác with check optionVIEW_METADATA
Martin Smith

5

Tôi thường có một quy tắc ngón tay cái khi quyết định chuyển đổi của tôi SELECTthành a VIEWhay a TVF.

Chế độ xem có mất hơn 2 giây để kết thúc và nó có hơn 10.000 bản ghi không? Nếu CÓ, hãy biến nó thành TVF. Nếu không, hãy để nó yên.

Tất nhiên quy tắc hoàn toàn dựa trên hiệu suất .

Với TVF, tôi có thể sử dụng CROSS APPLYví dụ: để coi nó như một bảng, nhưng chuyển một giá trị cụ thể, chẳng hạn như khóa chính .

WHERE ID = xxx, trong đó 'xxx' là giá trị tôi chuyển vào SELECT.

Hiệu suất nhanh hơn!

Nếu tôi có một lượt xem TVF, tôi sẽ phải cho phép chế độ xem này mang lại hơn 2 triệu hàng chỉ để trả lại ít hơn 1% trong số đó trong các lựa chọn của tôi.

Đôi điều suy nghĩ.


2

Tôi nhận thấy rằng các phép tham gia với TVF MultiStatement hoạt động tốt hơn nhiều so với Chế độ xem khi PK được chỉ định trên bảng trả về của hàm.

CREATE FUNCTION [FORMREQS].[fnGetFormsStatus] ()
RETURNS

/* Create a PK using two of the columns */
@Indexed TABLE (
    [OrgID] [char](8) NOT NULL,
    [PkgID] [int] NOT NULL,
    [FormID] varchar(5) NOT NULL,
    PRIMARY KEY CLUSTERED(OrgID, PkgID) 
)
AS
BEGIN
INSERT @Indexed SELECT OrgID, PkgID, FormID FROM FormsTable

RETURN

END

1
Và các lượt xem cũng vậy. Trên thực tế, việc xây dựng một bảng dẫn đến một chức năng chậm hơn nhiều. Một hàm nội tuyến, tức là một hàm có một RETURNSmệnh đề đơn lẻ sẽ không cần tạo bất kỳ bảng tạm thời nào để nó chạy nhanh hơn ít nhất hai lần. Có thể nhanh hơn rất nhiều, vì tôi ưu hoa sẽ có thể bao gồm truy vấn của nó trong việc tối ưu hóa
Panagiotis Kanavos
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.