এসকিউএল: সিপিইউ বা আইও না হলে ইনসার্টগুলি কী কমিয়ে দিচ্ছে?


19

আমাদের কাছে এমন একটি পণ্যের জন্য একটি ডেটাবেস রয়েছে যা ভারী লেখা। আমরা সবেমাত্র একটি এসএসডি সাহায্যের জন্য একটি নতুন সার্ভার মেশিন কিনেছি। আমাদের অবাক করার মতো বিষয় হল যে সন্নিবেশগুলি খুব ধীর স্টোরেজ সহ আমাদের পুরানো মেশিনের চেয়ে দ্রুত ছিল না। বেঞ্চমার্কিংয়ের সময় আমরা লক্ষ্য করেছি যে এসকিউএল সার্ভার প্রক্রিয়া দ্বারা প্রদর্শিত আইও হার খুব কম।

উদাহরণস্বরূপ, আমি এই পৃষ্ঠায় পাওয়া স্ক্রিপ্টটি চালিয়েছি, আমি লুপটির চারপাশে একটি শুরু ট্রেন এবং সংযুক্তি যুক্ত করে। সর্বোপরি আমি দেখতে পেলাম ডিস্কের ব্যবহার 7Mb / s এ পৌঁছেছে, যখন সিপিইউ সবে 5% ছুঁয়েছে। সার্ভারটিতে G৪ জিবি ইনস্টল করা আছে এবং এটি 10 ​​ব্যবহার করছে The মোট কল সময়টি 2 মিনিটের 15 সেকেন্ড ছিল পরবর্তী কলগুলির জন্য প্রথম কলের জন্য প্রায় 1 মিনিটের মতো ডাউন। ডাটাবেসটি সহজ পুনরুদ্ধারে রয়েছে এবং পরীক্ষার সময় অলস ছিল। আমি প্রতিটি কলের মধ্যে টেবিলটি ফেলেছি।

এত সরল স্ক্রিপ্ট এত মন্থর কেন? হার্ডওয়ারটি সবেমাত্র ব্যবহার করা হচ্ছে। উভয় ডেডিকেটেড ডিস্ক বেঞ্চমার্কিং সরঞ্জাম এবং এসকিউআইও ইঙ্গিত দেয় যে এসএসডি পড়া এবং লেখার জন্য উভয়ই 500 এমবি / সেকেন্ডের গতিতে সঠিকভাবে সম্পাদন করে। আমি বুঝতে পারি যে এলোমেলো লেখাগুলি ক্রমিক লেখার চেয়ে ধীর, তবে আমি ক্লাস্টার ইনডেক্সিং ছাড়াই একটি টেবিলের কাছে এটির মতো একটি সাধারণ সন্নিবেশ আশা করবো, আরও দ্রুত হবে।

শেষ পর্যন্ত আমাদের পরিস্থিতি আরও জটিল, তবে আমি অনুভব করি যে প্রথমে আমার একটি সহজ মামলা বুঝতে হবে। সংক্ষেপে আমাদের অ্যাপ্লিকেশন পুরানো ডেটা মুছে ফেলে, তারপরে স্কেলবুল্ককপি ব্যবহার করে নতুন ডেটা স্টেজিং টেবিলগুলিতে অনুলিপি করে, কিছু ফিল্টারিং সম্পাদন করে এবং অবশেষে চূড়ান্ত টেবিলগুলিতে ডেটা অনুলিপি করার ক্ষেত্রে মার্জ এবং / অথবা ইনসার্ট ইনটো ব্যবহার করে।

-> সম্পাদনা 1: আমি মার্টিন স্মিথের সাথে সংযুক্ত পদ্ধতিটি অনুসরণ করেছি এবং আমি নিম্নলিখিত ফলাফল পেয়েছি:

[Wait Type]  [Wait Count] [Total Wait (ms)] [T. Resource Wait (ms)] [T. Signal Wait (ms)]
NETWORK_IO          5008              46735                 46587        148
LOGBUFFER           901               5994                  5977         17
PAGELATCH_UP        40                866                   865          1
SOS_SCHEDULER_YIELD 53279             219                   121          98
WRITELOG            5                 145                   145          0
PAGEIOLATCH_UP      4                 58                    58           0
LATCH_SH            5                 0                     0            0

