আপনি কেন একটি পাঠ্য কলামে পাঠ্য_পট্টর_পোষ সূচি করবেন?


18

আজ সাত সপ্তাহে সাতটি ডাটাবেস আমাকে প্রতি অপারেটর সূচকের সাথে পরিচয় করিয়ে দিয়েছে।

text_pattern_opsঅপারেটর শ্রেণি সূচক তৈরি করে পূর্বের ক্যোয়ারির সাথে মেলে প্যাটার্নের জন্য আপনি স্ট্রিংগুলি সূচক করতে পারেন , যতক্ষণ না নিম্নতর ক্ষেত্রে মানগুলি সূচিযুক্ত হয়।

CREATE INDEX moves_title_pattern ON movies (
    (lower(title) text_pattern_ops);

আমরা ব্যবহার করেছি text_pattern_opsকারণ শিরোনামটি পাঠ্য টাইপ করে। যদি আপনি প্রয়োজন সূচক, varchars অক্ষর, বা নামের, সম্পর্কিত অপস ব্যবহার করুন: varchar_pattern_ops, bpchar_pattern_ops, এবং name_pattern_ops

আমি উদাহরণটি সত্যিই বিভ্রান্তিকর খুঁজে পাই। কেন এটি দরকারী?

কলামটি যদি পাঠ্য প্রকারের হয় তবে অনুসন্ধান মান হিসাবে ব্যবহৃত হওয়ার আগে অন্য প্রকারের (বর্ণচর, চর, নাম) পাঠ্যে আটকানো হবে না?

সেই সূচকটি কীভাবে ডিফল্ট অপারেটরটি ব্যবহার করে তার থেকে আলাদা আচরণ করে?

CREATE INDEX moves_title_pattern ON movies (lower(title));

1
এই সম্পর্কিত প্রশ্নটি সাহায্যে হতে পারে: dba.stackexchange.com/questions/10694/…
এরউইন ব্র্যান্ডস্টেটর

ধন্যবাদ, ইরভিন তোমার উত্তর এই প্রশ্নের খুব সহায়ক যখন বইয়ে ধারনা অনুসন্ধান করছিলাম।
আইয়েন স্যামুয়েল ম্যাকলিন বয়স্ক

উত্তর:


20

ডকুমেন্টেশন প্রায়শই আপনাকে এই জাতীয় প্রশ্নের উত্তর দেয়। মধ্যে ভালো লেগেছে এই ক্ষেত্রে , অত্যধিক:

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

CREATE INDEX test_index ON test_table (col varchar_pattern_ops);

নোট করুন যে আপনি যদি সাধারণ <, <=,>,>> বা> = তুলনামূলকভাবে কোনও সূচক ব্যবহার করতে চান তবে আপনার ডিফল্ট অপারেটর শ্রেণীর সাথে একটি সূচকও তৈরি করা উচিত এই জাতীয় অনুসন্ধানগুলি xxx_pattern_ops অপারেটর ক্লাস ব্যবহার করতে পারে না । (সাধারণ সমতার তুলনাগুলি এই অপারেটর শ্রেণিগুলি ব্যবহার করতে পারে, তবে) বিভিন্ন অপারেটর শ্রেণীর সাথে একই কলামে একাধিক সূচী তৈরি করা সম্ভব।

ডকুমেন্টেশনটি বলতে থাকে:

আপনি যদি সি লোকেল ব্যবহার করেন তবে আপনার xxx_pattern_ops অপারেটর ক্লাসের দরকার নেই, কারণ ডিফল্ট অপারেটর ক্লাস সহ একটি সূচক সি লোকালে প্যাটার্ন-ম্যাচিং প্রশ্নের জন্য ব্যবহারযোগ্য able

আপনি নিম্নরূপে আপনার লোকেলটি পরীক্ষা করতে পারেন (এটি সম্ভবত "সি" এর পরিবর্তে ইউটিএফ 8 হবে):

postgres=> show lc_collate;
 lc_collate
-------------
 en_GB.UTF-8

আহা! আমি এটি পড়েছি, তবে এটি অনুসরণ করা শক্ত হয়েছিল তাই এটি গ্রহণ করেনি you আপনি কি text_pattern_opsলোকালের উপর নির্ভর করে এর দরকারী দরকারীতাটি বলতে পারবেন ? দেখে মনে হচ্ছে এটি আমার উপকার করবে কারণ আমার লোকেলটি 'en_US.UTF-8' ('সি' নয়), সুতরাং প্যাটার্ন অনুসন্ধানগুলি ডিফল্ট সূচকটি ব্যবহার করতে পারে না।
আইয়েন স্যামুয়েল ম্যাকলিন বয়স্ক

যথাযথভাবে। আমি যোগ করব (তবে এটি কেবল জল্পনা) কেবলমাত্র বেসিক ASCII অক্ষরগুলির মধ্যে থাকা ডেটার সাথে ডিফল্ট অপারেটর শ্রেণিটি ঠিক ততটাই ভাল - কমপক্ষে আমি এ জাতীয় সূচকগুলি ব্যবহার করে ''%% '' এর মতো প্রশ্নগুলি দেখতে পাই।
dezso

5
@ ডেজো: আপনি যদি LIKEসরল বি-ট্রি সূচক ব্যবহার করে কোনও কোয়েরি দেখে থাকেন , তবে ডিবি অবশ্যই লোকালটি ব্যবহার করছে C। অথবা সূচকটি COLLATE "POSIX"(বা COLLATE "C") দিয়ে সংজ্ঞায়িত করা হয়েছে এবং কোয়েরিটি একটি মিল খুঁজে পেয়েছে COLLATION। অন্য কোনও জোটের সাথে, সূচীর ক্রম স্থানীয় নিয়মের সাথে মেলে না এবং তাই প্যাটার্ন মেলানোর জন্য ব্যবহার করা যাবে না।
এরউইন ব্র্যান্ডসটেটার

1
@ ইরুইন ব্র্যান্ডসটেটার আমাকে নিশ্চিত করতে হবে, আপনি ঠিক বলেছেন
dezso

1
@ স্টপ হার্মিংমোনিকা আপনি সঠিক প্রতিক্রিয়া পাবেন (এবং কোনও ত্রুটি নেই), কেবল অনুসন্ধানটি সম্ভবত ধীর হবে, সূচকটি ব্যবহার করতে সক্ষম হবে না।
dezso
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.