PostgreSQL সূচি অ্যারে কলামগুলি কি করতে পারে?


144

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

আমি একটি int[]কলাম সহ একটি সাধারণ টেবিল তৈরি করেছি এবং এটিতে একটি অনন্য সূচক রেখেছি । আমি লক্ষ্য করেছি যে আমি একই ধরণের ইনট যুক্ত করতে পারছি না, যা আমাকে বিশ্বাস করতে পরিচালিত করে যে সূচিটি অ্যারে আইটেমগুলির সংমিশ্রণ, প্রতিটি আইটেমের সূচক নয়।

INSERT INTO "Test"."Test" VALUES ('{10, 15, 20}');
INSERT INTO "Test"."Test" VALUES ('{10, 20, 30}');

SELECT * FROM "Test"."Test" WHERE 20 = ANY ("Column1");

সূচি কি এই ক্যোয়ারিতে সহায়তা করছে?


ডেটাটাইপ jsonbব্যবহার এবং সূচকগুলি ব্যবহার করা কি সম্ভব ? postgresql.org/docs/9.5/static/funifications-json.html এবং postgresql.org/docs/9.5/static/datatype-json.html#JSON-INDEXING
user3791372

উত্তর:


179

হ্যাঁ আপনি একটি অ্যারে সূচক করতে পারেন, তবে আপনাকে অ্যারে অপারেটর এবং জিআইএন-সূচক প্রকারটি ব্যবহার করতে হবে

উদাহরণ:

    CREATE TABLE "Test"("Column1" int[]);
    INSERT INTO "Test" VALUES ('{10, 15, 20}');
    INSERT INTO "Test" VALUES ('{10, 20, 30}');

    CREATE INDEX idx_test on "Test" USING GIN ("Column1");

    -- To enforce index usage because we have only 2 records for this test... 
    SET enable_seqscan TO off;

    EXPLAIN ANALYZE
    SELECT * FROM "Test" WHERE "Column1" @> ARRAY[20];

ফলাফল:

Bitmap Heap Scan on "Test"  (cost=4.26..8.27 rows=1 width=32) (actual time=0.014..0.015 rows=2 loops=1)
  Recheck Cond: ("Column1" @> '{20}'::integer[])
  ->  Bitmap Index Scan on idx_test  (cost=0.00..4.26 rows=1 width=0) (actual time=0.009..0.009 rows=2 loops=1)
        Index Cond: ("Column1" @> '{20}'::integer[])
Total runtime: 0.062 ms
বিঃদ্রঃ

এটি প্রদর্শিত হয় যে অনেক ক্ষেত্রে gin__int_ops বিকল্পের প্রয়োজন

create index <index_name> on <table_name> using GIN (<column> gin__int_ops)

আমি এখনও এমন কোনও মামলা দেখিনি যেখানে এটি জিন__িন্ট_পস বিকল্পগুলি ছাড়া && এবং @> অপারেটরের সাথে কাজ করবে


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

15
দয়া করে কোড উদাহরণগুলিতে পোস্টগ্রেএসকিউএল সনাক্তকারীগুলিতে বড় হাতের অক্ষর ব্যবহার করবেন না, এটি কেবল এমন লোককে বিভ্রান্ত করে যারা উদ্ধৃতি / কেস ভাঁজ বিধিগুলির সাথে পরিচিত নয়, বিশেষত পোস্টগ্র্রেএসকিউএল-এ নতুন লোক।
intgr

6
আমার মন্তব্যটি এখানে পুনরাবৃত্তি করতে: আমার অভিজ্ঞতা থেকে, কলামগুলির জন্য ব্যবহৃত না হলে এই সূচকগুলি কোনও গতিপথের সামান্য প্রস্তাব দেয় । আমি এই অপশন ক্লাসটি আবিষ্কার না করা অবধি আমার হতাশার এবং অন্যান্য সমাধানগুলির সন্ধান করতে বছর লেগেছিল। এটি সীমান্তের অলৌকিক কর্মী। gin__int_opsinteger[]
IamIC

