পোস্টগ্রেএসকিউএল সূচী সহ কলামগুলি তালিকাভুক্ত করুন


233

পোস্টগ্রিএসকিউএল-তে একটি সূচক চালু আছে এমন কলামগুলি আমি পেতে চাই।

মাইএসকিউএল এ আপনি কলামটি ব্যবহার করতে SHOW INDEXES FOR tableএবং দেখতে পারেন Column_name

mysql> show indexes from foos;

+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name            | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| foos  |          0 | PRIMARY             |            1 | id          | A         |       19710 |     NULL | NULL   |      | BTREE      |         | 
| foos  |          0 | index_foos_on_email |            1 | email       | A         |       19710 |     NULL | NULL   | YES  | BTREE      |         | 
| foos  |          1 | index_foos_on_name  |            1 | name        | A         |       19710 |     NULL | NULL   |      | BTREE      |         | 
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

পোস্টগ্র্রেএসকিউএল-এর জন্য কি এর মতো কিছু রয়েছে?

আমি চেষ্টা করেছি \dpsql(সঙ্গে কম্যান্ড প্রম্প্ট -Eএসকিউএল দেখানোর জন্য বিকল্প) কিন্তু এটা আমি যে তথ্য খুঁজছি দেখায় না।

আপডেট: তাদের উত্তর যুক্ত করা প্রত্যেককে ধন্যবাদ। ক্যাপ ৩60০ আমাকে ঠিক যা দিয়েছিল তা দিয়েছিল, তবে বেশিরভাগ লোক খুব দরকারী লিঙ্কের সাথে ঝাঁপিয়ে পড়েছিল । ভবিষ্যতে উল্লেখের জন্য, জন্য ডকুমেন্টেশন খুঁজে বার করো pg_index (মাধ্যমে Milen উ: Radev ) এবং খুব দরকারী নিবন্ধ পোস্টগ্রি থেকে আহরণের মেটা তথ্য (মাধ্যমে মাইকেল Niklas )।


কেবল স্পষ্ট করে বলতে: আপনি চান আপনার প্রোগ্রামটি রানটাইমের সময়, কোন কলামগুলি সূচিযুক্ত করা উচিত, তাই না? আপনার বিপরীতে প্রোগ্রামিং জেনে।
ওয়েইন কনরাড

হ্যাঁ সঠিক. আদর্শভাবে আমি একটি এসকিউএল বিবৃতি চাই যা কেবলমাত্র কলামগুলিকে তালিকাবদ্ধ করে যে সূচি চালু আছে। তবে আমি জানি পোস্টগ্রাইএসকিউএল মাইএসকিউএল এর চেয়ে জটিল এবং সূচকটি কোনও ফাংশন ইত্যাদিতে থাকতে পারে
লূক ফ্রাঙ্কল

উত্তর:


261

কিছু পরীক্ষার ডেটা তৈরি করুন ...

create table test (a int, b int, c int, constraint pk_test primary key(a, b));
create table test2 (a int, b int, c int, constraint uk_test2 unique (b, c));
create table test3 (a int, b int, c int, constraint uk_test3b unique (b), constraint uk_test3c unique (c),constraint uk_test3ab unique (a, b));

সূচিকাগুলি এবং কলামগুলি সূচিযুক্ত:

select
    t.relname as table_name,
    i.relname as index_name,
    a.attname as column_name
from
    pg_class t,
    pg_class i,
    pg_index ix,
    pg_attribute a
where
    t.oid = ix.indrelid
    and i.oid = ix.indexrelid
    and a.attrelid = t.oid
    and a.attnum = ANY(ix.indkey)
    and t.relkind = 'r'
    and t.relname like 'test%'
order by
    t.relname,
    i.relname;

 table_name | index_name | column_name
------------+------------+-------------
 test       | pk_test    | a
 test       | pk_test    | b
 test2      | uk_test2   | b
 test2      | uk_test2   | c
 test3      | uk_test3ab | a
 test3      | uk_test3ab | b
 test3      | uk_test3b  | b
 test3      | uk_test3c  | c

কলামের নামগুলি রোল আপ করুন:

select
    t.relname as table_name,
    i.relname as index_name,
    array_to_string(array_agg(a.attname), ', ') as column_names
from
    pg_class t,
    pg_class i,
    pg_index ix,
    pg_attribute a
where
    t.oid = ix.indrelid
    and i.oid = ix.indexrelid
    and a.attrelid = t.oid
    and a.attnum = ANY(ix.indkey)
    and t.relkind = 'r'
    and t.relname like 'test%'
