এসকিউএল সার্ভারের কার্যকারিতা হঠাৎ অবক্ষয়


13

আমার একটি এসকিউএল সার্ভার আছে ২০০৫ যা দেরিতেই অনির্দেশ্য হয়ে উঠেছে এবং আমি কেন আমার মাথাটি স্ক্র্যাচ করছি। সেকেন্ডে কার্যকর হওয়া প্রশ্নগুলি পরিকল্পনা পরিবর্তন করে কয়েক মিনিট সময় নেয় (পুরো টেবিল স্ক্যান বা সূচি স্পুলে সময় নিচ্ছে)। এখন প্রথম এবং সর্বাপেক্ষা সুস্পষ্ট বিষয় হ'ল পরিসংখ্যানগুলি অপ্রচলিত হয়ে অপ্টিমাইজারকে বিভ্রান্ত করার কারণ তবে আমি নিশ্চিত যে এটি ঘটেনি - প্রথমত কারণ অন্তর্নিহিত ডেটা উল্লেখযোগ্যভাবে পরিবর্তন হচ্ছে না (যেমন, এক বছরের ডেটার উপরে এক দিনের ডেটা যুক্ত করা) ইতিমধ্যে একটি টেবিলের মধ্যে রয়েছে) এবং দ্বিতীয়ত কারণ অটো তৈরির পরিসংখ্যান এবং অটো আপডেটের পরিসংখ্যান উভয়ই সত্য। তবে অপটিমাইজার হয় বিভ্রান্ত হচ্ছে; টিউনিং উপদেষ্টায় এসকিউএল চালানো আমাকে প্রচুর মাল্টি-কলাম CREATE STATISTICSস্টেটমেন্ট দেয় যা এটি ঠিক করে দেবে বলে মনে হয় (এসকিউএল পরবর্তী বিট অবধি অবধি)।

আমি কৌশলটির কোনও ধারণাগুলি এটিকে মূল কারণ হিসাবে পৌঁছাতে ব্যবহার করতে পারি? "স্বাভাবিক" পরিসংখ্যান কেন পর্যাপ্ত নয়?

উত্তর:


8

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

আপনার প্রশ্নগুলি কীভাবে জারি করা হচ্ছে? এটি কি গতিশীল এসকিউএল? আপনি কি সঞ্চিত পদ্ধতি ব্যবহার করছেন? আপনি কি sp_executesql ব্যবহার করছেন? আপনার কাছে কী পরামিতি স্নিফিংয়ের ঘটনা ঘটতে পারে? আপনার ডিবি ডিজাইন দেখতে কেমন? পিকে এবং এফকে সম্পর্ক কী?

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

ভাল পরিকল্পনা খারাপ হয়ে যাওয়ার উদাহরণ আপনি দিতে পারেন?

