ज्यादातर मामलों में, तालिका को संदर्भित करने वाले स्केलर मूल्यवान कार्यों से बचना सबसे अच्छा है क्योंकि (जैसा कि अन्य ने कहा) वे मूल रूप से ब्लैक बॉक्स हैं जिन्हें प्रत्येक पंक्ति के लिए एक बार चलाने की आवश्यकता होती है, और क्वेरी प्लान इंजन द्वारा अनुकूलित नहीं किया जा सकता है। इसलिए, संबंधित तालिकाओं में अनुक्रमित होने पर भी वे रैखिक रूप से स्केल करने की प्रवृत्ति रखते हैं।
आप इनलाइन-टेबल-वैल्यू फ़ंक्शन का उपयोग करने पर विचार करना चाह सकते हैं, क्योंकि उनका मूल्यांकन क्वेरी के साथ इनलाइन किया जाता है, और उन्हें अनुकूलित किया जा सकता है। आपको वह एनकैप्सुलेशन मिलता है जो आप चाहते हैं, लेकिन भावों को सही चयन कथन में चिपकाने का प्रदर्शन।
इनलाइन होने के एक साइड इफेक्ट के रूप में, उनमें कोई प्रक्रियात्मक कोड नहीं हो सकता है (कोई घोषणा नहीं @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)