2010-08-25 14 views
6

मुझे अंत में काम करने के लिए मेरे सम्मिलित बैच मिल गया है और अब मैं बैच के आकार के साथ झुका रहा हूं, लेकिन मुझे 50 के मूल्य और 10000 के मूल्य के बीच प्रदर्शन में कोई अंतर नहीं दिख रहा है। ऐसा लगता है मेरे लिए अजीब है, लेकिन मुझे नहीं पता कि दृश्य के पीछे क्या हो रहा है, इसलिए यह सामान्य व्यवहार हो सकता है।मैं DataAdapter.UpdateBatchSize को "इष्टतम" मान पर कैसे सेट करूं?

मैं एक टेबल में 160k पंक्तियां डाल रहा हूं और मेरे परीक्षण मूल्यों के लिए औसत समय 115 +/- 2 सेकंड है। बैचिंग के बिना 210 सेकंड लगते हैं, इसलिए मैं सुधार से काफी संतुष्ट हूं। लक्ष्य तालिका है:

CREATE TABLE [dbo].[p_DataIdeas](
    [wave] [int] NOT NULL, 
    [idnumber] [int] NOT NULL, 
    [ideaID] [int] NOT NULL, 
    [haveSeen] [bit] NOT NULL CONSTRAINT [DF_p_DataIdeas_haveSeen] DEFAULT ((0)), 
    CONSTRAINT [PK_p_DataIdeas] PRIMARY KEY CLUSTERED 
(
    [wave] ASC, 
    [idnumber] ASC, 
    [ideaID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON 
) ON [PRIMARY] 
) ON [PRIMARY] 

मैं What to look for when setting UpdateBatchSize पढ़ सकते हैं और जवाब बस विभिन्न मूल्यों की एक जोड़ी का परीक्षण किया गया था। मैं इसे समझ सकता हूं, लेकिन यदि आप टेबल डिज़ाइन, एसक्यूएल प्रश्न और डेटा को सम्मिलित करने वाले डेटा को जानते हैं, तो गणना करना संभव नहीं है या कम से कम एक अच्छा मूल्य निर्धारित करना संभव नहीं है?

क्या वहां कोई सर्वोत्तम अभ्यास है जो कोई सिफारिश कर सकता है?

उत्तर

5

आप SQL प्रोफाइलर को देखकर या SqlConnection.RetrieveStatistics() पर कॉल करके बैचिंग का प्रभाव देख सकते हैं। आपको क्या देखना चाहिए कि प्रत्येक बैच डीबी के लिए एक राउंड-ट्रिप से मेल खाता है।

बैच आकार को अनुकूलित करने के तरीके के रूप में, एक बहुत ही मोटा नियम-अंगूठा यह है कि प्रदर्शन 50 से ऊपर बैच आकार के साथ सुधार करना बंद कर देता है - वास्तव में, कभी-कभी बड़े बैच छोटे से अधिक धीरे-धीरे चल सकते हैं । यदि मैं परीक्षण करने में बहुत व्यस्त हूं, तो मैं आम तौर पर लगभग 20 के बैच से शुरू होता हूं (जब तक कि मैं टेबल मूल्यवान पैरामीटर का उपयोग नहीं कर रहा हूं, जहां 500 तक बैच छोटे से तेज हो सकते हैं)। हालांकि, इष्टतम संख्या इन्सर्ट के कुल आकार की तरह चीजों पर निर्भर करती है (क्या वे सभी रैम में फिट होंगी), आपके डीबी लॉग कितने तेज़ डिस्क पर स्थित हैं, भले ही लॉग अपने ड्राइव/एलयूएन पर है (बड़ी perf लागत अगर यह नहीं है), आदि

प्राप्त करने योग्य गति आम तौर पर लेन-देन के आकार की संख्या से पहले सीमित होती है, फिर डिस्क गति से लॉग होती है (विशेष रूप से अनुक्रमिक पहुंच संभव है या यदि इसे यादृच्छिक रूप से मजबूर होना पड़ता है एक ही spindles पर अन्य फ़ाइलों के साथ प्रतिस्पर्धा के कारण), और अंत में राम। हालांकि, सभी कारक कुछ हद तक अंतर-संबंधित भी हैं।

आपके आवेषण के पर्दे में सुधार करने का पहला कदम लेनदेन में करना होगा - शायद प्रत्येक बैच या दो लेनदेन। इसके अलावा, तालिका मूल्यवान पैरामीटर शायद INSERT INTO Table SELECT column FROM @TableArgument के साथ संग्रहीत प्रक्रिया का उपयोग करके अगला चरण है।

1

हालांकि अद्यतनबैचसाइज को बदलने से कुछ हद तक मदद मिलेगी, डेटा रिकॉर्ड करने के लिए बुनियादी डेटा का उपयोग करने के मूल दृष्टिकोण धीमे होने जा रहे हैं। ऐसा इसलिए है क्योंकि आखिरकार, एक अलग SQL कथन (सम्मिलित, अद्यतन या हटाएं) प्रत्येक पंक्ति के लिए DataAdapter द्वारा उत्पन्न किया जाएगा। UpdateBatchSize केवल SQL सर्वर पर भेजे जाने पर एक TSQL बैच में उन व्यक्तिगत विवरणों में से कितने भेजे जाते हैं, इस पर प्रभाव डालता है।

प्रदर्शन में बहुत अधिक सुधार प्राप्त करने के लिए, आप चाहते हैं कि SQLServer एक कथन में कई रिकॉर्ड डालने/अपडेट/हटाएं (आमतौर पर किसी प्रकार की जॉइन का उपयोग करके)। टेबल मूल्यवान पैरामीटर (जैसा कि रिकनज़ द्वारा वर्णित है) ऐसा करने का एक तरीका है। एक और संभावना SqlBulkCopy का उपयोग कर रही है (हालांकि आपको आमतौर पर इसके लिए एक स्टेजिंग टेबल का उपयोग करने की आवश्यकता होगी)।

0

सुनिश्चित करें कि एक सक्रिय लेनदेन भी है, यह प्रदर्शन में काफी सुधार करेगा (MySqlDataAdapter का उपयोग करके मेरे परीक्षणों में लगभग 30x)।

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