শেষ অবধি, অ্যাডাম মাচানিক থেকে sp_WhooIsActive ( http://whoisactive.com/ ) এর অনুলিপিটি নিয়ে যান এবং চলমান অনুসন্ধানগুলি সম্পর্কে আরও নির্ধারণ করতে এটি ব্যবহার করুন। এবং আপনি যদি sp_WoIsActive থেকে আউটপুট ক্যাপচার করতে সক্ষম হতে চান তবে এখানে যান http://www.littlekendra.com/2011/02/01/Woisactive/


এটি একটি তৃতীয় পক্ষের অ্যাপ্লিকেশন, এর স্কিমা বা এসকিউএল-এর উপরে আমার কোনও নিয়ন্ত্রণ নেই, যা বেশ ভয়ঙ্কর, প্রচুর প্যারামিটারাইজড কোয়েরি (যেমন where col=(cast @var...)) এবং @varহতে পারে '%'। আমি মাত্র এক বা দুই সপ্তাহ আগে এটি উত্তরাধিকার সূত্রে পেয়েছি এবং এটিকে প্রতিস্থাপন না করা পর্যন্ত এটি মূলত কাজ করা দরকার। লিঙ্কটির জন্য ধন্যবাদ, আমি এটিকে ঘূর্ণি দেব।
গাইউস

পরবর্তী সবচেয়ে বড় অপেক্ষার পর SOS_SCHEDULER_YIELDছিল CXPACKETএবং sp_configure "max degree of parallelism", 1আছে বলে মনে হচ্ছে - এখন জন্য - মাথার উপর উভয় সমস্যার কুপোকাত। ধন্যবাদ!
গাইস

Sp_WoIsAtive- এর লিঙ্কের জন্য +1
জেফ

8

এমএসডিএন থেকে :

" কী কলামগুলিকে আরোহণ বা উতরাইয়ের উপরে সংঘটিত অপারেশনগুলি সংঘটিত হয় বা মূল কলামগুলির উত্থানের উপরে পরিসংখ্যান যেমন আইডেন্টিটি বা রিয়েল-টাইম টাইমস্ট্যাম্প কলামগুলির জন্য ক্যোয়ারী অপটিমাইজার পারফরম্যান্সের তুলনায় আরও ঘন ঘন পরিসংখ্যান আপডেটের প্রয়োজন হতে পারে sert পরিসংখ্যান আপডেটের সূত্রপাতের জন্য যুক্ত হওয়া সারিগুলির সংখ্যা খুব কম হতে পারে statistics ভুল কার্ডিনালিটির অনুমান এবং ধীরে ক্যোরিয় পারফরম্যান্সের ফলাফল।

উদাহরণস্বরূপ, সর্বাধিক সাম্প্রতিক বিক্রয় আদেশের তারিখগুলি থেকে নির্বাচন করা একটি ক্যোয়ারিতে সঠিকতম মূল্যমানের অনুমান থাকবে যদি সর্বাধিক সাম্প্রতিক বিক্রয় আদেশের তারিখের জন্য কার্ডিনালটির অনুমান অন্তর্ভুক্ত করার জন্য পরিসংখ্যানগুলি আপডেট না করা হয়।

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

আপনি আপনার সিস্টেমে সময়ে সময়ে "এক্সইসি স্প_আপডেস্টেটস" ব্যবহার করতে পারেন (কিছু সময় নির্ধারিত) বা সমস্ত বস্তুর উপর STATS_DATE ফাংশনটি ব্যবহার করতে পারেন এবং দেখবেন যে তাদের পরিসংখ্যান আসলে শেষবারে কখন আপডেট হয়েছিল এবং তারপরে যদি খুব বেশি সময় থাকে তবে আপডেজ ব্যবহার করুন নির্দিষ্ট বিষয়টির জন্য পরিসংখ্যান। আমার অভিজ্ঞতায় এমনকি স্বয়ংক্রিয় পরিসংখ্যান সক্ষম করার পরেও আমরা এখনও সময়ে সময়ে পরিসংখ্যান আপডেট করতে বাধ্য হয়েছি, sertোকানো অপারেশনের কারণে যা স্বয়ংক্রিয় আপডেট ট্রিগার করে না।

আমার ব্যক্তিগত কোড যুক্ত করতে (একটি সাপ্তাহিক চাকরিতে ব্যবহৃত যা স্ট্যাটাস আপডেটের জন্য গতিশীল বিবৃতি তৈরি করে):

select distinct
        'update statistics [' + stats.SchemaName + '].[' + stats.TableName + ']'
            + case when stats.RowCnt > 50000 then ' with sample 30 percent;'
            else 
                ';' end
        as UpdateStatement
    from (
        select
            ss.name SchemaName,
            so.name TableName,
            so.id ObjectId,
            st.name AS StatsName, 
            STATS_DATE(st.object_id, st.stats_id) AS LastStatisticsUpdateDate
            , si.RowModCtr
            , (select case si2.RowCnt when 0 then 1 else si2.RowCnt end from sysindexes si2 where si2.id = si.id and si2.indid in (0,1)) RowCnt
        from sys.stats st
            join sysindexes si on st.object_id = si.id and st.stats_id = si.indid
            join sysobjects so on so.id = si.id and so.xtype = 'U' --user table
            join sys.schemas ss on ss.schema_id = so.uid
    ) stats
    where cast(stats.RowModCtr as float)/cast(stats.RowCnt as FLOAT)*100 >= 10 --more than 10% of the rows have changed
    or ( --update statistics that were not updated for more than 3 months (and rows no > 0)
        datediff(month, stats.LastStatisticsUpdateDate, getdate()) >= 3
        and stats.RowCnt > 0
    )

এখানে আমি এমন সমস্ত বস্তু পেয়েছি যেখানে 3 মাসের বেশি স্ট্যাটাস আপডেট করা হয়নি বা শেষ পরিসংখ্যান আপডেট হওয়ার পরে এটির 10% এরও বেশি সারি পরিবর্তিত হয়েছে।


হুম, আমার শীর্ষ অপেক্ষার ইভেন্টটি SOS_SCHEDULER_YIELDতবে এটি খারাপ পরিকল্পনার কারণে বা আমি এখনই বলতে পারি না বা এটি (-বছর বয়সী, ২-প্রসেসর, 4 জি র‌্যাম) বাক্সটি এখনই খুব বেশি লোড হয়েছে এবং আমি কিছু টিপিং পয়েন্ট উপর গিয়েছিলাম।
গাইউস

কেবলমাত্র আপডেটটি বিবৃতি দেওয়ার জন্য সেই ক্যোয়ারী চালানো এবং সেগুলি ম্যানুয়ালি চালানোর পরিবর্তে, আপনি সেই সিলেক্ট স্টেটমেন্টের ভিত্তিতে একটি কার্সার ব্যবহার করতে পারেন ফলাফলগুলি স্পষ্ট করে ল্যাপ করার জন্য sp_executesql- এ কল ব্যবহার করে চালিয়ে যেতে পারেন - এইভাবে আপনি এটি স্বয়ংক্রিয়ভাবে চালাতে পারবেন (উদাহরণস্বরূপ অংশ হিসাবে একটি রাতারাতি (বা অন্যান্য শান্ত সময়) রক্ষণাবেক্ষণ পরিকল্পনা)।
ডেভিড স্পিললেট

@ ডেভিড: আমি সাপ্তাহিক চাকরিতে যা করছি :)। আমি যে আউটপুটটি ব্যবহার করছি তা দেখতে আমি গাইসকে আলাদাভাবে ফর্ম্যাট করেছি। প্রাথমিক লিপিটি বেশ কুৎসিত এবং দীর্ঘ ছিল। বিন্যাসে সহায়তার জন্য ধন্যবাদ! আপনি কি আমাকে কোনও ফর্ম্যাটিং টিউটোরিয়ালে পাঠাতে পারেন..কারণ আমি কোডটি এখানে সুন্দর দেখতে কীভাবে করব তা সত্যই আমি জানি না। ধন্যবাদ!
মারিয়ান