group by
    t.relname,
    i.relname
order by
    t.relname,
    i.relname;

 table_name | index_name | column_names
------------+------------+--------------
 test       | pk_test    | a, b
 test2      | uk_test2   | b, c
 test3      | uk_test3ab | a, b
 test3      | uk_test3b  | b
 test3      | uk_test3c  | c

24
যে কোনও লোকের জন্য জনবহুল ডাটাবেসে সূচকগুলি সন্ধান করার চেষ্টা করা হচ্ছে: এই ক্যোয়ারীটি দুর্দান্ত কাজ করে তবে and t.relname like 'test%'আপনি যে টেবিল (গুলি) চান সেটিতে লাইনটি পরিবর্তন করুন বা আপনার ডিবিতে সমস্ত সূচকগুলি খুঁজে পেতে সেই লাইনটি পুরোপুরি মুছুন।
এরিক জে

1
কেউ কি relkind='r'বোঝাতে পারে মানে?
কিওয়ারটি

5
@ প্রশ্ন, পিজি_ক্লাসের জন্য ডকুমেন্টেশন দেখুন r = ordinary table, i = index, S = sequence, v = view, c = composite type, t = TOAST table
ক্যাপ 360

1
কীটির স্বতন্ত্রতা সম্পর্কেও বলার উপায় আছে?
অ্যান্ড্রু

2
দেখতে সূচক স্বতন্ত্রতা এছাড়াও নির্বাচনix.indisunique
জানা

177

পোস্টগ্রিএসকিউএল ( pg_indexes ):

SELECT * FROM pg_indexes WHERE tablename = 'mytable';

মাইএসকিউএল ( প্রদর্শন সূচক ):

SHOW INDEX FROM mytable;

3
এটি সবচেয়ে সোজা উত্তর এবং প্রশ্নের উত্তর দেওয়ার ক্ষেত্রে সবচেয়ে আকর্ষণীয় "আমার কলামটি কি সূচিত?" PostgreSQL: SELECT COUNT(indexname) AS indexcount FROM pg_indexes WHERE tablename='mytablename' AND indexdef LIKE '%mycolumnname%' ;এবং যাচাই করুন indexcount>0। মাইএসকিউএল: SHOW INDEX FROM mytablename WHERE Column_name='mycolumnname' ;এবং ফলাফল খালি নয় তা যাচাই করুন।
zerobandwidth

2
সূচী সম্পর্কে দ্রুত তথ্য পুনরুদ্ধারের ক্ষেত্রে এটি একটি খুব কার্যকর উত্তর হলেও এটি মূল প্রশ্নের উত্তর দেয় না কারণ pg_indexesভিউটি কলামের নাম সরবরাহ করে না। postgresql.org/docs/current/view-pg-indexes.html
akagixxer

146

\d table_nameএই তথ্যটি থেকে এই তথ্যটি দেখায় psql, তবে আপনি যদি এসকিউএল ব্যবহার করে ডাটাবেস থেকে এই জাতীয় তথ্য পেতে চান তবে পোস্টগ্রাইএসকিউএল থেকে মেটা তথ্য আহরণের জন্য একবার নজর দিন ।

টেস্ট এবং উত্পাদন পরিবেশে পোস্টগ্রেএসকিউএল ডাটাবেসগুলির তুলনা করার জন্য আমি ডিবি স্কিমা থেকে কিছু তথ্য প্রতিবেদন করতে আমার ইউটিলিটিতে এই জাতীয় তথ্য ব্যবহার করি ।


পোস্টগ্র্রেস থেকে মেটা তথ্য আহরণের বিষয়ে আপনার লিঙ্কটি আমি ঠিক যা খুঁজছিলাম! এই থ্রেডে টিপস এবং কিছু খনন ব্যবহার করে আমি সেই পোস্টে তিনি যে ক্যোয়ারী ব্যবহার করেছেন তার খুব কাছাকাছি পৌঁছে গেলাম, তবে এটি সব ঠিক এইরকমভাবেই ছড়িয়ে দেওয়া ভাল।
লুক ফ্র্যাঙ্কল

1
আমি এডাব্লুএস আরডিএস পোস্টগ্রেএসকিউএল 9.6.5 ব্যবহার করছি এবং \d tableকোনও সূচি প্রদর্শন করে না, তবে \diসমস্ত সূচি প্রদর্শন করে না।
হেন্ডি ইরাওয়ান