1
@ আইমিকের মানে কি এই যে আমি স্ট্রিংগুলির একটি অ্যারের সূচকে বিরক্ত করব না? এবং আমার কেবলমাত্র পূর্ণসংখ্যার অ্যারেগুলি করা উচিত?
ryan2johnson9

93

@ ট্রেগোরেগ তার প্রস্তাবিত অনুগ্রহকে মন্তব্যে একটি প্রশ্ন উত্থাপন করেছে:

আমি বর্তমান উত্তরগুলি কাজ করে না। অ্যারে-টাইপযুক্ত কলামে জিআইএন সূচক ব্যবহার করা কোনও () অপারেটরের কর্মক্ষমতা বৃদ্ধি করে না। আসলেই কি এর কোন সমাধান নেই?

@ ফ্র্যাঙ্কের গৃহীত উত্তর আপনাকে অ্যারে অপারেটরগুলি ব্যবহার করতে বলে , যা পোস্টগ্র্রেস ১১ এর জন্য এখনও সঠিক The

... পোস্টগ্রাএসকিউএল এর স্ট্যান্ডার্ড ডিস্ট্রিবিউটে অ্যারেগুলির জন্য একটি জিআইএন অপারেটর শ্রেণি অন্তর্ভুক্ত রয়েছে, যা এই অপারেটরগুলি ব্যবহার করে সূচকযুক্ত ক্যোয়ারিকে সমর্থন করে:

<@
@>
=
&&

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

পোস্টগ্রিস ইনডেক্সগুলি অপারেটরগুলিতে আবদ্ধ হয় (যা নির্দিষ্ট ধরণের জন্য প্রয়োগ করা হয়), একা ডেটা বা ফাংশন বা অন্য কিছু নয়। এটি পোস্টগ্রিসের মূল বার্কলে ডিজাইনের একটি heritageতিহ্য এবং এটি এখন খুব কঠিন। এবং এটি সাধারণত ঠিক কাজ করে fine টম লেন এ সম্পর্কে মন্তব্য করার সাথে এখানে pgsql- বাগগুলিতে একটি থ্রেড দেওয়া আছে।

কিছু পোস্টগিস ফাংশন (যেমন ST_DWithin()) মনে হয় এই অধ্যক্ষটিকে লঙ্ঘন করেছে, তবে এটি তেমন নয়। স্বতন্ত্র অপারেটরগুলি ব্যবহার করার জন্য এই ফাংশনগুলি অভ্যন্তরীণভাবে পুনরায় লিখিত হয় ।

সূচকযুক্ত অভিব্যক্তি অপারেটরের বামে হতে হবে । বেশিরভাগ অপারেটরগুলির জন্য ( উপরের সমস্তগুলি সহ ) কোয়েরি পরিকল্পনাকারী অপারেশনগুলিকে উল্টিয়ে এই অর্জন করতে পারবেন যদি আপনি সূচকযুক্ত প্রকাশটি ডানদিকে রাখেন - তবে এটিকে COMMUTATORসংজ্ঞায়িত করা হয়েছে। ANYকনস্ট্রাক্ট বিভিন্ন অপারেটর সঙ্গে একযোগে ব্যবহার করা যেতে পারে এবং একটি অপারেটর নিজেই নয়। অ্যারে উপাদানগুলিতে অপারেটরকে constant = ANY (array_expression)সমর্থনকারী কেবল সূচক হিসাবে ব্যবহৃত হলে যোগ্যতা অর্জন করবে এবং এর জন্য আমাদের একটি পরিবহণ প্রয়োজন । জিআইএন সূচকগুলি বাইরে।== ANY()

