तालिका-मूल्यवान कार्यों और विचारों के बीच अंतर क्या है? क्या कुछ ऐसा है जिसे आप 1 के साथ कर सकते हैं जो दूसरे के साथ करना मुश्किल या असंभव है? या अंतर दक्षता में निहित है?
जवाबों:
एक पैरामीटर रहित इनलाइन TVF और एक गैर-भौतिकीकृत दृश्य बहुत समान हैं। कुछ कार्यात्मक अंतर जो वसंत के मन में हैं, नीचे हैं।
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
रनटाइम व्यूज़ और इनलाइन टीवीएफ में, दोनों व्युत्पन्न और समान रूप से व्युत्पन्न टेबल या सीटीई के साथ व्यवहार किया जाता है। उनका पूरी तरह से मूल्यांकन नहीं किया जा सकता है (या कुछ मामलों में भी) या दूसरों में कई बार मूल्यांकन किया जा सकता है । बहुस्तरीय TVFs का मूल्यांकन और रिटर्न टेबल प्रकार (मूल रूप से टेबल चर) में संग्रहीत किया जाएगा
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
औरVIEW_METADATA
मेरे पास आम तौर पर अंगूठे का एक नियम है जब यह तय करने की बात आती है कि क्या मुझे या तो SELECT
इसे एक में बदलना है VIEW
या नहीं TVF
।
क्या दृश्य को समाप्त होने में 2 सेकंड से अधिक समय लगता है और क्या इसके 10,000 से अधिक रिकॉर्ड हैं? यदि हां, तो इसे टीवीएफ में बदल दें। यदि नहीं, तो इसे अकेला छोड़ दें।
बेशक नियम विशुद्ध रूप से प्रदर्शन पर आधारित है ।
एक टीवीएफ के साथ, मैं CROSS APPLY
एक तालिका के रूप में व्यवहार करने के लिए उदाहरण के लिए, एक का उपयोग कर सकता हूं , लेकिन एक विशिष्ट मान, जैसे कि प्राथमिक कुंजी ।
WHERE ID = xxx
, जहां 'xxx' वह मान है जो मैं SELECT में पास करता हूं।
प्रदर्शन तेजी से रास्ता है!
यदि मेरे पास टीवीएफ का एक दृश्य है, तो मुझे अपने चयन में 1% से कम वापस लौटने के लिए दृश्य को 2 मिलियन से अधिक पंक्तियों को वापस लाने की अनुमति देनी होगी।
कुछ चीजें सोचने के लिये।
मैंने पाया है कि मल्टीस्टेमेंट TVFs के साथ जुड़ने से व्यूज की तुलना में बेहतर प्रदर्शन होता है जब एक PK फ़ंक्शन के रिटर्न टेबल पर निर्दिष्ट होता है।
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
खंड के साथ किसी भी अस्थायी तालिका बनाने की आवश्यकता नहीं होगी, ताकि यह कम से कम दो बार तेजी से चले। संभवतः बहुत तेजी से, क्योंकि ऑप्टिमाइज़र ऑप्टिमाइज़ेशन में अपनी क्वेरी को शामिल करने में सक्षम होगा
Is Updatable
?