2012-02-03 10 views
6

काम पर हम एक संग्रहीत प्रक्रिया में हैकिंग कर रहे हैं और हमने कुछ देखा है।क्या SQL सर्वर स्मार्ट है जो अद्यतन नहीं है यदि मान समान हैं?

हमारे अपडेट स्टेटमेंट्स में से एक के लिए, हमने देखा है कि यदि मान पिछले मानों के समान हैं तो हमारे पास प्रदर्शन लाभ था।

हम यह नहीं कह रहे थे

UPDATE t1 SET A=5 

जहां स्तंभ पहले से ही 5. के बराबर था गया था हम कुछ इस तरह कर रहे थे: वैसे भी

UPDATE t1 SET A = Qty*4.3 

, एसक्यूएल सर्वर बहुत चालाक करने के लिए नहीं है ऑपरेशन यदि मान एक अद्यतन ऑपरेशन में मूल्यांकन करते हैं या क्या मैं किसी अन्य घटना से बेवकूफ बन रहा हूं?

उत्तर

7

हां आप कुछ प्रदर्शन लाभ देखेंगे। मैं बेहतर समझ पाने के लिए इस लेख को पढ़ने की सलाह देते हैं (यह समझा जाएगा कि क्यों ज्यादातर की तुलना में मैं कर सकते हैं बेहतर):

http://sqlblog.com/blogs/paul_white/archive/2010/08/11/the_2D00_impact_2D00_of_2D00_update_2D00_statements_2D00_that_2D00_don_2D00_t_2D00_change_2D00_data.aspx

2

टीएसक्यूएल आउटपुट से निर्णय लेते हुए, यह यूपीडीएटी को निष्पादित करता है भले ही यह एक ही मूल्य के लिए हो।

CREATE TABLE test (id INT, val int); 
GO 

INSERT INTO test VALUES(1, 1); 
GO 
(1 row(s) affected) 

UPDATE test SET val=1 WHERE id=1; 
GO 
(1 row(s) affected) 

जब डिस्क पर वास्तविक लेखन की बात आती है, तो मुझे निश्चित रूप से उम्मीद है कि इसकी आवश्यकता नहीं है।

संपादित करें: गहराई से विश्लेषण के लिए @AbeMiessler से उत्तर देखें कि लॉग/डिस्क भाग कैसे लिखता है।

+0

एक राइट-टू-डिस्क के अभाव निश्चित रूप से एक प्रदर्शन लाभ है। – simon

+0

समस्या का महान विश्लेषण, बीटीडब्ल्यू – simon

+0

मुझे नहीं लगता कि डिस्क पर लिखना तुरंत होता है। मुझे लगता है कि सवाल यह है कि "पृष्ठ गंदे के रूप में ध्वजांकित हो जाता है" –

0

एसक्यूएल को वास्तव में कुछ और करने से पहले संख्यात्मक परिणाम की गणना करनी होगी, इसे ऐसा करना है, इसलिए यह जानता है कि इसे "कुछ करने" के लिए क्या मूल्य है। इसके बावजूद इसे तुलना करने के लिए तालिका से मूल्य पढ़ने की आवश्यकता होगी।

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

+2

मैं असहमत हूं।एक अद्यतन के लिए इसे एक रिपोर्ट करना है, यह पुष्टि करने के लिए कि वास्तव में अद्यतन जारी करने से पहले पंक्तियों (ओं), और संभावित रूप से इंडेक्स पर लॉक को थप्पड़ मारने के लिए एक पंक्ति है। इसलिए, यदि पढ़ा वैसे भी किया जाता है, और यह निर्धारित करता है कि वास्तव में कोई डेटा नहीं बदला जा रहा है, तो यह वास्तविक लेखन चरण को छोड़ सकता है। –

1

आप अपने टेबल इंडेक्स की विशिष्ट स्थिति के आधार पर कुछ प्रदर्शन लाभ देख रहे हैं।

यदि तालिका अनुक्रमित है, और अद्यतन की आवश्यकता नहीं है कि किसी भी डेटा को चारों ओर स्थानांतरित किया गया हो (क्लस्टर्ड) या कोई अनुक्रमणिका को बदलने की आवश्यकता नहीं है (गैर-क्लस्टर), तो आप एक लाभ देख सकते हैं।

यदि आप अपडेट करने के लिए एसक्यूएल बताते हैं, तो यह अपडेट हो जाएगा। तो, मैं हार्डवेयर पक्ष की ओर देखता हूं (उदा।, अनुक्रमण)।