এটি ঘটতে পারে যে এসকিউএল সার্ভারে অল্প পরিমাণে ডেটা একটি অন্য নির্দিষ্ট পরিকল্পনা বা এর মতো কিছুতে বাধ্য করার জন্য একটি নির্দিষ্ট সীমাতে পৌঁছে। এটি অসম্ভব নয়। তবে আপনার ডিস্কটি ভারী দায়িত্বে থাকা বলে মনে হচ্ছে তা আমাকে অন্য সিদ্ধান্তে নিয়ে গেছে।
আপনার ধীর গতির জন্য সম্ভাব্য দুটি বেস কারণ রয়েছে।
- আপনি আপনার সিস্টেম আপগ্রেড করেছেন এবং এটি পুনরায় বুট করেছেন
- আপনি এতে একটি গুচ্ছ ডেটা লোড করুন
আসুন এক নং অংশটি একবার দেখুন
আপনার এসকিউএল সার্ভারের কনফিগারেশনটি ভেঙে যেতে পারে। এটি আপনার সার্ভারের গতি এবং ডিস্ক ব্যবহার সম্পর্কিত গুরুতর সমস্যা সৃষ্টি করতে পারে।
আপনার প্রথম সার্ভার সেটিংস প্রথম পরীক্ষা করুন। সেই মৌলিক সেটিংস max server memory, affinity I/O mask, affinity maskএবং max degree of parallelism। আপনার ব্যবহার করে উন্নত বিকল্পগুলি সক্ষম করতে হবে show advanced options।
এখানে একটি সম্পূর্ণ স্ক্রিপ্ট:
-- enable advanced options
EXEC sp_configure 'show advanced options',1
-- apply configuration
RECONFIGURE
-- how much memory can the sql server allocate?
EXEC sp_configure 'max server memory'
-- which cpu is used to run I/O operations
EXEC sp_configure 'affinity I/O mask'
-- which cpus can run processes?
EXEC sp_configure 'affinity mask'
-- how many threads can work on one query part?
EXEC sp_configure 'max degree of parallelism'
ফলাফলটি আপনার ইনস্টলেশন পদক্ষেপে আপনার নথিভুক্ত মানগুলির সাথে তুলনা করুন। তারা এখনও কি একই?
আপনার সার্ভারটি এত অদ্ভুত আচরণ করার অনেক কারণ থাকতে পারে। আমি সাধারণত বাজি দেব, যে আপনার max server memoryঠিক ভুল। এটি আপনার এসকিউএল সার্ভারের স্থায়ীভাবে ডেটা পৃষ্ঠাগুলি অদলবদল করবে। সে তার স্মৃতিতে সব ধরে রাখতে পারে না। এর অর্থ হল তাকে ডিস্ক থেকে পৃষ্ঠাগুলি পড়তে হবে, আপডেট করতে হবে, তাত্ক্ষণিকভাবে ফিরে লিখতে হবে। যদি অন্য কোনও আপডেট আসে এবং আপডেটের জন্য একই পৃষ্ঠা ব্যবহার করে, এটি মেমরি থেকে পড়া যায় না। পরিবর্তে সার্ভারটি আবার এটি ডিস্ক থেকে পড়তে হবে। শুধু অদলবদল হচ্ছে ...
আরেকটি সমস্যা হ'ল ডিস্ক বা প্রক্রিয়াগুলিতে উচ্চ সখ্যতা হতে পারে। যদি আপনি এসকিউএল সার্ভারের জন্য ডেডিকেটেড ডিস্কের সাথে একটি শেয়ার্ড সার্ভার (এসকিউএল সার্ভার + অন্যান্য পরিষেবাদি) ব্যবহার করেন (যা বিরল ক্ষেত্রে হতে পারে তবে এটি হতে পারে), এটি আপনার সমস্যা হতে পারে। আপনার সার্ভারে সাধারণত প্রক্রিয়াগুলির জন্য 3 সিপাস এবং I / O এর জন্য একটি ব্যবহৃত হত। অন্যান্য 12 সিপিএস অন্যান্য পরিষেবার জন্য ব্যবহৃত হয়। এই ক্ষেত্রে আপনার অ্যাফিনিটি মাস্কটি ভুল এবং উদাহরণস্বরূপ একটি স্বয়ংক্রিয় কনফিগারেশন ব্যবহার করে। এর অর্থ আপনার সার্ভার প্রসেসের জন্য সমস্ত 16 টি কর এবং I / O গতিশীলভাবে ব্যবহার করে। যদি আপনার বিশাল প্রক্রিয়াগুলি চলমান থাকে তবে তারা ডিস্কে একটি বিশাল বোঝা চাপাতে পারে যা এটি পরিচালনা করতে পারে না। তবে বাস্তবে, আমি বিশ্বাস করি না যে এটি আপনার ক্ষেত্রে। এটি প্রয়োগ করা হলে এটি দ্রুত হবে (এমনকি কিছুটা হলেও) তবে আপনার কেসটি ধীর গতির হয়।
আর একটি সমস্যা খুব বেশি মাত্রায় সমান্তরালতা হতে পারে। যার অর্থ আপনার একটি ক্যোয়ারির একটি আংশিক অংশে অনেকগুলি থ্রেড আইডল করছে। যদি সমান্তরালতা প্রত্যাশা অনুযায়ী কাজ না করে তবে এটি একটি বিশাল ধীরগতির কারণ হতে পারে। তবে এটি মোট আপনার উচ্চ I / O বর্ণনা করবে না।
এখন আসুন অংশ 2 নং দেখুন
আপনি আপনার সিস্টেমে একগুচ্ছ সারি লোড করেছেন। এমনকি এটি যদি নিয়মিত কাজ হয় তবে এটি এমন একটি সীমা বাড়িয়ে দিতে পারে যেখানে আপনার ক্যোয়ারী বাড়ানোর পরিকল্পনা করে। এমন কি এমনকি এটি হতে পারে যে এসকিউএল সার্ভারের সাথে আপনার সন্নিবেশটি এই আচরণটি তৈরি করে।
আপনি উল্লেখ করেছেন যে আপনি ইতিমধ্যে আপনার সূচকগুলি অন্য ডিস্কে স্থানান্তরিত করার চেষ্টা করেছেন যা মনে হয় এটি সাহায্য করবে। আপনি দুটি ভিন্ন ডিস্কে বোঝা ভাগ করে নেওয়ার বিষয়টি ঘটতে পারে।
এটি হতে পারে যে আপনার সূচকগুলি ভঙ্গুর হয়ে গেছে, আপনার পরিকল্পনাগুলি ভঙ্গুর হয়ে গেছে বা আপনার পরিসংখ্যান সবেমাত্র পুরানো।
1. পরিসংখ্যানের শেষ আপডেটটি চেক করতে দেয়
আপনি প্রতিটি একক পরিসংখ্যান উপাদানগুলির জন্য ইন্টারফেসের মাধ্যমে ম্যানুয়ালি এটি করতে পারেন। যা একটি ব্যথা হবে। অথবা আপনি এই কোডটি ব্যবহার করে দেখতে পারেন:
SELECT name AS indexname,
STATS_DATE(OBJECT_ID, index_id) AS StatsUpdated
FROM sys.indexes
এটি আপনাকে প্রতিটি সূচক (এবং হিপ) এবং তাদের পিছনের পরিসংখ্যানের উপর একটি সম্পূর্ণ তথ্য দেবে। আপনি চালনা করলেও এর sp_updatestatsঅর্থ এই নয় যে পরিসংখ্যানগুলি আপডেট হয়েছিল। অংশটি যখন কোনও আপডেট বেশ জটিল, আপনি চালনা করেন sp_updatestatsএমনকি auto update statisticsসক্ষম থাকলেও , পরিসংখ্যান ঠিক সময়ে আপডেট করা হবে না। এখানে কয়েকটি প্রান্ত পয়েন্ট রয়েছে, যখন কোনও আপডেট প্রয়োজন / উত্পন্ন হয়:
- একটি খালি টেবিল এক বা একাধিক সারি পায়
- 500 টিরও বেশি সারি সহ একটি সারণী 20% + 500 অতিরিক্ত সারি আপডেট করে এবং পরে একটি সন্নিবেশ ঘটে
- যখন 500 টি সারি একটি সারণীতে পরিবর্তন করা হয়েছিল যা 500 টিরও কম সারি রাখে
এর অর্থ, আপনি আপডেট চালনা করলেও আপনার পরিসংখ্যানগুলি পুরানো হতে পারে।
আপনি উপরের ক্যোয়ারীটি একবার দেখে নিতে পারেন। আপনি যদি কিছু টেবিলে কিছু পুরানো পরিসংখ্যান খুঁজে পান, আপনি এই টেবিলের জন্য একটি ম্যানুয়াল পরিসংখ্যান আপডেট চালাতে চাইতে পারেন:
UPDATE STATISTICS dbo.YourBadTable WITH FULLSCAN
এর পরে, আপনি সমস্ত পুরানো পরিকল্পনা ফেলে দিতে আপনার সার্ভারটিকে পাছায় একটি লাথি দিতে চাইতে পারেন।
DBCC FREEPROCCACHE
আপনি যদি কেবল সমস্ত ক্যাশে পরিষ্কার করতে চান তবে আপনি এটি পরিবর্তে চালাতে চাইতে পারেন:
DBCC FREESYSTEMCACHE ('ALL')
এটি কেবল পরিকল্পনার ক্যাশে নয়, সমস্ত ক্যাশে পরিষ্কার করবে। আমি সাধারণত সতর্ক করে বলব, এটি উত্পাদন পর্যায়ে প্রোডাকশন সার্ভারে ব্যবহার করতে। তবে আপনার সার্ভারটি বর্তমানে কাজ না করায় আপনি তাদের খুব বেশি ক্ষতি করতে পারবেন না। এটা কিছু সেকেন্ডের জন্য হয়তো 1-2 মিনিট মন্দীভূত পারে সে সব ক্যাশে পুনর্নির্মাণের প্রয়োজন, কিন্তু যে পরে সঠিক পরিকল্পনার সাথে চালানো উচিত।
আর একটি কারণ সম্পূর্ণ খণ্ডিত সূচক হতে পারে। এই বিবৃতিটি ব্যবহার করে এটি পুরো সার্ভারে পরীক্ষা করা যেতে পারে:
SELECT *
FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, NULL)
যদি খণ্ডটি খুব বেশি হয় তবে আপনাকে পুনরায় সংগঠিত করার প্রয়োজন হতে পারে (ফ্র্যাগমেন্টেশন <20%) বা এটি সম্পূর্ণ পুনর্নির্মাণ করতে (> 20%)। এটি আপনার ডিস্কের উপর আরও চাপ নিতে পারে এবং সমস্যার কারণ হতে পারে। অন্যদিকে, সূচকগুলি যদি খুব খারাপ হয় তবে এটি ক্ষতিগ্রস্থ হওয়ার চেয়ে সম্ভবত শেষ পর্যন্ত সহায়তা করবে।
এই দুটি কারণে পাশাপাশি, তৃতীয় সমস্যা হতে পারে
এটি সম্ভবত আপনার সার্ভারটি কনফিগার করা আছে, আপনি এই মুহুর্তে কোনও কোড পরিবর্তন করেন নি, মাত্র কয়েকটি সারি যুক্ত করেছেন। সমস্ত পরিসংখ্যান আপডেট হয়েছে এবং সমস্ত ক্যাশে পুনর্নির্মাণ করা হয়েছে। আপনার সমস্ত সূচকগুলি আপনার প্রয়োজন মতো পুনর্গঠিত হয়েছে, তবে এখনও - কিছুই কার্যকর হয় না। এটি কেবল এমন হতে পারে যে আপনি আপনার প্রক্রিয়াগুলিতে উপলব্ধ মেমরির সীমাতে পৌঁছে গেছেন। আপনার আরও প্রয়োজন হতে পারে। আপনার চেয়ে আরও মেমরি পাওয়ার চেষ্টা করে এমন কোনও প্রক্রিয়া রয়েছে কিনা তা আপনি কেবল খতিয়ে দেখতে পারেন।
আপনি এই আদেশটি ব্যবহার করে এটি পরীক্ষা করতে পারেন:
SELECT * FROM sys.dm_exec_query_memory_grants
এটি আপনাকে সমস্ত সেশনের একটি তালিকা সরবরাহ করবে যা মেমরি গ্রহণ করে। কিছু ক্যোয়ারী থাকতে পারে যা এখনও স্মৃতি পেতে অপেক্ষা করছে। এই প্রশ্নগুলি সহজেই ফিল্টার করা যায়। সমস্ত সেশন যেখানে granted_memory_kb IS NULL। এগুলি সেশনগুলি যা মেমোরির অনুরোধ করে তবে তা পায় না। আরেকটি জিনিস একটি অনুমোদিত মেমরি যা কম হতে পারে be আপনি কলামগুলির requested_memory_kbসাথে তুলনা করতে পারেন granted_memory_kb। অনুরোধ করা হয় প্রক্রিয়াটি সক্রিয় করার জন্য মেমরিটি প্রদর্শন করার সময় কতটা মেমরি প্রক্রিয়াটি অপটিমাল চালানো দরকার তা দেখায়। যদি কোনও প্রক্রিয়া চালানোর জন্য 2 গিগাবাইটের প্রয়োজন হয় তবে কেবল 2 এমবি পায় ... আপনি নিজেরাই এটি পেতে পারেন। ;-)
আরেকটি উপায় হ'ল RESSOURCE_SEMAPHORE:
SELECT * FROM sys.dm_exec_query_resource_semaphore
আপনি waiter_countএবং এর উপর একবার দেখে নিতে পারেন grantee_count। ওয়েটার যদি 0 এর উপরে থাকে তবে আপনার স্মৃতিতে আপনার চাপ রয়েছে যার ফলে অদলবদল হতে পারে এবং পারফিউমে আপনার দ্বারা দেখা ডিস্ক চাপের কারণ হতে পারে।