নির্বাচনী বিবৃতিতে সূচকটি কীভাবে ব্যবহার করবেন?


99

কর্মচারী টেবিলে বলি, আমি সারণির emp_nameকলামে একটি সূচক (আইডিএক্স_নাম) তৈরি করেছি ।

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

যদি এটি নির্বাচিত ধারাটিতে নির্দিষ্ট করা প্রয়োজন হয়, তবে নির্বাচিত প্রশ্নের সাথে সূচীটি ব্যবহার করার জন্য সিনট্যাক্সটি কী?

উত্তর:


92

আপনি যদি সূচকটি পরীক্ষা করে দেখতে চান এটি কাজ করে কিনা, এখানে বাক্য গঠনটি এখানে:

SELECT *
FROM Table WITH(INDEX(Index_Name))

WITH বিবৃতি সূচকটি ব্যবহার করতে বাধ্য করবে।


83
এই পোস্টে প্রশ্নের উত্তর দেয় না। উত্তরটি সংক্ষেপে: আপনাকে কোয়েরিতে সূচি নির্দিষ্ট করতে হবে না। এটি স্বয়ংক্রিয়ভাবে ব্যবহৃত হয় (বা না)। আপনি এটি জোর করতে পারেন, তবে। নীচের অন্যান্য পোস্টগুলিতে আরও বিশদ (কখন এবং কেন এটি করা হয়)।
Rast

34

ভাল প্রশ্ন,

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

আপনার নির্দিষ্ট প্রশ্নের উত্তর দিতে সক্ষম হবার জন্য আপনাকে যে ডিবি ব্যবহার করছেন তা নির্দিষ্ট করতে হবে।

মাইএসকিউএল-এর জন্য আপনি কীভাবে এটি করতে চান তা সূচীকরণ সিনট্যাক্স ডকুমেন্টেশন পড়তে চান


30

নির্বাচনী বিবৃতিতে সূচকটি কীভাবে ব্যবহার করবেন?
এই পথে:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

এবং অনেক আরো উপায় পরীক্ষা এই

আমার কি স্পষ্ট করে উল্লেখ করার দরকার আছে?

  • না, স্পষ্টভাবে নির্দিষ্ট করার দরকার নেই।
  • ডিবি ইঞ্জিনটি @ টিউডার কনস্ট্যান্টিন উত্তর থেকে নির্মিত ক্যোয়ারী এক্সিকিউশন পরিকল্পনার ভিত্তিতে স্বয়ংক্রিয়ভাবে সূচকটি নির্বাচন করতে হবে।
  • আপনার সূচকের ব্যবহারটি আপনার ক্যোয়ারীটি দ্রুত চালাবে এবং যদি তা হয় তবে এটি সূচকটি ব্যবহার করবে কিনা আশাবাদী বিচার করবেন। @niktrl উত্তর থেকে

13

ইন জেনারেল , যদি সূচক ব্যবহার করে, এবং তারপর সম্ভবত আরও বুকমার্ক লুক-সম্পাদনের জন্য থাকার অধিকৃত খরচ মাত্র সমগ্র টেবিল স্ক্যান খরচ কম সূচক ব্যবহার করা হবে।

যদি আপনার জিজ্ঞাসা ফর্ম হয়:

SELECT Name from Table where Name = 'Boris'

এবং 1000 এর মধ্যে 1 সারির বোরিস নাম রয়েছে, এটি প্রায় অবশ্যই ব্যবহৃত হবে। যদি সবার নাম বোরিস হয় তবে এটি সম্ভবত কোনও টেবিল স্ক্যানের অবলম্বন করবে, যেহেতু সূচকটি ডেটা অ্যাক্সেসের জন্য আরও কার্যকর কৌশল হিসাবে হওয়ার সম্ভাবনা কম।

যদি এটি একটি প্রশস্ত টেবিল হয় (কলামগুলির অনেকগুলি) এবং আপনি তা করেন:

SELECT * from Table where Name = 'Boris'

তবে এটি এখনও টেবিল স্ক্যানটি সম্পাদন করতে পছন্দ করতে পারে, যদি এটি যুক্তিযুক্ত ধারণা হয় যে এটি কেবল নামটি সন্ধান করার চেয়ে টেবিল থেকে অন্যান্য কলামগুলি পুনরুদ্ধার করতে আরও সময় নিতে চলেছে বা আবার যদি এটি সম্ভবত পুনরুদ্ধার করার সম্ভাবনা থাকে তবে যাইহোক সারি অনেক।


9

আপনার সূচকের ব্যবহারটি আপনার ক্যোয়ারীটি দ্রুত চালাবে এবং যদি তা হয় তবে এটি সূচকটি ব্যবহার করবে কিনা আশাবাদী বিচার করবেন।

আপনার আরডিবিএমএসের উপর নির্ভর করে আপনি একটি সূচক ব্যবহারের জন্য জোর করতে পারেন, যদিও আপনি কী করছেন তা যদি না জানেন তবে এটি প্রস্তাবিত নয়।

সাধারণভাবে আপনি যে কলামগুলিকে টেবিলের যোগদানের এবং কোথায় বিবৃতিতে ব্যবহার করতে চান সেগুলি সূচী করা উচিত


5

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

SELECT * FROM TABLE WHERE attribute = 'value'

উপযুক্ত সূচক ব্যবহার করবে।


5

সাধারণত, আপনি যখন কোনও টেবিলে একটি সূচক তৈরি করেন, সেই টেবিলের ডেটা অনুসন্ধান করার সময় ডাটাবেস স্বয়ংক্রিয়ভাবে সেই সূচকটি ব্যবহার করে। এ সম্পর্কে আপনার কিছু করার দরকার নেই।

যাইহোক, এমএসএসকিউএলে, আপনি একটি নির্দিষ্ট করতে পারেন index hintযা নির্দিষ্ট করে দিতে পারে যে এই কোয়েরিটি সম্পাদন করতে একটি নির্দিষ্ট সূচক ব্যবহার করা উচিত। এই সম্পর্কে আরও তথ্য এখানে পাওয়া যাবে

Index hintএটি মাইএসকিউএল-এর জন্য উপলব্ধ বলে মনে হচ্ছে । টিউডর কনস্ট্যান্টাইনকে ধন্যবাদ।


1

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

তবে আপনি এই জাতীয় কিছু ব্যবহার করে অপটিমাইজারকে স্ক্যান করতে বাধ্য করতে পারেন

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

অথবা এর মতো কিছু ব্যবহার করে একটি নির্দিষ্ট সূচী অনুসন্ধান করা

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

সিদ্ধান্ত আপনার. আপনি কোন সূচকটি ব্যবহার করতে চান তার ধারণা পেতে অবজেক্ট প্যানেলে সারণির সূচী বৈশিষ্ট্যগুলি দেখুন। এটি আপনার ফিল্টার (গুলি) এর সাথে মেলে ought

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

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