এসকিউএল সার্ভারে সূচি পুনর্নির্মাণের গতি উন্নত করুন


9

আমি একটি খালি ডাটাবেসে প্রচুর পরিমাণে ডেটা আমদানি করছি এবং আমি শুরু করার আগে আমি আমদানির কার্যকারিতা উন্নত করতে পারি কিনা তা দেখার জন্য সমস্ত অ-অনন্য-ক্লাস্টারযুক্ত সূচি অক্ষম করে রেখেছি।

এখন আমি সূচিগুলি পুনরায় সক্ষম করতে চাই এবং আমি ভাবছি যে এটিকে অপ্টিমাইজ করার জন্য আমি কিছু করতে পারি কিনা।

আবার> 100 টি টেবিল এবং প্রায় 2,000 সূচি পুনর্নির্মাণ করতে হবে। ডাটাবেসটি 200 গিগাবাইট আকারের।

আমি যে স্ক্রিপ্টটি চালাচ্ছি তার মূল বিভাগটি হ'ল:

declare c_toggle_index cursor FORWARD_ONLY READ_ONLY for
    select  'alter index ' + QUOTENAME(i.name) + ' on ' + o.name + ' rebuild'
    from    sys.indexes as i
    Inner Join sys.objects o
    On o.object_id = i.object_id
    Where o.is_ms_shipped = 0
    And i.index_id >= 1
    and i.type > 1
    and i.is_disabled = 1

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

পুনর্নির্মাণ স্ক্রিপ্ট চলাকালীন আমি লক্ষ করেছি যে আমার কাছে প্রচুর CXPACKET অপেক্ষা করার প্রকার রয়েছে। আমি কেন বুঝতে পারছি না কেন তা হবে বা যদি এমন কোনও সমস্যা হয় যা আমি সমাধান করতে চাইছি।

একটি চূড়ান্ত পয়েন্ট যা প্রাসঙ্গিক হতে পারে: আমার পুরো সার্ভারটি বর্তমানে ডাটাবেসে ডেটা আমদানি করা ব্যতীত নিষ্ক্রিয়। চিন্তার বা চিন্তা করার মতো অন্য কোনও ব্যবহারকারীর ক্রিয়াকলাপ নেই; আমার একমাত্র উদ্বেগ হ'ল খুব কম সময়ে ডেটাবেজে ডেটা আমদানি করা।


3
যখন আপনি বলছেন যে আপনার একমাত্র উদ্বেগটি আমদানির সময়, তখন আপনি কি আমদানি শুরুর সময় থেকে সূচকগুলি পুনরায় সক্রিয়করণের শেষের সময় বলতে চান? যদি তা হয় তবে আপনার আমদানির সময় সক্রিয় সূচকগুলি ছেড়ে দেওয়া উচিত। 200 গিগাবাইট ডেটার জন্য 2,000 সূচকগুলি আমার কাছে প্রচুর সূচকের মতো মনে হয়। মুছে ফেলা যেতে পারে এমন কিছু আছে কিনা তা দেখার জন্য আপনার সূচক ব্যবহারের ডিএমভিগুলি লক্ষ্য করা উচিত।
ম্যাক্স ভার্নন

1
কেবল পরিষ্কার করার জন্য, আপনাকে একই 200 জিবি আমদানি বার বার করতে হবে, এবং একবারে নয়?
জন সেগেল

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

3
ঠিক আছে. আমাদের সম্পর্কে CXPACKETঅপেক্ষা করছে: সূচক নিজেদের স্ক্যান ইনডেক্স (এমনকি সূচক পুনঃনির্মাণ পুনর্নির্মিত হচ্ছে ), এবং যারা স্ক্যান উপমা ব্যবহার করতে পারেন। আপনার এই অপেক্ষাগুলির বিষয়ে উদ্বিগ্ন হওয়া উচিত নয় - সমান্তরালতা সম্ভবত সহায়তা করছে।
জন সেগেল

উত্তর:


10

এই দৃশ্যে সর্বোত্তম আমদানি সম্পাদনের জন্য তিনটি জিনিস প্রয়োজন:

  1. নূন্যতম লগ ইন বেস টেবিল সন্নিবেশ
  2. ন্যূনতম-লগ-করা অবিচ্ছিন্ন সূচক তৈরি করে
  3. শারীরিক পড়া এড়ানো

নূন্যতম লগিং

নন-ক্লাস্টারড ইনডেক্স ছাড়াই খালি ক্লাস্টারড টেবিলের মধ্যে ন্যূনতম-লগ- ইনড্রেসগুলি অর্জনের প্রয়োজন:

  1. হয় SIMPLEবা BULK_LOGGEDডাটাবেস পুনরুদ্ধার মডেল ব্যবহার করে
  2. একটি টেবিল লক এবং অর্ডার করা ইনপুট নির্দিষ্টকরণ (উদা TABLOCKএবং ORDERইঙ্গিতগুলি)

সাইড নোট:

একটি ক্লাস্টার টেবিলের ন্যূনতম-লগ ইনসেটগুলি অর্জন করা সম্ভব যে ট্রেস পতাকা 610 সক্ষম করা আছে এমন নন ক্ল্লাস্টারড ইনডেক্স রয়েছে। নন ক্ল্লাস্টারড ইনডেক্স অন্তর্ভুক্তগুলি ন্যূনতম-লগড রয়েছে বা না কোয়েরি অপ্টিমাইজার দ্বারা নির্বাচিত ক্যোয়ারী পরিকল্পনার উপর নির্ভর করে।

