Apakah ada keuntungan untuk tidak menyelaraskan partisi indeks?

9

Saya memiliki hak istimewa mengelola tabel OLAP dipartisi besar. Saat meninjau tabel ini, saya perhatikan salah satu indeks tidak selaras dengan skema partisi. Karena penulis tidak tersedia dan pencarian Google yang dibuat dengan hati-hati belum memberikan hasil yang bermanfaat, saya tidak yakin apakah ini disengaja atau tidak disengaja.

Apakah ada alasan untuk tidak menyelaraskan partisi indeks pada SQL Server 2008?

Robin
sumber
1
Mungkin. Permintaan penggunaan statistik indeks Anda untuk melihat apakah indeks itu digunakan. Jika demikian, gunakan peristiwa yang diperluas atau penelusuran sisi server untuk menangkap kueri apa yang mencapai indeks itu. Jika mereka berkinerja lebih baik pada indeks yang disejajarkan dengan partisi, bagus. Jika tidak, periksa untuk melihat apakah mereka benar-benar membutuhkan indeks terpartisi yang tidak selaras. Jika tidak, saya akan mengatakan membuatnya partisi yang selaras karena pertanyaan di masa depan dapat memanfaatkannya. Tentu saja, jika biaya / upaya / pemadaman terlalu tinggi maka jangan.
Ali Razeghi
Dari apa yang saya baca praktik terbaik untuk mengindeks tabel yang dipartisi adalah menyelaraskan indeks dengan skema partisi. Tabel khusus ini membuat saya berpikir bahwa saya ingin memahami use case untuk tidak menyelaraskan indeks dengan skema partisi. Saya tidak mencoba untuk menyelesaikan masalah tertentu jadi saya tidak punya pertanyaan yang perlu dianalisis.
Robin
Alasan lain untuk merancang indeks yang tidak selaras adalah indeks unik (termasuk kunci primer atau batasan unik) yang tidak termasuk kolom partisi. Dalam hal ini, indeks tidak boleh dipartisi sama sekali atau dipartisi menggunakan fungsi / skema yang berbeda.
Dan Guzman

Jawaban:

11

Keuntungan utama dari tidak partisi (non-unik) indeks pada objek dasar dipartisi adalah bahwa ia bekerja di sekitar keterbatasan query optimizer lama terkait dengan permintaan data memerintahkan seperti MIN, MAXatau TOP (n)query.

Pada indeks dipartisi, optimizer umumnya tidak dapat menerjemahkan MIN,, MAXatau TOP (n)ke operasi yang sama per partisi , diikuti oleh agregat global akhir atas agregat parsial per-partisi. Pengoptimal memilih rencana eksekusi yang memindai semua partisi indeks. Pengecualian untuk ini adalah kasus tunggal di mana operasi agregat atau teratas ditentukan di atas kolom partisi.

Saya harus menyebutkan bahwa ada juga alasan yang sangat bagus untuk tidak memiliki indeks yang tidak selaras. Memilih untuk menggunakan indeks yang tidak selaras harus menjadi pilihan yang sangat informatif. Saya telah melakukannya sendiri (jarang) di masa lalu, tetapi dalam keadaan yang sangat spesifik di mana manfaatnya jelas melebihi biaya, atau tidak ada alternatif lain yang masuk akal.


Artikel oleh Itzik Ben-Gan menjelaskan masalah ini.

Paul White 9
sumber
3

Ada masalah nyata seputar beberapa kendala (mis. Unik) yang membutuhkan indeks tidak selaras.

Selain itu indeks yang tidak selaras memiliki biaya yang besar (terutama mereka mencegah banyak operator paralel untuk menggunakan thread-per-partisi dan alternatifnya adalah memori mahal) dan dengan demikian saya akan sangat menyarankan terhadap indeks tersebut. Bahkan dengan kasus-kasus yang didaftar oleh Paul, saya masih menyarankan agar indeks tidak selaras.

Remus Rusanu
sumber
1
Iya. Memilih indeks yang tidak selaras harus menjadi pilihan yang sangat informatif. Saya telah melakukannya sendiri (jarang) di masa lalu, tetapi dalam situasi yang sangat spesifik di mana manfaatnya melebihi biaya.
Paul White 9
2

Indeks yang tidak selaras meniadakan manfaat utama dari partisi yang mengganti partisi. Jika Anda tidak bergantung pada itu dan mempartisi karena alasan lain (penyimpanan yang berbeda, partisi hanya baca, statistik tambahan, ...) maka lanjutkan dan buat indekseks yang tidak selaras.

Indeks yang tidak selaras berguna karena Anda dapat menerapkan batasan unik pada seluruh tabel dengannya. Juga, indeks tidak selaras tidak memerlukan kunci partisi untuk menjadi awalan pencarian implisit. Bayangkan memiliki 10.000 partisi dan permintaan tidak berdasarkan pada kunci partisi. Rencana eksekusi kemudian harus mencari ke 10.000 partisi jika indeks selaras. Jawaban lain memiliki contoh lebih lanjut.

usr
sumber