@ হেন্ডি ইরাওয়ান এটি অন্যান্য সেটিংস দ্বারা স্পষ্টত প্রভাবিত হতে পারে। আমি যেমন আশ্চর্য হই যে আপনার যদি "টুপলস কেবল" মোড চালু থাকে (টগলড \t) দ্বারা । "কেবলমাত্র টুপলস" চালু থাকায় আমি \d"কেবলমাত্র টুপলস" বন্ধ করে সূচী পাই না do এটি পিএসকিএল (পোস্টগ্রিসএসকিউএল) 9.6.15 এর সাথে রয়েছে।
জেএমএম

77

শুধু কর: \d table_name

তবে আমি নিশ্চিত না যে আপনি কী বোঝাতে চেয়েছেন যে কলামগুলি সম্পর্কিত তথ্য নেই।

উদাহরণ স্বরূপ:

# \d pg_class
       Table "pg_catalog.pg_class"
     Column      |   Type    | Modifiers
-----------------+-----------+-----------
 relname         | name      | not null
 relnamespace    | oid       | not null
 reltype         | oid       | not null
 reloftype       | oid       | not null
 relowner        | oid       | not null
 relam           | oid       | not null
 relfilenode     | oid       | not null
 reltablespace   | oid       | not null
 relpages        | integer   | not null
 reltuples       | real      | not null
 reltoastrelid   | oid       | not null
 reltoastidxid   | oid       | not null
 relhasindex     | boolean   | not null
 relisshared     | boolean   | not null
 relistemp       | boolean   | not null
 relkind         | "char"    | not null
 relnatts        | smallint  | not null
 relchecks       | smallint  | not null
 relhasoids      | boolean   | not null
 relhaspkey      | boolean   | not null
 relhasexclusion | boolean   | not null
 relhasrules     | boolean   | not null
 relhastriggers  | boolean   | not null
 relhassubclass  | boolean   | not null
 relfrozenxid    | xid       | not null
 relacl          | aclitem[] |
 reloptions      | text[]    |
Indexes:
    "pg_class_oid_index" UNIQUE, btree (oid)
    "pg_class_relname_nsp_index" UNIQUE, btree (relname, relnamespace)

এটি পরিষ্কারভাবে দেখায় যে প্রদত্ত সূচকটি এই টেবিলের মধ্যে রয়েছে which


আমি এমন কিছু প্রত্যাশা করছিলাম যা আমাকে টেবিলে সমস্ত সূচী করতে দেয় তবে আপনি ঠিক বলেছেন, \d index_nameতথ্য আছে। সুতরাং আমি কোনও টেবিলে সূচিগুলি দেখতে পারি, তারপরে বিশদটি সন্ধান করতে পারি। কলামগুলি না দেখিয়ে বোঝাতে চাইছি যে আমি \d tableনামের দ্বারা উত্পাদিত এসকিউএলটির দিকে চেয়েছিলাম এবং কলামের তালিকাটি কোথা থেকে আসছে তা আমার কাছে স্পষ্ট নয়। আমি মনে করি এটি সূচক সংজ্ঞা বাদ দিয়ে পার্স করা হচ্ছে, যা আমি না করতে পছন্দ করব।
লুক ফ্র্যাঙ্কল

আমি এডাব্লুএস আরডিএস পোস্টগ্রেএসকিউএল 9.6.5 ব্যবহার করছি এবং \d tableকোনও সূচি প্রদর্শন করে না, তবে \diসমস্ত সূচি প্রদর্শন করে না।
হেন্ডি ইরাওয়ান

37

# \di

সহজ এবং সংক্ষিপ্ততম উপায় হ'ল \diবর্তমান ডাটাবেসে সমস্ত সূচী তালিকাবদ্ধ করবে।

$ \di
                      List of relations
 Schema |            Name             | Type  |  Owner   |     Table     
--------+-----------------------------+-------+----------+---------------
 public | part_delivery_index         | index | shipper  | part_delivery
 public | part_delivery_pkey          | index | shipper  | part_delivery
 public | shipment_by_mandator        | index | shipper  | shipment_info
 public | shipment_by_number_and_size | index | shipper  | shipment_info
 public | shipment_info_pkey          | index | shipper  | shipment_info
(5 rows)

\diহ'ল \dকমান্ডের "ছোট ভাই" যা বর্তমান ডি ডাটাবেসের সমস্ত সম্পর্ককে তালিকাভুক্ত করবে । সুতরাং \diঅবশ্যই "আমাকে দেখাও এই জন্য দাঁড়ানো atabases আমি ndexes"।