ক্যোয়ারী পরিকল্পনা nonclustered সূচক জন্য পৃথক পুনরুক্তিকারীর ব্যবহার করে, তাহলে পুনরুক্তিকারীর হয়েছে DMLRequestSortথেকে সম্পত্তি সেট true, nonclustered সূচক টিপে ন্যূনতমরূপে হতে হবে লগ প্রদত্ত অন্যান্য শর্ত পূর্বে পূরণ করা উল্লেখ করেছে।

আলাদাভাবে ননক্র্লাস্টারড ইনডেক্স তৈরি করা

এটি করার সুবিধাগুলি হ'ল:

  1. ক্লাস্টারড ইনডেক্স সন্নিবেশগুলি টিএফ 610 সক্ষম না করে ন্যূনতম-লগ ইন করা যেতে পারে
  2. CREATE INDEX পুনরুদ্ধার মডেলটি না হলে ন্যূনতমভাবে লগ হয় FULL

শারীরিক পড়া এড়ানো

আদর্শভাবে, আমদানি করা ডেটা আলাদা মেশিনে বা কমপক্ষে ডেটাবেস হোস্ট করার জন্য পৃথক শারীরিক স্টোরেজে সংরক্ষণ করা হবে।

ডাটাবেস সার্ভারে ক্যাশে বৃহত্তম বেস টেবিল ধারণ করার জন্য পর্যাপ্ত মেমরি থাকতে হবে, ননক্র্লাস্টারড ইনডেক্সগুলি তৈরি করার সময় প্রয়োজনীয় ক্রিয়াকলাপের জন্য যথেষ্ট পরিমাণ বাকি রয়েছে।

একটি ভাল প্যাটার্নটি হ'ল বেস টেবিলটি দ্রুত লোড করা (ন্যূনতম লগ করা ক্লাস্টারড ইনডেক্স লোড) এবং তারপরে তথ্যের পৃষ্ঠাগুলি ক্যাশে থাকা অবস্থায় সেই টেবিলের জন্য সমস্ত অবিচ্ছিন্ন সূচক তৈরি করা।

প্রশ্নটি এমন একটি প্রক্রিয়াটির রূপরেখা দেয় যেখানে প্রথমে বেস টেবিলগুলি লোড করা হয় এবং তারপরে অবিচ্ছিন্ন সূচকগুলি নির্মিত হয়। কার্সার সংজ্ঞা কমপক্ষে গ্রুপ ননক্র্লাস্টারড ইনডেক্স একই টেবিলে একসাথে তৈরি করার জন্য একটি ORDER BYধারা ব্যবহার করে না

সম্ভাব্য ফলাফলটি হ'ল বিভিন্ন টেবিলের জন্য ডেটা পৃষ্ঠাগুলি বারবার ক্যাশে পড়ে এবং নন-ক্লাস্টারড ইনডেক্সগুলি একটি অ-নিরস্তকরণ ক্রম হিসাবে নির্মিত বলে বাতিল করা হয়।

পুনরাবৃত্তি শারীরিক পাঠ্যের ব্যয় সম্পূর্ণরূপে নন-ক্ল্লাস্টার্ড সূচকগুলি পৃথকভাবে তৈরি করে ন্যূনতম লগিংয়ের সুবিধার উপর পুরোপুরি প্রভাব ফেলে। এটি ব্যাখ্যা করে যে আপনি কেন খুঁজে পেয়েছেন যে বিদ্যমান সূচীগুলি সহ লোডিং টেবিলগুলি দ্রুত হয় (কারণ প্রদত্ত টেবিলের জন্য সমস্ত অবিবাহিত সূচী পরবর্তী টেবিলে যাওয়ার আগে বজায় রাখা হয়)।

সারসংক্ষেপ

আমদানি প্রক্রিয়াটি একবারে বাল্ক-লোডের একটি টেবিলে পুনরায় কাজ করা উচিত। এর অর্থ টেবিলটি লোড করা এবং পরের দিকে যাওয়ার আগে সমস্ত অবিবাহিত সূচক তৈরি করা। SQL সার্ভার উদাহরণস্বরূপ বৃহত্তম টেবিল রাখা পর্যাপ্ত মেমরি উপলব্ধ থাকা উচিত এবং একই সময়ে বৃহত্তম nonclustered সূচক সাজানোর সঞ্চালন।

আপনি ইতিমধ্যে স্থানে থাকা নন-ক্লাস্টারড ইনডেক্স সহ টেবিলগুলিতে ডেটা লোড করার আগে টিএফ 610 সক্ষম করার চেষ্টা করতে পারেন। এটি সাধারণত আগের পদ্ধতির মতো দ্রুত হয় না তবে এটি যথেষ্ট দ্রুত হতে পারে।

আরও তথ্যের জন্য নিম্নলিখিত দেখুন:

ডেটা লোডিং পারফরম্যান্স গাইড

অপারেশনগুলি যা সর্বনিম্ন লগড করা যায়

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