পোস্টগ্র্রেস বর্তমানে এটি থেকে একটি জিআইএন-ইনডেক্সযোগ্য প্রকাশ পেতে যথেষ্ট স্মার্ট নয়। নতুনদের জন্য, constant = ANY (array_expression)হয় সম্পূর্ণরূপে সমতুল্য না করতে array_expression @> ARRAY[constant]। অ্যারে অপারেটররা কোনও ত্রুটি ফিরিয়ে দেয় যদি কোনও এনএলএল উপাদান যুক্ত থাকে, অন্যদিকে ANYকনস্ট্রাক্ট দু'পক্ষেই NULL নিয়ে কাজ করতে পারে। এবং ডেটা টাইপ মিলের জন্য বিভিন্ন ফলাফল রয়েছে।

সম্পর্কিত উত্তর:

Asides

মান ছাড়াই integerঅ্যারে ( int4, না int2বা int8) এর সাথে কাজ করার সময় NULL(যেমন আপনার উদাহরণ থেকে বোঝা যায়) অতিরিক্ত মডিউল বিবেচনা করুন intarray, এটি বিশেষায়িত, দ্রুত অপারেটর এবং সূচক সমর্থন সরবরাহ করে। দেখা:

UNIQUEআপনার প্রশ্নের যে প্রতিবন্ধকতা উত্তরহীন হয়েছে তার সীমাবদ্ধতার জন্য : এটি সম্পূর্ণ অ্যারের মান (যেমন আপনার সন্দেহজনক) তে বিটি সূচক দিয়ে প্রয়োগ করা হয়েছে এবং উপাদানগুলির অনুসন্ধানে মোটেই সহায়তা করে না । বিবরণ:


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

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

1
আমার অভিজ্ঞতা থেকে, কলামগুলির জন্য ব্যবহৃত না হলে এই সূচকগুলি কোনও গতিপথের সামান্য প্রস্তাব দেয় । আমি এই অপশন ক্লাসটি আবিষ্কার না করা অবধি আমার হতাশার এবং অন্যান্য সমাধানগুলির সন্ধান করতে বছর লেগেছিল। এটি সীমান্তের অলৌকিক কর্মী। gin__int_opsinteger[]
IamIC

2
@ আইমিক: আমি ইনটারারে পয়েন্টার যুক্ত করেছি। আপনি উল্লেখ হিসাবে, উল্লেখযোগ্য বলে মনে হচ্ছে।
এরউইন ব্র্যান্ডস্টেটার

জন্য ANY (array_expression) = constantএক্সপ্রেশন, জিন ইনডেক্স সূক্ষ্ম কাজ?
ব্যবহারকারী 10375

37

পৃথক অ্যারে উপাদানগুলি সূচী করা এখন সম্ভব। উদাহরণ স্বরূপ:

CREATE TABLE test (foo int[]);
INSERT INTO test VALUES ('{1,2,3}');
INSERT INTO test VALUES ('{4,5,6}');
CREATE INDEX test_index on test ((foo[1]));
SET enable_seqscan TO off;

EXPLAIN ANALYZE SELECT * from test WHERE foo[1]=1;
                                                QUERY PLAN                                                    
------------------------------------------------------------------------------------------------------------------
 Index Scan using test_index on test  (cost=0.00..8.27 rows=1 width=32) (actual   time=0.070..0.071 rows=1 loops=1)
   Index Cond: (foo[1] = 1)
 Total runtime: 0.112 ms
(3 rows)

এটি কমপক্ষে পোস্টগ্রিজ 9.2.1 এ কাজ করে। নোট করুন যে আপনাকে প্রতিটি অ্যারে সূচকের জন্য পৃথক সূচক তৈরি করতে হবে, আমার উদাহরণে আমি কেবল প্রথম উপাদানটিকেই সূচকযুক্ত করেছি।


28
এটিকে হারাতে না দিন - আপনি যে কোনও () অপারেটরটি ব্যবহার করতে চান সেখানে এই ভেরিয়েবলের দৈর্ঘ্যের অ্যারেটির জন্য আশাহীন।
Καrτhικ

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