টাইপিং \diSসিস্টেমভুক্ত ব্যবহৃত সমস্ত সূচীর তালিকা তৈরি করবে, যার অর্থ আপনি সমস্ত pg_catolog সূচীও পাবেন।

$ \diS
                                      List of relations
   Schema   |                   Name                    | Type  |  Owner   |          Table
------------+-------------------------------------------+-------+----------+-------------------------
 pg_catalog | pg_aggregate_fnoid_index                  | index | postgres | pg_aggregate
 pg_catalog | pg_am_name_index                          | index | postgres | pg_am
 pg_catalog | pg_am_oid_index                           | index | postgres | pg_am
 pg_catalog | pg_amop_fam_strat_index                   | index | postgres | pg_amop
 pg_catalog | pg_amop_oid_index                         | index | postgres | pg_amop
 pg_catalog | pg_amop_opr_fam_index                     | index | postgres | pg_amop
 pg_catalog | pg_amproc_fam_proc_index                  | index | postgres | pg_amproc
 pg_catalog | pg_amproc_oid_index                       | index | postgres | pg_amproc
 pg_catalog | pg_attrdef_adrelid_adnum_index            | index | postgres | pg_attrdef
--More-- 

এই উভয় কমান্ডের সাহায্যে আপনি +আরও কিছু তথ্য পেতে চাইলে সূচকটির আকারের আকারের আকার এবং যদি উপলভ্য থাকে তবে তার বিবরণ পেতে পারেন।

$ \di+
                                 List of relations
 Schema |            Name             | Type  |  Owner   |     Table     | Size  | Description 
--------+-----------------------------+-------+----------+---------------+-------+-------------
 public | part_delivery_index         | index | shipper  | part_delivery | 16 kB | 
 public | part_delivery_pkey          | index | shipper  | part_delivery | 16 kB | 
 public | shipment_by_mandator        | index | shipper  | shipment_info | 19 MB | 
 public | shipment_by_number_and_size | index | shipper  | shipment_info | 19 MB | 
 public | shipment_info_pkey          | index | shipper  | shipment_info | 53 MB | 
(5 rows)

পিএসকিএল-তে আপনি সহজেই কমান্ড টাইপিংয়ের সহায়তা পেতে পারেন \?


2
তবে এটি কলামের নামগুলি দেখায় না যার ভিত্তিতে সূচি তৈরি করা হয়। সম্মিলিত প্রাথমিক কী সূচকগুলিতে অনেকগুলি কলাম রয়েছে এবং সেগুলি দেখা যায় না।
বিগনেশ রাজা

18

অন্যদের কোডের সাথে সম্মিলিত হয়ে একটি ভিউ তৈরি করেছে:

CREATE OR REPLACE VIEW view_index AS 
SELECT
     n.nspname  as "schema"
    ,t.relname  as "table"
    ,c.relname  as "index"
    ,pg_get_indexdef(indexrelid) as "def"
FROM pg_catalog.pg_class c
    JOIN pg_catalog.pg_namespace n ON n.oid        = c.relnamespace
    JOIN pg_catalog.pg_index i ON i.indexrelid = c.oid
    JOIN pg_catalog.pg_class t ON i.indrelid   = t.oid
WHERE c.relkind = 'i'
    and n.nspname not in ('pg_catalog', 'pg_toast')
    and pg_catalog.pg_table_is_visible(c.oid)
ORDER BY
     n.nspname
    ,t.relname
    ,c.relname;

12

কিছু নমুনা ডেটা ...

create table test (a int, b int, c int, constraint pk_test primary key(a, b));
create table test2 (a int, b int, c int, constraint uk_test2 unique (b, c));
create table test3 (a int, b int, c int, constraint uk_test3b unique (b), constraint uk_test3c unique (c), constraint uk_test3ab unique (a, b));

pg_get_indexdefফাংশন ব্যবহার করুন :

select pg_get_indexdef(indexrelid) from pg_index where indrelid = 'test'::regclass;

                    pg_get_indexdef
--------------------------------------------------------
 CREATE UNIQUE INDEX pk_test ON test USING btree (a, b)
(1 row)


select pg_get_indexdef(indexrelid) from pg_index where indrelid = 'test2'::regclass;
                     pg_get_indexdef
----------------------------------------------------------
 CREATE UNIQUE INDEX uk_test2 ON test2 USING btree (b, c)
(1 row)


select pg_get_indexdef(indexrelid) from pg_index where indrelid ='test3'::regclass;
                      pg_get_indexdef