এসআইকিএল ফাইলগুলি ব্যতীত অন্য কোথাও প্রদর্শন করার কোনও ফলাফল নেই এবং কোনও ডেটা স্থানান্তরিত করার কোনও ফলাফল নেই বলে বিবেচনা করে আমি দেখতে পেয়েছি NETWORK_IO বেশিরভাগ সময় নেয়। NETWORK_IO প্রকারে সমস্ত আইও অন্তর্ভুক্ত রয়েছে?

-> সম্পাদনা 2: আমি একটি 20 জিবি র‌্যাম ডিস্ক তৈরি করেছি এবং সেখান থেকে একটি ডাটাবেস মাউন্ট করেছি। এসএসডি-তে আমার সেরা সময়টি ছিল 48 সেকেন্ড, র‌্যাম ডিস্কের সাথে এটি 37 সেকেন্ডে নেমে যায়। নেট ওয়ার্ক_আইও এখনও সবচেয়ে বড় অপেক্ষা is র‌্যাম ডিস্কে সর্বাধিক লেখার গতি ছিল প্রায় 250Mb / s যখন এটি প্রতি সেকেন্ডে বহু গিগাবাইট করতে সক্ষম হয়। এটি এখনও বেশি সিপিইউ ব্যবহার করে নি, তাই এসকিউএল ধরে রাখছে কি?



3
NETWORK_IO3 মিলিয়ন "1 সারি (গুলি) আক্রান্ত" বার্তা ফেরত পাঠানো হচ্ছে থেকে হতে পারে। আপনি SET NOCOUNT ONস্ক্রিপ্টে যুক্ত করার চেষ্টা করেছেন ?
মার্টিন স্মিথ

হ্যাঁ, আমি NOCOUNT যুক্ত করেছি।
ডিজেফ

2
স্ট্রেঞ্জ। আমি তখনও নেটওয়ার্ক ক্রিয়াকলাপের পথে খুব বেশি আশা করব না। আপনি রান মধ্যে পুরানো বর্ধিত ইভেন্ট ফাইল মুছে ফেলা হয়েছে? যে স্ক্রিপ্টটি সেগুলি পড়ছে তাতে একটি ওয়াইল্ড কার্ড ব্যবহার করা হয়েছে EE_WaitStats*.xelযাতে পুরানো আপনার ফলাফলগুলিকে দূষিত করে।
মার্টিন স্মিথ

শুভ কল, আমি ফলাফলগুলি আপডেট করব om
ডিজেফ

উত্তর:


9

আমি জানি এটি একটি পুরানো প্রশ্ন তবে এটি এখনও অনুসন্ধানকারীদের সহায়তা করতে পারে এবং এটি এমন সমস্যা যা এখন এবং পরে পপ আপ হয়।

কোনও রিসোর্স বাধা না পেয়ে আপনি যে কোনও পারফরম্যান্স সিলিং মারছেন তার মূল কারণ হ'ল আপনি এক সেশনের একক থ্রেডের মধ্যে কী কী প্রক্রিয়া করা সম্ভব তার সীমাতে পৌঁছেছেন। লুপটি সমান্তরালভাবে প্রক্রিয়াজাত হয় না, তবে সমস্ত সন্নিবেশ ক্রমিকভাবে করা হয়।

আমার ক্ষেত্রে, 3 মিলিয়ন সারি sertোকাতে 36 সেকেন্ড সময় লাগে। তার মানে প্রতি সারি 36/30000000 = 0.000012 সেকেন্ড। এটা বেশ দ্রুত। আমার সিস্টেমে প্রয়োজনীয় সমস্ত পদক্ষেপগুলি অতিক্রম করতে কেবল 0.000012 লাগে takes

এটি দ্রুত সম্পন্ন করার একমাত্র উপায় সমান্তরালে দ্বিতীয় সেশন শুরু করা।

যদি আমি 15 মিলিয়ন সন্নিবেশ করে সমান্তরালে 2 সেশন শুরু করি। উভয়ই 18 সেকেন্ডে শেষ হয়। আমি আরও স্কেল করতে পারলাম, তবে আমার বর্তমান পরীক্ষার সেটআপটি দুটি সমান্তরাল সেশনের সাথে 95% সিপিইউ মারছে, সুতরাং আমি সিপিইউ বাটনেলে আঘাত হানার পরে 3 করায় ফলাফলগুলি ঝুঁকবে।

