जब एक संग्रहीत कार्यविधि को निष्पादित किया जाता है तो इसे पार्स किया जाता है और एक क्वेरी योजना में संकलित किया जाता है, इसे कैश किया जाता है और आप इसे XML प्रारूप में sys.dm_exec_cached_plans और sys.dm_exec_query_plan के माध्यम से एक्सेस कर सकते हैं। क्वेरी प्लान पार्स किए गए कोड के प्रत्येक अनुभाग की 'आउटपुट सूची' को रिकॉर्ड करता है। संग्रहीत कार्यविधि द्वारा कौन से कॉलम का उपयोग किया जाता है, यह देखना इस XML को क्वेरी करने का मामला है, जैसे:
--Execute the stored procedure to put its query plan in the cache
exec sys.sp_columns ''
DECLARE @TargetObject nvarchar(100) = 'sys.sp_columns';
WITH XMLNAMESPACES (
'http://schemas.microsoft.com/sqlserver/2004/07/showplan' as ns1
), CompiledPlan AS (
SELECT
(SELECT query_plan FROM sys.dm_exec_query_plan(cp.plan_handle)) qp,
(SELECT ObjectID FROM sys.dm_exec_sql_text(cp.plan_handle)) ob
FROM sys.dm_exec_cached_plans cp
WHERE objtype = 'Proc'
), ColumnReferences AS (
SELECT DISTINCT
ob,
p.query('.').value('./ns1:ColumnReference[1]/@Database', 'sysname') AS [Database],
p.query('.').value('./ns1:ColumnReference[1]/@Schema', 'sysname') AS [Schema],
p.query('.').value('./ns1:ColumnReference[1]/@Table', 'sysname') AS [Table],
p.query('.').value('./ns1:ColumnReference[1]/@Column', 'sysname') AS [Column]
FROM CompiledPlan
CROSS APPLY qp.nodes('//ns1:ColumnReference') t(p)
)
SELECT
[Database],
[Schema],
[Table],
[Column]
FROM ColumnReferences
WHERE
[Database] IS NOT NULL AND
ob = OBJECT_ID(@TargetObject, 'P')
चेतावनी देने वाला यह इस बात पर निर्भर करता है कि आप 'प्रयुक्त' को कैसे परिभाषित करते हैं। यह हो सकता है कि आपकी संग्रहीत प्रक्रिया के भीतर एक सीटीई एक तालिका से 5 कॉलम का संदर्भ देता है, लेकिन फिर जब इस सीटीई का उपयोग किया जाता है तो केवल तीन कॉलम ही पास होते हैं। क्वेरी अनुकूलक हो सकता है इन अतिरिक्त क्षेत्रों को अनदेखा करें और उन्हें योजना में शामिल न करें। दूसरी तरफ ऑप्टिमाइज़र यह तय कर सकता है कि यह आउटपुट में अतिरिक्त फ़ील्ड्स को शामिल करके अधिक कुशल क्वेरी बना सकता है ताकि बाद में इसे बेहतर इंडेक्स का उपयोग करने में सक्षम बनाया जा सके। यह कोड क्वेरी योजना द्वारा उपयोग किए गए कॉलम लौटाएगा, हो सकता है कि वे वास्तव में संग्रहीत प्रक्रिया कोड में मौजूद कॉलम न हों।