------------------------------------------------------------
 CREATE UNIQUE INDEX uk_test3b ON test3 USING btree (b)
 CREATE UNIQUE INDEX uk_test3c ON test3 USING btree (c)
 CREATE UNIQUE INDEX uk_test3ab ON test3 USING btree (a, b)
(3 rows)

সহজ এবং কার্যকর!
ডেভিড

তুলনাহীন. আমি ভাগ্যবান আমি এই উত্তরে স্ক্রোল করেছি।
গ্রেটভোভান

8

এই কমান্ডগুলি সারণী ভেরিয়েবল, সূচী এবং সীমাবদ্ধতার ভিউ দেখায়

=# \d table_name;

উদাহরণ:

testannie=# \d dv.l_customer_account;

7

\d tablename 8.3.8 সংস্করণে আমার জন্য কলামের নামগুলি দেখায়।

 "username_idx" UNIQUE, btree (username), tablespace "alldata1"

7

QUERY এর ফলাফল:

table |     column     |          type          | notnull |  index_name  | is_index | primarykey | uniquekey | default
-------+----------------+------------------------+---------+--------------+----------+-   -----------+-----------+---------
 nodes | dns_datacenter | character varying(255) | f       |              | f        | f          | f         |
 nodes | dns_name       | character varying(255) | f       | dns_name_idx | t        | f          | f         |
 nodes | id             | uuid                   | t       | nodes_pkey   | t        | t          | t         |
(3 rows)

প্রশ্ন:

SELECT  
c.relname AS table,
f.attname AS column,  
pg_catalog.format_type(f.atttypid,f.atttypmod) AS type,
f.attnotnull AS notnull,  
i.relname as index_name,
CASE  
    WHEN i.oid<>0 THEN 't'  
    ELSE 'f'  
END AS is_index,  
CASE  
    WHEN p.contype = 'p' THEN 't'  
    ELSE 'f'  
END AS primarykey,  
CASE  
    WHEN p.contype = 'u' THEN 't' 
    WHEN p.contype = 'p' THEN 't' 
    ELSE 'f'
END AS uniquekey,
CASE
    WHEN f.atthasdef = 't' THEN d.adsrc
END AS default  FROM pg_attribute f  
JOIN pg_class c ON c.oid = f.attrelid  
JOIN pg_type t ON t.oid = f.atttypid  
LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum  
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace  
LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY (p.conkey)  
LEFT JOIN pg_class AS g ON p.confrelid = g.oid
LEFT JOIN pg_index AS ix ON f.attnum = ANY(ix.indkey) and c.oid = f.attrelid and c.oid = ix.indrelid 
LEFT JOIN pg_class AS i ON ix.indexrelid = i.oid 

WHERE c.relkind = 'r'::char  
AND n.nspname = 'public'  -- Replace with Schema name 
--AND c.relname = 'nodes'  -- Replace with table name, or Comment this for get all tables
AND f.attnum > 0
ORDER BY c.relname,f.attname;

দুর্দান্ত, তবে কলামের "কলাম" নামটি একটি সংরক্ষিত শব্দ। আইডিইএম স্কিমার জন্য, কলাম_নাম ব্যবহার করা উচিত
পরনি

5

কাঁচা তথ্য pg_index এ


মজাদার. সুনির্দিষ্টভাবে indkey: "এটি ইনড্যাটস মানগুলির একটি অ্যারে যা নির্দেশ করে যে কোন সূচীটি এই সূচকে সূচি সূচিত করে কোন টেবিলের কলামগুলি। সংশ্লিষ্ট সূচক গুণ, সারণী কলামগুলি বেশী অভিব্যক্তি বরং একটি সহজ কলাম রেফারেন্স চেয়ে "
লুক Francl

2

আপনি যদি সূচীতে কলামের অর্ডার সংরক্ষণ করতে চান তবে এটি করার জন্য এখানে (খুব কুরুচিপূর্ণ) উপায় রয়েছে:

select table_name,
    index_name,
    array_agg(column_name)
from (
    select
        t.relname as table_name,
        i.relname as index_name,
        a.attname as column_name,
        unnest(ix.indkey) as unn,
        a.attnum
    from
        pg_class t,
        pg_class i,
        pg_index ix,
        pg_attribute a
    where
        t.oid = ix.indrelid
        and i.oid = ix.indexrelid
        and a.attrelid = t.oid
        and a.attnum = ANY(ix.indkey)
        and t.relkind = 'r'
        and t.relnamespace = <oid of the schema you're interested in>
    order by
        t.relname,
        i.relname,
        generate_subscripts(ix.indkey,1)) sb
