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:
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.
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
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
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)
CREATE TABLE T(C INT);EXEC('CREATE FUNCTION F () RETURNS TABLE AS RETURN (SELECT * FROM T)');INSERT INTO F() VALUES(1);SELECT * FROM T;
with check option
vàVIEW_METADATA
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 SELECT
thành a VIEW
hay 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 APPLY
ví 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ĩ.
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
RETURNS
mệ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
Is Updatable
gì tvf ?