যদি আমি 3 মিলিয়ন সারি সন্নিবেশ করানো উভয় সমান্তরাল সেশন শুরু করি তবে তারা উভয়ই 39 সেকেন্ডের মধ্যে শেষ করবে। সুতরাং এখন 39 সেকেন্ডে 6 মিলিয়ন সারি।

ঠিক আছে, এটি আমাদের এখনও নেটওয়র্ক_আইও অপেক্ষা করে দেখাতে ছাড়বে।

NETWORK_IO অপেক্ষা করে এমনটি যুক্ত হয় যে আপনি বর্ধিত ইভেন্টগুলি তাদের ট্রেস করতে ব্যবহার করছেন। আমার ক্ষেত্রে সন্নিবেশটি সেকেন্ডে লাগে (গড় হিসাবে)। বর্ধিত ইভেন্টের উপায়টি ব্যবহার করার সময় (উপরের লিঙ্কটি থেকে প্রথম মন্তব্যটিতে) এটি নিবন্ধিত:

Wait Type             Wait Count  Total Wait Time (ms) Total Resource Wait Time (ms) Total Signal Wait Time (ms)
NETWORK_IO            3455        68808                68802                         6
PAGEIOLATCH_SH        3           64                   64                            0
PAGEIOLATCH_UP        12          58                   58                            0
WRITE_COMPLETION      8           15                   15                            0
WRITELOG              3           9                    9                             0
PAGELATCH_UP          2           4                    4                             0
SOS_SCHEDULER_YIELD   32277       1                    0                             1
IO_COMPLETION         8           0                    0                             0
LATCH_SH              3           0                    0                             0
LOGBUFFER             1           0                    0                             0

আপনি দেখতে পাচ্ছেন যে NETWORK_IO এর 68 সেকেন্ড নিবন্ধিত। তবে যেহেতু সন্নিবেশ লুপটি একক থ্রেডেড ক্রিয়া যা 36 সেকেন্ড সময় নিয়েছে তাই এটি হতে পারে না। (হ্যাঁ, একাধিক থ্রেড ব্যবহৃত হয়, তবে ক্রিয়াকলাপগুলি সিরিয়াল হয়, কখনও কখনও সমান্তরালে হয় না, সুতরাং আপনি ক্যোয়ারির মোট সময়কাল অপেক্ষা অপেক্ষা করার অপেক্ষা রাখে না)

আমি যদি বর্ধিত ইভেন্টগুলি না ব্যবহার করি তবে একটি শান্ত দৃষ্টিতে কেবল অপেক্ষা পরিসংখ্যানের ডিএমভিগুলি (কেবল আমার সন্নিবেশটি চালানো দিয়ে) আমি এটি পাই:

Wait Type                   Wait Count  Total Wait Time (ms)  Total Resource Wait Time (ms) Signal Resource Wait Time (ms)
SOS_SCHEDULER_YIELD             8873                 0.21                                    0.01                                    0.20
PAGEIOLATCH_UP                  3                    0.02                                    0.02                                    0.00
PREEMPTIVE_OS_AUTHENTICATIONOPS 17                   0.02                                    0.02                                    0.00
PAGEIOLATCH_SH                  1                    0.00                                    0.00                                    0.00

সুতরাং আপনি NETWORK_IO প্রসারিত ইভেন্টের লগটিতে যা দেখছিলেন তা আপনার সন্নিবেশ লুপের সাথে সম্পর্কিত ছিল না। (আপনি যদি অ্যাকাউন্টটি চালু না করেন, আপনার কাছে প্রচুর অ্যাসিঙ্ক নেটওয়ার্ক আইও অপেক্ষা করবে, +1 মার্টিন)

