Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर स्केलर-मूल्यवान फ़ंक्शन धीमे क्यों हो जाते हैं?

ज्यादातर मामलों में, तालिका को संदर्भित करने वाले स्केलर मूल्यवान कार्यों से बचना सबसे अच्छा है क्योंकि (जैसा कि अन्य ने कहा) वे मूल रूप से ब्लैक बॉक्स हैं जिन्हें प्रत्येक पंक्ति के लिए एक बार चलाने की आवश्यकता होती है, और क्वेरी प्लान इंजन द्वारा अनुकूलित नहीं किया जा सकता है। इसलिए, संबंधित तालिकाओं में अनुक्रमित होने पर भी वे रैखिक रूप से स्केल करने की प्रवृत्ति रखते हैं।

आप इनलाइन-टेबल-वैल्यू फ़ंक्शन का उपयोग करने पर विचार करना चाह सकते हैं, क्योंकि उनका मूल्यांकन क्वेरी के साथ इनलाइन किया जाता है, और उन्हें अनुकूलित किया जा सकता है। आपको वह एनकैप्सुलेशन मिलता है जो आप चाहते हैं, लेकिन भावों को सही चयन कथन में चिपकाने का प्रदर्शन।

इनलाइन होने के एक साइड इफेक्ट के रूप में, उनमें कोई प्रक्रियात्मक कोड नहीं हो सकता है (कोई घोषणा नहीं @variable; सेट @variable =..; वापसी)। हालांकि, वे कई पंक्तियों और स्तंभों को वापस कर सकते हैं।

आप अपने कार्यों को कुछ इस तरह फिर से लिख सकते हैं:

create function usf_GIS_GET_LAT(
    @City varchar (30),
    @State char (2)
)
returns table
as return (
  select top 1 lat
  from GIS_Location with (nolock) 
  where [State] = @State
    and [City] = @City
);

GO

create function usf_GIS_GET_LON (
    @City varchar (30),
    @State char (2)
)
returns table
as return (
  select top 1 LON
  from GIS_Location with (nolock)
  where [State] = @State
    and [City] = @City
);

इनका उपयोग करने का सिंटैक्स भी थोड़ा अलग है:

select
    Lat.Lat,
    Lon.Lon
from
    Address_Location with (nolock)
    cross apply dbo.usf_GIS_GET_LAT(City,[State]) AS Lat
    cross apply dbo.usf_GIS_GET_LON(City,[State]) AS Lon
WHERE
    ID IN (SELECT TOP 100 ID FROM Address_Location WITH(NOLOCK) ORDER BY ID DESC)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसक्यूएल सर्वर में सबक्वायरी का उपयोग कर अद्यतन क्वेरी

  2. java.library.path में कोई sqljdbc_auth नहीं है

  3. SQL सर्वर में एक स्ट्रिंग के भीतर एक स्ट्रिंग कैसे खोजें?

  4. SQL सर्वर में तालिका-मूल्यवान फ़ंक्शन के माध्यम से डेटा हटाएं

  5. SQL सर्वर डेटाबेस में किसी ऑब्जेक्ट (तालिका, दृश्य, संग्रहीत प्रक्रिया) की स्कीमा कैसे बदलें - SQL सर्वर / TSQL ट्यूटोरियल भाग 28