Saya ingin mendapatkan kolom yang indeksnya ada di PostgreSQL.
Di MySQL Anda dapat menggunakan SHOW INDEXES FOR table
dan melihat Column_name
kolom.
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 | |
+-------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
Apakah ada yang seperti ini untuk PostgreSQL?
Saya sudah mencoba \d
di psql
command prompt (dengan -E
pilihan untuk menampilkan SQL) tetapi tidak menunjukkan informasi yang saya cari.
Pembaruan: Terima kasih kepada semua orang yang menambahkan jawaban mereka. cope360 memberi saya apa yang saya cari, tetapi beberapa orang menimpali dengan tautan yang sangat berguna. Untuk referensi di masa mendatang, lihat dokumentasi untuk pg_index (via Milen A. Radev ) dan artikel yang sangat berguna Mengekstraksi informasi META dari PostgreSQL (via Michał Niklas ).
sql
postgresql
indexing
Luke Francl
sumber
sumber
Jawaban:
Buat beberapa data uji ...
Daftar indeks dan kolom yang diindeks:
Gulung nama kolom:
sumber
and t.relname like 'test%'
baris ke tabel yang Anda inginkan, atau hapus baris itu sepenuhnya untuk menemukan semua indeks di db Anda.relkind='r'
artinya?r = ordinary table, i = index, S = sequence, v = view, c = composite type, t = TOAST table
.ix.indisunique
PostgreSQL ( pg_indexes ):
MySQL ( TAMPILKAN INDEKS ):
sumber
SELECT COUNT(indexname) AS indexcount FROM pg_indexes WHERE tablename='mytablename' AND indexdef LIKE '%mycolumnname%' ;
dan verifikasiindexcount>0
. mySQL:SHOW INDEX FROM mytablename WHERE Column_name='mycolumnname' ;
dan verifikasi set hasil tidak kosong.pg_indexes
tampilan tidak memberikan nama kolom. postgresql.org/docs/current/view-pg-indexes.html\d table_name
menunjukkan informasi ini daripsql
, tetapi jika Anda ingin mendapatkan informasi tersebut dari database menggunakan SQL maka lihatlah Mengekstrak informasi META dari PostgreSQL .Saya menggunakan info tersebut di utilitas saya untuk melaporkan beberapa info dari skema db untuk membandingkan database PostgreSQL dalam lingkungan pengujian dan produksi.
sumber
\d table
tidak menampilkan indeks apa pun, namun\di
menampilkan semua indeks.\t
). Dengan "tuple only" aktif, saya tidak mendapatkan indeks dari\d
, dengan "tuple only" off, saya lakukan. Ini dengan psql (PostgreSQL) 9.6.15.Kerjakan saja:
\d table_name
Tetapi saya tidak yakin apa maksud Anda bahwa informasi tentang kolom tidak ada.
Sebagai contoh:
Ini jelas menunjukkan kolom mana yang diberikan indeks pada tabel ini.
sumber
\d index_name
memang memiliki informasi. Jadi saya bisa melihat indeks di atas meja, lalu mencari detailnya. Dengan tidak menunjukkan kolom yang saya maksud, saya melihat SQL yang dihasilkan oleh\d table
nama dan tidak jelas bagi saya dari mana daftar kolom berasal. Saya pikir ini sedang diurai keluar dari definisi indeks, yang saya lebih suka tidak melakukannya.\d table
tidak menampilkan indeks apa pun, namun\di
menampilkan semua indeks.# \di
Cara termudah dan terpendek adalah
\di
, yang akan mendaftar semua indeks dalam database saat ini.\di
adalah "saudara kecil" dari\d
perintah yang akan daftar semua hubungan arus d atabase. Jadi\di
tentu berdiri untuk "menunjukkan ini d atabases i ndexes".Mengetik
\diS
akan mencantumkan semua indeks yang digunakan di seluruh sistem, yang berarti Anda mendapatkan semua indeks pg_catalog juga.Dengan kedua perintah ini, Anda dapat menambahkan
+
setelahnya untuk mendapatkan informasi lebih lanjut seperti ukuran ruang disk yang diperlukan indeks dan deskripsi jika tersedia.Di psql Anda dapat dengan mudah menemukan bantuan tentang mengetik perintah
\?
.sumber
Dikombinasikan dengan kode orang lain dan membuat tampilan:
sumber
Beberapa data sampel ...
Gunakan
pg_get_indexdef
fungsi:sumber
Perintah ini juga menampilkan tampilan variabel tabel, indeks, dan batasan
Contoh:
sumber
\d tablename
menunjukkan nama kolom untuk saya di versi 8.3.8.sumber
HASIL QUERY:
PERTANYAAN:
sumber
Info mentah ada di pg_index .
sumber
indkey
: "Ini adalah array nilai indnatts yang menunjukkan kolom tabel mana yang indeks indeks ini. Misalnya nilai 1 3 akan berarti bahwa kolom tabel pertama dan ketiga membentuk kunci indeks. Nol dalam array ini menunjukkan bahwa atribut indeks yang sesuai adalah ekspresi di atas kolom tabel, daripada referensi kolom sederhana "Jika Anda ingin mempertahankan urutan kolom dalam indeks, berikut ini cara (yang sangat jelek) untuk melakukannya:
urutan kolom disimpan di kolom pg_index.indkey, jadi saya memesan oleh subskrip dari array itu.
sumber
Saat bermain-main dengan indeks urutan kolom yang dibangun dalam indeks sama pentingnya dengan kolom itu sendiri.
Kueri berikut mencantumkan semua indeks untuk tabel yang diberikan dan semua kolomnya dengan cara yang diurutkan.
sumber
i
untuk Ordinality sangat licin. Ini memastikan kolom dinyatakan dalam urutan yang benar.Silakan coba kueri di bawah ini untuk menelusuri indeks yang diperlukan
sumber
sumber
Inilah fungsi yang membungkus jawaban cope360:
Pemakaian:
sumber
Bagaimana dengan solusi sederhana:
`
sumber
'^[^\)]*\(([^\)]*)\).*$'
@ jawaban luar biasa cope360, dikonversi untuk menggunakan sintaks bergabung.
sumber
Saya rasa versi ini belum ada di utas ini: ia menyediakan daftar nama kolom beserta ddl untuk indeks.
Saya menemukan bahwa indeks menggunakan fungsi tidak menautkan ke nama kolom, jadi kadang-kadang Anda menemukan daftar indeks misalnya satu nama kolom padahal sebenarnya menggunakan 3.
Contoh:
Kueri mengembalikan hanya 'col3' sebagai kolom pada indeks, tetapi DDL menunjukkan set lengkap kolom yang digunakan dalam indeks.
sumber
Perluas jawaban yang baik dari @ Cope360. Untuk mendapatkan tabel tertentu (gunakan nama tabel yang sama tetapi skema yang berbeda), cukup gunakan tabel OID.
Jelaskan: Saya memiliki nama tabel 'tbassettype' di kedua skema 'dbAsset' dan 'dbLegal'. Untuk mendapatkan hanya tabel di dbLegal, biarkan a.attrelid = OID-nya.
sumber
Jawaban sedikit dimodifikasi dari @ cope360:
Ini akan menampilkan kolom indeks dalam urutan yang benar:
sumber
sumber
Jawaban yang diterima oleh @ cope360 baik, tetapi saya ingin sesuatu yang sedikit lebih seperti Oracle DBA_IND_COLUMNS, ALL_IND_COLUMNS, dan USER_IND_COLUMNS (misalnya, melaporkan skema tabel / indeks dan posisi indeks dalam indeks multikolom), jadi saya menyesuaikan penerimaan dalam indeks multikolom), jadi saya menyesuaikan yang diterima jawab ini:
Ini menghasilkan output seperti:
sumber