where unn = attnum
group by table_name, index_name

কলাম ক্রম pg_index.indkey কলামে সঞ্চিত আছে, তাই আমি সেই অ্যারে থেকে সাবস্ক্রিপ্ট দ্বারা আদেশ করেছি।


2

সূচীগুলির সাথে চারপাশে খেলার সময় সূচীতে কোন কলামগুলি কলামগুলি নির্ধারণ করা হয় সেগুলি কলামগুলির মতোই গুরুত্বপূর্ণ।

নিম্নলিখিত কোয়েরিতে একটি প্রদত্ত টেবিলের জন্য সমস্ত সূচী এবং তাদের সমস্ত কলাম একটি বাছাই করা ফ্যাশনে তালিকাবদ্ধ করে।

SELECT
  table_name,
  index_name,
  string_agg(column_name, ',')
FROM (
       SELECT
         t.relname AS table_name,
         i.relname AS index_name,
         a.attname AS column_name,
         (SELECT i
          FROM (SELECT
                  *,
                  row_number()
                  OVER () i
                FROM unnest(indkey) WITH ORDINALITY AS a(v)) a
          WHERE v = attnum)
       FROM
         pg_class t,
         pg_class i,
         pg_index ix,
         pg_attribute a
       WHERE
         t.oid = ix.indrelid
         AND i.oid = ix.indexrelid
         AND a.attrelid = t.oid
         AND a.attnum = ANY (ix.indkey)
         AND t.relkind = 'r'
         AND t.relname LIKE 'tablename'
       ORDER BY table_name, index_name, i
     ) raw
GROUP BY table_name, index_name

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

iordinality জন্য খুবই বাক্পটুতাপূর্ণ হয়। এটি কলামগুলি সঠিক ক্রমে বর্ণিত হয়েছে তা নিশ্চিত করে।
kbrock

এটিই ছিল আমার পক্ষে একমাত্র উত্তর। কলামের ক্রম সমালোচনাযোগ্য। (আপনি যদি আমাকে বিশ্বাস না করেন তবে একটি ফোনবুকে প্রথম নাম ফ্র্যাঙ্কযুক্ত সমস্ত লোকের সন্ধান করুন))
জুরজ

1

প্রয়োজনীয় সূচকগুলিতে ড্রিল করতে দয়া করে নীচের ক্যোয়ারীটি চেষ্টা করুন

নীচের মত প্রশ্ন - আমি ব্যক্তিগতভাবে এটি চেষ্টা করেছি এবং এটি প্রায়শই ব্যবহার করি।

SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' 
THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' END as "Type",
  u.usename as "Owner",
 c2.relname as "Table"
FROM pg_catalog.pg_class c
     JOIN pg_catalog.pg_index i ON i.indexrelid = c.oid
     JOIN pg_catalog.pg_class c2 ON i.indrelid = c2.oid
     LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('i','')
      AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
      AND pg_catalog.pg_table_is_visible(c.oid)
      AND c2.relname like '%agg_transaction%' --table name
      AND nspname = 'edjus' -- schema name 
ORDER BY 1,2;

1

গৃহীত উত্তর অনুরূপ কিন্তু থাকার বাম যোগদানের উপর pg_attribute স্বাভাবিক যোগ দিতে বা কোয়েরি মত pg_attribute স্বল্পতা দিতে সূচকের যা মত হল:
create unique index unique_user_name_index on users (lower(name))

select 
    row_number() over (order by c.relname),
    c.relname as index, 
    t.relname as table, 
    array_to_string(array_agg(a.attname), ', ') as column_names 
from pg_class c
join pg_index i on c.oid = i.indexrelid and c.relkind='i' and c.relname not like 'pg_%' 
join pg_class t on t.oid = i.indrelid
left join pg_attribute a on a.attrelid = t.oid and a.attnum = ANY(i.indkey) 
group by t.relname, c.relname order by c.relname;

ভাল দ্রষ্টব্য, তবে কীভাবে সেই "নিম্ন (
কলামের নাম

1

এখানে এমন একটি ফাংশন যা কপিক 60 এর উত্তরটি মোড় করে:

CREATE OR REPLACE FUNCTION getIndices(_table_name varchar)
  RETURNS TABLE(table_name varchar, index_name varchar, column_name varchar) AS $$
  BEGIN
    RETURN QUERY
    select
    t.relname::varchar as table_name,
    i.relname::varchar as index_name,
    a.attname::varchar as column_name
