Bagaimana cara saya mendapatkan daftar semua kolom indeks & indeks di SQL Server 2005+? Yang paling dekat yang bisa saya dapatkan adalah:
select s.name, t.name, i.name, c.name from sys.tables t
inner join sys.schemas s on t.schema_id = s.schema_id
inner join sys.indexes i on i.object_id = t.object_id
inner join sys.index_columns ic on ic.object_id = t.object_id
inner join sys.columns c on c.object_id = t.object_id and
ic.column_id = c.column_id
where i.index_id > 0
and i.type in (1, 2) -- clustered & nonclustered only
and i.is_primary_key = 0 -- do not include PK indexes
and i.is_unique_constraint = 0 -- do not include UQ
and i.is_disabled = 0
and i.is_hypothetical = 0
and ic.key_ordinal > 0
order by ic.key_ordinal
Yang tidak persis seperti yang saya inginkan.
Yang saya inginkan adalah, untuk mendaftar semua indeks yang ditentukan pengguna, ( yang berarti tidak ada indeks yang mendukung batasan unik & kunci utama ) dengan semua kolom (diperintahkan oleh bagaimana mereka muncul dalam definisi indeks) ditambah metadata sebanyak mungkin.
sql-server
tsql
indexing
reverse-engineering
Anton Gogolev
sumber
sumber
Jawaban:
Ada dua tampilan katalog "sys" yang dapat Anda lihat:
Itu akan memberi Anda hampir semua info yang Anda inginkan tentang indeks dan kolom mereka.
EDIT: Permintaan ini semakin mendekati apa yang Anda cari:
sumber
is_ms_shipped=0
), tetapi tidak ada kunci primer (is_primary_key=0
) dan tidak ada indeks yang dibuat hanya untuk mendukung batasan unik (is_unique_constraint=0
).WHERE (1=1)
biarkan dia rantai dan menyusun ulangAND ...
tanpa khawatir tentang yang pertama. Lihat: stackoverflow.com/a/8149183/1160796 dan stackoverflow.com/a/242831/1160796Anda dapat menggunakan
sp_helpindex
untuk melihat semua indeks dari satu tabel.Dan untuk semua indeks, Anda dapat melintasi
sys.objects
untuk mendapatkan semua indeks untuk setiap tabel.sumber
Tidak ada satu pun di atas yang berhasil bagi saya, tetapi ini berhasil:
Jika nama Anda menyertakan spasi, tambahkan tanda kurung di sekitarnya dalam skrip pembuatan.
Ketika kolom Kunci terakhir adalah nol, Anda tahu bahwa tidak ada yang hilang.
Memfilter kunci primer dll seperti dalam permintaan asli adalah sepele.
CATATAN: Hati-hati dengan solusi ini karena tidak membedakan kolom yang diindeks dan termasuk.
sumber
--Pendek dan manis:
sumber
Berikut ini berfungsi pada SQL Server 2014/2016 serta Database Microsoft Azure SQL.
Menghasilkan himpunan hasil komprehensif yang mudah diekspor ke Notepad / Excel untuk diiris dan dicing serta disertakan
sumber
Hai teman-teman, saya tidak melalui tapi saya mendapatkan apa yang saya inginkan dalam permintaan yang diposting oleh penulis asli.
Saya menggunakannya (tanpa syarat / filter) untuk kebutuhan saya tetapi memberikan hasil yang salah
Masalah utama adalah hasil mendapatkan produk silang tanpa syarat bergabung di index_id
sumber
Saya perlu mendapatkan indeks tertentu, kolom indeks mereka dan kolom yang disertakan juga. Berikut ini pertanyaan yang saya gunakan:
sumber
SELECT
untuk menghasilkanCREATE
pernyataan:,CreateStatement = 'CREATE INDEX [' + INX.[name] + '] ON dbo.[' + TBL.[name] + '] (' + REPLACE(DS1.IndexColumnsNames, '] [', '], [') + ')' + CASE WHEN DS2.IncludedColumnsNames IS NOT NULL THEN ' INCLUDE (' + REPLACE(DS2.IncludedColumnsNames, '] [', '], [') + ')' ELSE '' END
.Berikut memberi apa yang sama seperti sp_helpindex tablename
sumber
Berdasarkan jawaban yang diterima dan dua pertanyaan lain 1 , 2 saya telah mengumpulkan pertanyaan berikut:
Kueri ini mengembalikan hasil seperti di bawah ini yang menunjukkan daftar indeks, kolom dan penggunaannya. Sangat membantu dalam menentukan indeks mana yang berkinerja lebih baik daripada yang lain:
sumber
ini akan bekerja:
ini tidak mengembalikan nama tabel dan Anda akan mendapatkan peringatan untuk semua tabel tanpa indeks, jika itu merupakan masalah, Anda dapat membuat lingkaran di atas tabel yang memiliki indeks seperti ini:
Sunting
jika Anda mau, Anda bisa memfilter data, berikut adalah beberapa contoh (ini berfungsi untuk metode mana pun):
sumber
sumber
index_column_id
adalah tidak urutan kolom dalam PK tetapi dalam tabel! Gunakankey_ordinal
sebagai gantinya.Ini adalah cara untuk mendukung indeks. Anda dapat menggunakan SHOWCONTIG untuk menilai fragmentasi. Ini akan mencantumkan semua indeks untuk database atau tabel, bersama dengan statistik. Saya akan mengingatkan bahwa pada basis data yang besar, bisa berjalan lama. Bagi saya, salah satu manfaat dari pendekatan ini adalah Anda tidak perlu menjadi admin untuk menggunakannya.
--Tampilkan info fragmentasi pada semua indeks dalam database
... Matikan NOCOUNT kembali setelah selesai
--Tampilkan info fragmentasi pada semua indeks di atas meja
--Tampilkan informasi fragmentasi pada indeks tertentu
sumber
Bolehkah saya membahayakan jawaban lain untuk pertanyaan jenuh ini?
Ini adalah pengerjaan ulang jawaban @marc_s secara bebas, dicampur dengan beberapa hal dari @Tim Ford, dengan tujuan memiliki sedikit hasil yang lebih bersih dan sederhana serta tampilan akhir dan pemesanan untuk kebutuhan saya saat ini.
sumber
berdasarkan kode Tim Ford, ini adalah jawaban yang benar:
sumber
index_column_id
adalah tidak urutan kolom dalam PK tetapi dalam tabel! Gunakankey_ordinal
sebagai gantinya.Saya datang dengan yang satu ini, yang memberi saya gambaran persis yang saya butuhkan. Apa yang membantu adalah bahwa Anda mendapatkan satu baris per indeks di mana kolom indeks dikumpulkan.
sumber
Karena profil Anda menyatakan bahwa Anda menggunakan .NET, Anda dapat menggunakan Server Managed Objects (SMO) secara terprogram ... jika tidak, salah satu dari jawaban di atas fantastis.
sumber
Solusi di atas elegan, tetapi menurut MS, INDEXKEY_PROPERTY sedang ditinggalkan. Lihat: http://msdn.microsoft.com/en-us/library/ms186773.aspx
sumber
Di Oracle
Dalam SQL Server dengan
sumber
Perlu diketahui bahwa jika Anda akan menggunakan salah satu dari kueri yang berfungsi di atas untuk skrip indeks Anda, Anda perlu memasukkan kolom filter_definition dari tabel sys.indexes dalam permintaan Anda untuk mendapatkan definisi filter dari indeks non-clustered di SQL 2008+
SAYA
sumber
Kueri di bawah ini mencakup semua informasi terkait untuk indeks yang ditentukan pengguna, (tidak ada indeks untuk batasan unik & kunci utama) dengan semua kolom:
Sebagai bonus tambahan, kueri di bawah ini diformat untuk menuliskan skrip indeks buat dan lepas:
sumber
Ini milik saya, bekerja pada satu skema default tetapi dapat dengan mudah ditingkatkan. Ini memberikan 3 kolom dengan SQLQueries - Create / Drop / Rebuild (no reorganizing)
Pertanyaan:
Keluaran
sumber
Pertama, harap perhatikan bahwa semua kueri di atas mungkin ketinggalan atau salah memasukkan kolom TERMASUK dari indeks. Yang juga hilang dalam beberapa adalah opsi pemesanan dan / atau ASC / DESC yang tepat pada kolom.
Dimodifikasi kueri di atas oleh jona. Selain itu, di banyak basis data yang saya gunakan, saya menginstal fungsi agregat CLR CONCATENATE saya sendiri, jadi kode di bawah ini tergantung pada sesuatu seperti ini yang ada. Pernyataan SQL di atas mengurangi menjadi jauh lebih mudah dikelola:
Ada banyak agregat gabungan di luar sana jika lingkungan Anda mengizinkan fungsi berbasis CLR ditambahkan padanya.
sumber
Untuk kolom unik per indeks:
sumber
Inilah cara terbaik untuk melakukannya:
Saya lebih suka menggunakan gabungan implisit karena jauh lebih mudah bagi saya untuk mengerti. Anda dapat menghapus referensi object_id karena Anda mungkin tidak membutuhkannya.
Bersulang.
sumber
Menggunakan SQL Server 2016, ini memberikan daftar lengkap dari semua indeks, dengan dump termasuk setiap tabel sehingga Anda dapat melihat bagaimana tabel berhubungan. Itu juga menunjukkan kolom termasuk dalam indeks meliputi:
sumber
index_column_id
adalah tidak urutan kolom dalam PK tetapi dalam tabel! Gunakankey_ordinal
sebagai gantinya.Saya telah menggunakan permintaan berikut ketika saya memiliki persyaratan ini ...
sumber
Solusi yang berfungsi untuk SQL Server 2014. Saya hanya menyertakan beberapa bidang output di sini tapi jangan ragu untuk menambahkan sebanyak yang Anda suka.
sumber
index_column_id
adalah tidak urutan kolom dalam PK tetapi dalam tabel! Gunakankey_ordinal
sebagai gantinya.Saya memberi jawaban KFD9 pembaruan.
Saya mengadaptasi versi mereka untuk mendukung spesifikasi-sertakan dan tidak menggunakan indexkey_property yang sudah usang
Ini memberi Anda pernyataan buat dan jatuhkan untuk indeks dan batasan.
sumber
sumber
index_column_id
adalah tidak urutan kolom dalam PK tetapi dalam tabel! Gunakankey_ordinal
sebagai gantinya.