তবে আমি জানি না কেন নেটওয়র্ক_আইও বর্ধিত ইভেন্টের ট্রেসটিতে প্রদর্শিত হবে। ইভেন্টগুলির async ফাইল টার্গেটে ASYNC_NETWORK_IO জমা হওয়ার বিষয়টি নিশ্চিত করুন, তবে অবশ্যই এটি সমস্ত ডিফারেন্ট এসপিআইডি-তে করা হয়েছে যার পরে আমরা ফিল্টার করছি। আমি নিজেই এটি একটি নতুন প্রশ্ন হিসাবে জিজ্ঞাসা করতে পারি)


1
"আপনি কোনও উত্সের বাধা না দেখে পারফরম্যান্স সিলিংটি মারছেন কারণ আপনি এক সেশনের একক থ্রেডের মধ্যে কী কী প্রক্রিয়া করা সম্ভব তার সীমাতে পৌঁছেছেন": আপনি একটি 100% সিপিইউ বাটনেক (একটি কোরতে) বর্ণনা করছেন। যদি কোন বোতলের হয়, তাহলে সিস্টেমের হবে , দ্রুত যেতে তাই অন্য কিছু খেলার সময়ে হতে হবে।
রিমাস রুসানু

আপনার উত্তরটি খুব তথ্যমূলক এডওয়ার্ড। এটি দেখতে দেখতে সমান্তরালতা হ'ল আমাদের সমস্যার সমাধান যা আমরা ইতিমধ্যে এটিতে কাজ করছি, যদিও এটির জন্য আমাদের ডাটাবেস বিন্যাসে পরিবর্তন প্রয়োজন। রেমাসের মতো তবে আমি এখনও আগ্রহী যে কেন মেশিনটি সমস্ত (এক) সিপিইউ বা ডিস্ক সংস্থান ব্যবহার করে না বলে মনে হচ্ছে।
ডিজেফ

9

সাধারণত আপনি এ খুঁজছেন করে শুরু sys.dm_exec_requestsবিশেষভাবে, wait_time, wait_typeএবং wait_resourceআপনার ঢোকান অনুরোধ (গুলি) জন্য। এটি আপনার INSERT- কে কী আটকাচ্ছে তা একটি পরিষ্কার ইঙ্গিত দেবে। ফলাফলগুলি লক কনটেন্টেশন, ফাইল বৃদ্ধির ইভেন্টগুলি, লগ ফ্লাশ ওয়েটস, এলোকেশন কনটেন্ট (পিএফএস পৃষ্ঠা ল্যাচ কনটেন্ট হিসাবে উদ্ভাসিত হয় ইত্যাদি) ইত্যাদি নির্দেশ করবে will আপনি একবার পরিমাপ করলে, সেই অনুযায়ী আপনার প্রশ্নটি আপডেট করুন। আমি আপনাকে দৃ stop ়ভাবে অনুরোধ করছি এখনই থামুন এবং আপনি এগিয়ে যাওয়ার আগে অপেক্ষা এবং কুইজের সমস্যা সমাধানের পদ্ধতিটি পড়ুন।


3

আমি ওপিতে লিঙ্ক করা পৃষ্ঠায় পরীক্ষার স্ক্রিপ্টটি চালিয়েছি লুপটির চারপাশে শুরু হওয়া ট্রেন / কমিটের সাথে। আমার মেশিনে, প্রথমবারটি শেষ করতে 1:28 লেগেছিল।

তারপরে আমি লুপের বাইরে এই দুটি কমান্ড সরিয়ে নিয়েছি:

SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SET @InsertDate = DATEADD(dd, @Random, GETDATE())

এটি তার পরে 28 সেকেন্ডে শেষ হয়েছে completed

কী ঘটছে তা আমি নিশ্চিতভাবে জানি না, তবে আমি অনুমান করছি যে কোডটিতে কোনও ধরণের ঘুম হতে পারে RAND(), সম্ভবত অ্যালগরিদমের অংশ হিসাবে তারা এনট্রপি তৈরি করতে ব্যবহার করছে (আরও ভাল র্যান্ডম সংখ্যা)।

এফডাব্লুআইডাব্লু, এসএসডি সবসময় রাইটিং-ভারী অ্যাপ্লিকেশনগুলির জন্য সেরা প্রযুক্তি নয়। সর্বোত্তম পারফরম্যান্সের জন্য, আপনার ডিবি লগটি ডিবি ডেটা থেকে আলাদা ড্রাইভ চিঠিতে রয়েছে তা নিশ্চিত করুন, লগ ফাইলটি তার সর্বোচ্চ আকারে প্রাক-উত্থিত এবং লগটি কখনই কেটে ফেলবে না।


