2015-07-06 7 views
5

मेरे पास एक एक XML फ़ील्ड के आधार पर कॉलम जारी है, और जब मैं इस तालिका से पूछता हूं तो SQL सर्वर हमेशा "गणना स्केलर" का उपयोग करता है। क्यूं कर? क्या यह जारी नहीं है?जब मैं एक सतत गणना वाले कॉलम को चुनता हूं तो SQL सर्वर "गणना स्केलर" क्यों करता है?

मुझे संदेह है कि मैं ऐसी कोई शर्त नहीं कर रहा हूं जो कॉलम को वास्तव में कायम रखे। मैं वास्तव में "गणना अदिश" कॉल से बचने के लिए हर सुझाव की सराहना करेंगे

create FUNCTION [dbo].[FuncTestPersisted] (@xml XML) 
RETURNS int 
WITH SCHEMABINDING 
AS 
BEGIN 
RETURN @xml.value('(/node/@value)[1]','int') 
END 


create TABLE test_TB(
    [ID] [int] NOT NULL, 
    [CustomProps] [xml] NULL, 
    [TestPersisted] AS ([dbo].[FuncTestPersisted]([CustomProps])) PERSISTED, 
CONSTRAINT [PK_test_TB] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 

: यह मेरा तालिका (और funtion आप कायम स्तंभ बनाने की जरूरत है)। कृपया, ट्रिगर्स का उपयोग किए बिना (प्रत्येक गणना वाले कोलम के लिए एक ट्रिगर ....... बहुत अधिक काम है;))

मैंने इस तालिका के साथ भी प्रयास किया है, और क्वेरी निष्पादन योजना अभी भी "गणना स्केलर" दिखाती है कहता है। क्यूं कर?

create TABLE [dbo].[test_TB](
    [ID] [int] NOT NULL, 
    [CustomProps] [xml] NULL, 
    [TestPersisted] AS (5*ID) PERSISTED, 
CONSTRAINT [PK_test_TB] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 
+1

[यह उत्तर] (http://stackoverflow.com/a/5999986/1048425) मदद करनी चाहिए। – GarethD

+0

मैंने इसे देखा है। धन्यवाद। लेकिन समाधान यह है: समाधान नहीं है और कारण नहीं है ... :( – Tirma

+0

@ टीआरएम एमएस समर्थन मंच के जवाब में लिंक बताता है कि कुछ मामलों में क्वेरी को फिर से लिखना संभव है ताकि मान को फिर से नहीं बनाया जा सके। शायद कोशिश करें? –

उत्तर

0

गैरेथड सही है। एसक्यूएल में लगातार कॉलम निराशाजनक हैं। आप उन्हें सोचते हैं कि वे प्रदर्शन में सुधार करेंगे। यदि आप आईडी * 5, या उस मामले के लिए किसी भी अन्य गणना जैसे मूल्य को लगातार कैश करना चाहते हैं, तो बस एक और कॉलम जोड़ें और एक बार मूल्य की गणना करें और परिणाम संग्रहित करें।

संबंधित मुद्दे