"সম্পাদনা উত্তর" স্ক্রিনে একটি "ফর্ম্যাটিং সহায়তা" লিঙ্ক রয়েছে এবং মূল প্রশ্ন পৃষ্ঠায় প্রাথমিক উত্তর বাক্সের ঠিক উপরে আইকন হিসাবে, যা এই সাইটগুলি দ্বারা সমর্থিত মার্কডাউন সিনট্যাক্সের তালিকা করে।
ডেভিড স্পিলিট

3
অটো আপডেটের পরিসংখ্যানগুলি আসলে 10% নয়, 20% + 500 সারিতে ট্রিগার করে।
mrdenny

3

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

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

1) রেড-গেটে হোলার শেমলিংয়ের "এসকিউএল সার্ভার স্ট্যাটিস্টিফিক্স" সহ ডাউনলোডের জন্য প্রচুর বিনামূল্যে ইবুক উপলব্ধ রয়েছে যেখানে আপনি নিম্নলিখিত উদ্ধৃতিটি পাবেন:

http://www.red-gate.com/our-company/about/book-store/

"কোনও লিঙ্কের পরিসংখ্যানকে অবৈধ করার জন্য একটি কলামের ডেটাতে কমপক্ষে 20% এর বেশি সারিযুক্ত সারণীগুলি পরিবর্তন করতে হয়েছিল"

2) এসকিউএল সেন্ট্রি একটি নিখরচায় প্ল্যান এক্সপ্লোরার সরঞ্জাম রয়েছে যা একটি এসকিউএল পরিকল্পনার মধ্যে সমস্যাগুলি নিখুঁত করতে সহায়তা করে যেমন কোয়েরিতে প্রদত্ত টেবিলের জন্য সারিগুলির প্রকৃত সংখ্যার সাথে তুলনা করে অনেকগুলি বা খুব কম সারিগুলির অনুমান হিসাবে। এসএসএমএস থেকে প্রকৃত বাস্তবায়ন পরিকল্পনাটি কেবল সংরক্ষণ করুন এবং তারপরে প্ল্যান এক্সপ্লোরার ব্যবহার করে পরিকল্পনার বিভিন্ন অংশের মধ্য দিয়ে চলুন। এটি গ্রাফিক এক্সিকিউশন প্ল্যান ব্যবহার করে এসএসএমএসে তথ্য উপলভ্য নয় এমন নয়, তবে এসকিউএল সেন্ট্রি থেকে প্রাপ্ত সরঞ্জামটি এটি দেখতে আরও সহজ করে তোলে।

http://www.sqlsentry.com/plan-explorer/sql-server-query-view.asp

3) আপনি STATS_DATE () ব্যবহারে সবচেয়ে বেশি আগ্রহী এমন প্রশ্নের মধ্যে থাকা টেবিলগুলির জন্য পরিসংখ্যান আপডেটের তারিখটি নিজেই পরীক্ষা করে দেখুন, নিম্নলিখিত আলোচনায় পাওয়া একটি ক্যোয়ারী ব্যবহার করে আপনি প্রাচীনতম পরিসংখ্যান পেতে একটি দ্রুত জিজ্ঞাসা খুঁজে পেতে পারেন।

http://blog.sqlauthority.com/2010/01/25/sql-server-find-statistics-update-date-update-statistics/

আশা করি এটা কাজে লাগবে!

আমি মনে করি আপনি রেড-গেট থেকে বিশেষত বইটি উপভোগ করবেন!

-Jeff


ধন্যবাদ, আমি তাদের মাধ্যমে আমার পথে কাজ করব। আমি মূলত একজন ওরাকল ডিবিএ, যিনি এই সিস্টেমটি উত্তরাধিকার সূত্রে পেয়েছেন (আমি এসকিউএল সার্ভারের বিরুদ্ধে মোটেও কুসংস্কারযুক্ত নই, ২০০৫ সাল থেকে আমি যা দেখি এটি একটি অত্যন্ত সক্ষম প্ল্যাটফর্ম, আমি কেবল এটি জানি না পাশাপাশি আমি ওরাকলকেও জানি) ।
গাইউস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.