আপনার ইনপুট রিকএনজেডের জন্য ধন্যবাদ। কোডটি লুপের বাইরে নিয়ে গিয়ে আমি দ্রুত ফলাফল পেলাম না। অপেক্ষা করুন আমি পর্যবেক্ষণ করলাম হ'ল আপনি যদি এটি একাধিকবার চালান তবে তা দ্রুত হয়, এটিই আপনি অভিজ্ঞ হয়ে উঠতে পারেন। আমি জানি এসএসডিগুলি রূপালী বুলেট নয়, তবে আমার এখনও মনে হচ্ছে পারফরম্যান্সটি এটি হতে পারে না।
ডিজেফ

1

আমি আর আস্তে আস্তে চিহ্নিত করার জন্য যে ডিএমভি ব্যবহার করি তা হ'ল sys.dm_os_waiting_tasks । যদি আপনার ক্যোয়ারী সিপিইউ নিবিড় না হয় তবে আপনি এই ডিএমভি থেকে অপেক্ষাগুলি সম্পর্কে আরও তথ্য পেতে পারেন।


0

আমি বর্গ ২০০৮-এর জন্য অপেক্ষা অনুষ্ঠানের তালিকাটি পরীক্ষা করছি এবং আমি নেটওয়র্ক_আইও তালিকাভুক্ত দেখতে পাচ্ছি না: http://technet.microsoft.com/en-us/library/ms179984(vssl.100).aspx

আমি ভেবেছিলাম NETWORK_IO এখন কেবল ASYNC_NETWORK_IO হিসাবে তালিকাভুক্ত হয়েছে, তাই আমি জিজ্ঞাসা করতে চেয়েছিলাম যে আপনি আবার আপনার এসকিউএল সংস্করণটি পরীক্ষা করতে পারেন কিনা, কেননা আমি কেন জানি কেন / কেন সেই সংস্করণের জন্য অপেক্ষার ইভেন্টটি প্রদর্শিত হচ্ছে to

নেটওয়ার্কের অপেক্ষাটি একেবারে উপস্থিত হওয়ার জন্য, হ্যাঁ আপনি যদি স্বতন্ত্র সার্ভারে কাজ করে থাকেন তবে তা ঘটতে পারে। আপনি কি আপনার নেটওয়ার্ক কার্ডের জন্য সেটিংস পরীক্ষা করেছেন? আমি ভাবছি তারা কোনও সমস্যা কিনা।

দিনের শেষে কেবল কয়েকটি সংস্থানীয় সম্ভাবনা রয়েছে: মেমরি, সিপিইউ, ডিস্ক আই / ও, নেটওয়ার্ক এবং লকিং। আপনি সিপিইউ এবং আই / ও-ই সমস্যা নয় বলে ইঙ্গিত করেছেন এবং নেটওয়র্ক_আইও-র একটি অপেক্ষার ইভেন্ট রয়েছে, তাই আমি আপনাকে সেই এনআইসি কার্ডগুলি প্রথমে দেখার পরামর্শ দিই।


1
NETWORK_IOকারণ ওপি বর্ধিত ঘটনা ব্যবহার করছে দেখানো হয়। এটি কখনই আপডেট হয় নিsys.dm_xe_map_values
মার্টিন স্মিথ

আমি একই এসকিউএলআরকস্টারটি ভাবছি, ঠিক কী চলছে। আমি পুরোপুরি নেটওয়ার্ক কার্ডগুলি অক্ষম করার চেষ্টা করেছি। মার্টিন ইঙ্গিত করলেন যে কিছু পুরানো ফাইলগুলি এখনও রয়ে গেছে আমি ফলাফলগুলি টমোরোতে আপডেট করব যা কিছু পরিবর্তন করে কিনা তা দেখার জন্য।
ডিজেফ

এছাড়াও, যদি আমরা বিবৃতিগুলির জন্য কার্যকর করার পরিকল্পনা দেখতে পেতাম তবে এটি সহায়তা করতে পারে।
এসকিউএলরকস্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.