तालिका-मान्य फ़ंक्शन (TVF) बनाम दृश्य


83

तालिका-मूल्यवान कार्यों और विचारों के बीच अंतर क्या है? क्या कुछ ऐसा है जिसे आप 1 के साथ कर सकते हैं जो दूसरे के साथ करना मुश्किल या असंभव है? या अंतर दक्षता में निहित है?

जवाबों:


136

एक पैरामीटर रहित इनलाइन 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 का मूल्यांकन और रिटर्न टेबल प्रकार (मूल रूप से टेबल चर) में संग्रहीत किया जाएगा

कभी-कभी इनलाइन TVFs को सीधे पैरामीटर करने की क्षमता एक दृश्य के खिलाफ समान पैरामीटर वाली क्वेरी की तुलना में बेहतर निष्पादन योजना का कारण बन सकती है।


3
आपका क्या मतलब है tvf Is Updatable?
रॉय नमिर

2
@RoyiNamir - बेस टेबल को व्यू के समान अपडेट करने के लिए इनलाइन टीवीएफ का उपयोग किया जा सकता है।
मार्टिन स्मिथ

क्या आपका मतलब यह है कि एक TVF अपने से ही returend table को अपडेट कर सकता है?
रॉय नमिर

12
@ रोयनिमीर - उदाहरण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
मार्टिन स्मिथ

5

मेरे पास आम तौर पर अंगूठे का एक नियम है जब यह तय करने की बात आती है कि क्या मुझे या तो SELECTइसे एक में बदलना है VIEWया नहीं TVF

क्या दृश्य को समाप्त होने में 2 सेकंड से अधिक समय लगता है और क्या इसके 10,000 से अधिक रिकॉर्ड हैं? यदि हां, तो इसे टीवीएफ में बदल दें। यदि नहीं, तो इसे अकेला छोड़ दें।

बेशक नियम विशुद्ध रूप से प्रदर्शन पर आधारित है ।

एक टीवीएफ के साथ, मैं CROSS APPLYएक तालिका के रूप में व्यवहार करने के लिए उदाहरण के लिए, एक का उपयोग कर सकता हूं , लेकिन एक विशिष्ट मान, जैसे कि प्राथमिक कुंजी

WHERE ID = xxx, जहां 'xxx' वह मान है जो मैं SELECT में पास करता हूं।

प्रदर्शन तेजी से रास्ता है!

यदि मेरे पास टीवीएफ का एक दृश्य है, तो मुझे अपने चयन में 1% से कम वापस लौटने के लिए दृश्य को 2 मिलियन से अधिक पंक्तियों को वापस लाने की अनुमति देनी होगी।

कुछ चीजें सोचने के लिये।


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

1
और ऐसा होगा। वास्तव में, एक तालिका बनाने से एक बहुत धीमी गति से कार्य होता है। इनलाइन फ़ंक्शन, यानी एक एकल RETURNSखंड के साथ किसी भी अस्थायी तालिका बनाने की आवश्यकता नहीं होगी, ताकि यह कम से कम दो बार तेजी से चले। संभवतः बहुत तेजी से, क्योंकि ऑप्टिमाइज़र ऑप्टिमाइज़ेशन में अपनी क्वेरी को शामिल करने में सक्षम होगा
पनागोटिस कानावोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.