from
    pg_class t,
    pg_class i,
    pg_index ix,
    pg_attribute a
where
    t.oid = ix.indrelid
    and i.oid = ix.indexrelid
    and a.attrelid = t.oid
    and a.attnum = ANY(ix.indkey)
    and t.relkind = 'r'
    and t.relname = _table_name
order by
    t.relname,
    i.relname;
  END;
  $$ LANGUAGE plpgsql;

ব্যবহার:

select * from getIndices('<my_table>')

আমার সূচকগুলির অংশগুলি তালিকাভুক্ত করেনি যা ফাংশন ব্যবহার করে (যেমন "উপরের (ক্ষেত্রের নাম)")।
জনমুড

0

একটি সহজ সমাধান সম্পর্কে:

SELECT 
  t.relname table_name,
  ix.relname index_name,
  indisunique,
  indisprimary, 
  regexp_replace(pg_get_indexdef(indexrelid), '.*\((.*)\)', '\1') columns
FROM pg_index i
JOIN pg_class t ON t.oid = i.indrelid
JOIN pg_class ix ON ix.oid = i.indexrelid
WHERE t.relname LIKE 'test%'

`


এই সমাধান ভালবাসা। দুর্ভাগ্যক্রমে এটি সূচীতে ব্যর্থ হয় যেখানে ক্লজ রয়েছে। (বা অন্যান্য বন্ধনী)
কেব্রোক

আমি শুরুতে পেরেনকে এড়িয়ে চলতে এবং মাঝখানে প্যারেনগুলি ক্যাপচার না করে পরিবর্তন করেছি এবং এর পরে সমস্ত কিছু ফেলেছি। '^[^\)]*\(([^\)]*)\).*$'
kbrock

0

@ কেপ 360 এর দুর্দান্ত উত্তর, যোগদানের সিনট্যাক্স ব্যবহারে রূপান্তরিত।

select t.relname as table_name
     , i.relname as index_name
     , array_to_string(array_agg(a.attname), ', ') as column_names
from pg_class t
join pg_index ix
on t.oid = ix.indrelid
join pg_class i
on i.oid = ix.indexrelid
join pg_attribute a
on a.attrelid = t.oid
and a.attnum = ANY(ix.indkey)
where t.relkind = 'r'
and t.relname like 'test%'
group by t.relname
       , i.relname
order by t.relname
       , i.relname
;

0

আমি মনে করি না এই সংস্করণটি এখনও এই থ্রেডটিতে বিদ্যমান: এটি সূচকের জন্য ডিডিএল সহ কলামের নামের তালিকা সরবরাহ করে।

CREATE OR REPLACE VIEW V_TABLE_INDEXES AS

SELECT
     n.nspname  as "schema"
    ,t.relname  as "table"
    ,c.relname  as "index"
    ,i.indisunique AS "is_unique"
    ,array_to_string(array_agg(a.attname), ', ') as "columns"
    ,pg_get_indexdef(i.indexrelid) as "ddl"
FROM pg_catalog.pg_class c
    JOIN pg_catalog.pg_namespace n ON n.oid        = c.relnamespace
    JOIN pg_catalog.pg_index i ON i.indexrelid = c.oid
    JOIN pg_catalog.pg_class t ON i.indrelid   = t.oid
    JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(i.indkey)
WHERE c.relkind = 'i'
      and n.nspname not in ('pg_catalog', 'pg_toast')
      and pg_catalog.pg_table_is_visible(c.oid)
GROUP BY
    n.nspname
    ,t.relname
    ,c.relname
    ,i.indisunique
    ,i.indexrelid
ORDER BY
    n.nspname
    ,t.relname
    ,c.relname;

আমি দেখেছি যে ফাংশনগুলি ব্যবহার করে সূচকগুলি কলামের নামের সাথে লিঙ্ক করে না, তাই মাঝে মধ্যে আপনি একটি সূচী তালিকা দেখতে পান যেমন একটি কলামের নাম যখন বাস্তবে 3 ব্যবহার হয়।

উদাহরণ:

CREATE INDEX ui1 ON table1 (coalesce(col1,''),coalesce(col2,''),col3)

ক্যোয়ারীটি সূচীতে কেবলমাত্র 'কল 3' ফেরত দেয় তবে ডিডিএল সূচীতে ব্যবহৃত কলামগুলির পুরো সেট দেখায়।


0

@ Cope360 এর উত্তরের উত্তরে প্রসারিত করুন। নির্দিষ্ট টেবিলের জন্য (কেবল একই টেবিলের ওআইডি ব্যবহার করে তাদের একই টেবিলের নাম তবে বিভিন্ন স্কিমা যুক্ত করুন) get

select
     t.relname as table_name
    ,i.relname as index_name
    ,a.attname as column_name
    ,a.attrelid tableid

from
    pg_class t,
    pg_class i,
    pg_index ix,
    pg_attribute a
where
    t.oid = ix.indrelid
    and i.oid = ix.indexrelid
    and a.attrelid = t.oid
    and a.attnum = ANY(ix.indkey)
    and t.relkind = 'r'
    -- and t.relname like 'tbassettype'
    and a.attrelid = '"dbLegal".tbassettype'::regclass
order by
    t.relname,
    i.relname;

ব্যাখ্যা করুন: স্কিমা 'ডিবিএসেট' এবং 'ডিবিএগেল' উভয়টিতে আমার টেবিলের নাম 'টবাসসেটটাইপ' রয়েছে। ডিবিলেগলে কেবল টেবিল পেতে কেবল a.attrelid = এর OID দিন let


0

@ কপিক ৩60০ এর সামান্য বিট পরিবর্তিত উত্তর:

create table test (a int, b int, c int, constraint pk_test primary key(c, a, b));
select i.relname as index_name,
       ix.indisunique as is_unique,
       a.attname as column_name,
from pg_class c
       inner join pg_index ix on c.oid=ix.indrelid
       inner join pg_class i on ix.indexrelid=i.oid
       inner join pg_attribute a on a.attrelid=c.oid and a.attnum=any(ix.indkey)
where c.oid='public.test'::regclass::oid
order by array_position(ix.indkey, a.attnum) asc;

এটি সূচী কলামগুলি সঠিক ক্রমে প্রদর্শন করবে:

index_name      is_unique  column_name
pk_test         true       c
pk_test         true       a
pk_test         true       b

"বাম যোগ যোগে পিজি_ট্রিবিউট" ব্যবহার করা অবশ্যই গণিত কলামগুলিতে সূচীগুলি প্রদর্শন করবে অবশ্যই অবশ্যই একটি এনওএলএল কলাম_নামের সাথে।
পাওলো বনজিণী

0
select t.relname as table_name, 
       i.relname as index_name, 
       array_position(ix.indkey,a.attnum) pos, 
       a.attname as column_name
from pg_class t
join pg_index ix on t.oid = ix.indrelid
join pg_class i on i.oid = ix.indexrelid
join pg_attribute a on a.attrelid = t.oid and a.attnum = ANY(ix.indkey)
where t.relkind = 'r'
and t.relname like 'orders'
order by t.relname, i.relname, array_position(ix.indkey,a.attnum)

0

@ কপিকে ৩60০- এর গৃহীত উত্তরটি ভাল, তবে আমি ওরাকলের ডিবিএ_আইND_COLUMNS, ALL_IND_COLUMNS, এবং USER_IND_COLUMNS (যেমন, টেবিল / সূচীকরণ স্কিমা এবং মাল্টিকোলোম সূচীতে সূচকের অবস্থানের প্রতিবেদন করা) এর মতো কিছুটা চেয়েছি এর জবাব দিন:

with
 ind_cols as (
select
    n.nspname as schema_name,
    t.relname as table_name,
    i.relname as index_name,
    a.attname as column_name,
    1 + array_position(ix.indkey, a.attnum) as column_position
from
     pg_catalog.pg_class t
join pg_catalog.pg_attribute a on t.oid    =      a.attrelid 
join pg_catalog.pg_index ix    on t.oid    =     ix.indrelid
join pg_catalog.pg_class i     on a.attnum = any(ix.indkey)
                              and i.oid    =     ix.indexrelid
join pg_catalog.pg_namespace n on n.oid    =      t.relnamespace
where t.relkind = 'r'
order by
    t.relname,
    i.relname,
    array_position(ix.indkey, a.attnum)
)
select * 
from ind_cols
where schema_name = 'test'
  and table_name  = 'indextest'
order by schema_name, table_name
;

এটি একটি আউটপুট দেয়:

 schema_name | table_name | index_name | column_name | column_position 
-------------+------------+------------+-------------+-----------------
 test        | indextest  | testind1   | singleindex |               1
 test        | indextest  | testind2   | firstoftwo  |               1
 test        | indextest  | testind2   | secondoftwo |               2
(3 rows)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.