Create Index v Indo

18
CREATE INDEX SQL Server 2000 61 dari 75 dinilai ini bermanfaat - Beri topik ini Topik terakhir diperbaharui - Juli 2003 Membuat index pada tabel tertentu atau melihat. Hanya pemilik tabel atau melihat dapat membuat indeks di atas meja itu. Pemilik sebuah tabel atau view dapat membuat indeks setiap saat, apakah atau tidak ada data dalam tabel. Indeks dapat dibuat pada tabel atau dilihat dalam database lain dengan menentukan nama database yang berkualitas. Sintaksis MENCIPTAKAN [UNIK] [Clustered | nonclustered] INDEX nama_index ON {table | tampilan} (kolom [ASC | DESC] [, ... n]) [DENGAN <index_option> [, ... n]] [ON filegroup] <Index_option> :: = {PAD_INDEX | FILLFACTOR = fillfactor | IGNORE_DUP_KEY | DROP_EXISTING | STATISTICS_NORECOMPUTE | SORT_IN_TEMPDB } Argumen UNIK Menciptakan indeks yang unik (satu di mana tidak ada dua baris yang diizinkan untuk memiliki nilai indeks yang sama) pada tabel atau view. Sebuah indeks berkerumun di pandangan harus UNIK.

Transcript of Create Index v Indo

Page 1: Create Index v Indo

CREATE INDEX SQL Server 2000 61 dari 75 dinilai ini bermanfaat - Beri topik ini

Topik terakhir diperbaharui - Juli 2003

Membuat index pada tabel tertentu atau melihat.

Hanya pemilik tabel atau melihat dapat membuat indeks di atas meja itu. Pemilik sebuah tabel atau view dapat membuat indeks setiap saat, apakah atau tidak ada data dalam tabel. Indeks dapat dibuat pada tabel atau dilihat dalam database lain dengan menentukan nama database yang berkualitas.

Sintaksis

MENCIPTAKAN [UNIK] [Clustered | nonclustered] INDEX nama_index ON {table | tampilan} (kolom [ASC | DESC] [, ... n]) [DENGAN <index_option> [, ... n]] [ON filegroup]

<Index_option> :: = {PAD_INDEX |      FILLFACTOR = fillfactor |      IGNORE_DUP_KEY |      DROP_EXISTING | STATISTICS_NORECOMPUTE | SORT_IN_TEMPDB }

Argumen

UNIK

Menciptakan indeks yang unik (satu di mana tidak ada dua baris yang diizinkan untuk memiliki nilai indeks yang sama) pada tabel atau view. Sebuah indeks berkerumun di pandangan harus UNIK.

Microsoft ® SQL Server ™ memeriksa nilai-nilai duplikat ketika indeks dibuat (jika data yang sudah ada) dan memeriksa setiap data waktu ditambah dengan pernyataan INSERT atau UPDATE. Jika nilai-nilai kunci duplikat ada, pernyataan CREATE INDEX dibatalkan dan pesan kesalahan memberikan duplikat pertama dikembalikan. Beberapa nilai NULL dianggap duplikat bila indeks UNIK dibuat.

Page 2: Create Index v Indo

Ketika indeks yang unik ada, UPDATE atau INSERT yang akan menghasilkan nilai-nilai kunci duplikat digulung kembali, dan SQL Server menampilkan pesan kesalahan. Hal ini berlaku bahkan jika UPDATE atau INSERT perubahan pernyataan banyak baris tetapi menyebabkan hanya satu duplikat. Jika dilakukan usaha untuk memasukkan data yang ada indeks yang unik dan klausul IGNORE_DUP_KEY ditetapkan, hanya baris melanggar indeks gagal UNIK. Ketika memproses pernyataan UPDATE, IGNORE_DUP_KEY tidak berpengaruh.

SQL Server tidak mengizinkan penciptaan indeks yang unik pada kolom yang sudah termasuk nilai-nilai duplikat, apakah atau tidak IGNORE_DUP_KEY diatur. Jika dicoba, SQL Server menampilkan pesan kesalahan, duplikat harus dihilangkan sebelum indeks yang unik dapat dibuat pada kolom (s).

Clustered

Menciptakan sebuah objek di mana tatanan fisik baris adalah sama dengan urutan diindeks dari baris, dan bagian bawah (daun) tingkat clustered index berisi baris data aktual. Sebuah tabel atau view diperbolehkan satu clustered index pada suatu waktu.

Pandangan dengan clustered index disebut sebuah indexed view. Sebuah clustered index yang unik harus dibuat pada pandangan sebelum indeks lainnya dapat didefinisikan pada pandangan yang sama.

Buat indeks berkerumun sebelum membuat setiap indeks nonclustered. Indeks nonclustered ada pada tabel kembali ketika clustered index dibuat.

Jika Clustered tidak ditentukan, indeks nonclustered dibuat.

Catatan Karena tingkat daun indeks berkerumun dan halaman data adalah sama dengan definisi, membuat indeks berkerumun dan menggunakan klausa ON filegroup efektif bergerak tabel dari file yang meja diciptakan untuk filegroup baru. Sebelum membuat tabel atau indeks pada filegroups tertentu, pastikan yang filegroups yang tersedia dan bahwa mereka memiliki cukup ruang kosong untuk indeks. Adalah penting bahwa filegroup memiliki setidaknya 1,2 kali ruang yang diperlukan untuk seluruh tabel.

Nonclustered

Menciptakan objek yang menentukan urutan logis dari meja. Dengan indeks nonclustered, tatanan fisik dari baris adalah independen dari pesanan mereka diindeks. Tingkat daun indeks nonclustered berisi baris indeks. Setiap baris index berisi nilai kunci nonclustered dan satu atau lebih baris pencari yang mengarah ke baris yang berisi nilai. Jika tabel tidak memiliki indeks berkerumun, baris locator adalah alamat disk baris itu. Jika tabel tidak memiliki indeks berkerumun, baris locator adalah kunci clustered index untuk baris.

Setiap tabel dapat memiliki sebanyak 249 nonclustered indeks (terlepas dari bagaimana mereka diciptakan: implisit dengan KEY kendala dan UNIK PRIMARY, atau eksplisit dengan membuat indeks). Setiap indeks dapat menyediakan akses ke data dalam urutan berbeda.

Page 3: Create Index v Indo

Untuk indexed views, indeks nonclustered dapat dibuat hanya pada pandangan dengan indeks berkerumun sudah didefinisikan. Dengan demikian, baris locator dari indeks nonclustered pada pandangan diindeks selalu kunci berkerumun baris.

INDEX_NAME

Apakah nama indeks. Indeks nama harus unik dalam tabel atau view namun tidak perlu menjadi unik dalam database. Indeks nama harus mengikuti aturan pengenal.

tabel

Adalah tabel yang berisi kolom atau kolom yang akan diindeks. Menentukan database dan nama tabel pemilik adalah opsional.

melihat

Apakah nama tampilan untuk diindeks. Pandangan harus didefinisikan dengan SCHEMABINDING untuk membuat indeks di atasnya. Pandangan Definisi juga harus deterministik. Pandangan adalah deterministik jika semua ekspresi dalam daftar pilih, dan WHERE dan GROUP BY klausa yang deterministik. Juga, semua kolom kunci harus tepat. Hanya nonkey kolom dari pandangan mungkin berisi ekspresi mengambang (ekspresi yang menggunakan tipe data float), dan ekspresi mengambang tidak dapat digunakan di tempat lain dalam definisi tampilan.

Untuk menemukan kolom dalam tampilan yang deterministik, gunakan fungsi COLUMNPROPERTY (properti IsDeterministic). The IsPrecise milik fungsi tersebut dapat digunakan untuk menentukan bahwa kolom kunci yang tepat.

Sebuah clustered index yang unik harus dibuat pada pandangan sebelum indeks nonclustered dibuat.

Indexed views dapat digunakan oleh query optimizer di SQL Server Enterprise untuk mempercepat eksekusi query. Pandangan tidak perlu dirujuk dalam query untuk optimizer untuk mempertimbangkan bahwa tampilan untuk substitusi. Untuk menggunakan sebuah indexed view di semua edisi lain, petunjuk NOEXPAND harus digunakan.

Ketika membuat indexed views atau memanipulasi baris dalam tabel berpartisipasi dalam pandangan diindeks, tujuh pilihan SET harus diberi nilai-nilai tertentu. SET Pilihan ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER, ANSI_NULLS, ANSI_PADDING, dan ANSI_WARNINGS harus ON. SET Pilihan NUMERIC_ROUNDABORT harus OFF.

Jika salah satu pengaturan ini berbeda, laporan modifikasi data (INSERT, UPDATE, DELETE) pada setiap meja direferensikan oleh pandangan gagal diindeks dan SQL Server menimbulkan kesalahan daftar semua opsi SET yang melanggar pengaturan persyaratan. Selain itu, untuk pernyataan SELECT yang melibatkan sebuah indexed view, jika nilai salah satu pilihan SET

Page 4: Create Index v Indo

bukanlah nilai yang diperlukan, SQL Server memproses SELECT tanpa mempertimbangkan pandangan substitusi diindeks. Hal ini menjamin ketepatan hasil query dalam kasus di mana hal itu dapat dipengaruhi oleh pilihan SET atas.

Jika aplikasi menggunakan koneksi DB-Library, semua tujuh pilihan SET di server harus diberi nilai yang diperlukan. (Secara default, OLE DB dan koneksi ODBC telah mengatur semua opsi SET diperlukan dengan benar, kecuali ARITHABORT.)

Beberapa operasi, seperti BCP, replikasi, atau didistribusikan permintaan mungkin gagal dalam menjalankan update mereka terhadap tabel berpartisipasi dalam pandangan diindeks jika tidak semua pilihan SET terdaftar memiliki nilai yang diminta. Pada kebanyakan kasus, masalah ini dapat dicegah dengan menetapkan ARITHABORT ke ON (melalui pilihan pengguna dalam pilihan konfigurasi server).

Sangat disarankan bahwa pilihan pengguna ARITHABORT diatur server-lebar untuk ON segera setelah tampilan pertama diindeks atau indeks pada kolom dihitung dibuat dalam database pada server.

Lihat bagian Keterangan Untuk informasi lebih lanjut tentang pertimbangan dan pembatasan indexed views.

kolom

Apakah kolom atau kolom yang indeks berlaku. Tentukan dua atau lebih nama kolom untuk membuat indeks komposit pada nilai-nilai gabungan dalam kolom tertentu. Daftar kolom untuk dimasukkan dalam indeks komposit (dalam urutan prioritas) dalam tanda kurung setelah meja.

Kolom Catatan terdiri dari ntext, teks, atau jenis data gambar tidak dapat ditetapkan sebagai kolom untuk indeks. Selain itu, pandangan tidak dapat menyertakan teks, ntext, atau kolom gambar, bahkan jika mereka tidak disebutkan dalam pernyataan CREATE INDEX.

Indeks komposit digunakan ketika dua atau lebih kolom yang paling dicari sebagai sebuah unit atau jika banyak pertanyaan referensi hanya kolom yang ditentukan dalam indeks. Sebanyak 16 kolom dapat dikombinasikan menjadi suatu indeks komposit tunggal. Semua kolom dalam indeks komposit harus di meja yang sama. Ukuran maksimum yang diijinkan dari nilai indeks gabungan adalah 900 byte. Artinya, jumlah panjang dari kolom berukuran tetap yang membentuk indeks komposit tidak dapat melebihi 900 byte. Untuk informasi lebih lanjut tentang kolom jenis variabel dalam indeks komposit, lihat bagian Keterangan.

[ASC | DESC]

Menentukan arah semacam menaik atau menurun untuk kolom indeks tertentu. Standarnya adalah ASC.

n

Page 5: Create Index v Indo

Adalah sebuah tempat yang menunjukkan bahwa beberapa kolom s dapat ditentukan untuk setiap indeks tertentu.

PAD_INDEX

Menentukan ruang untuk meninggalkan terbuka pada setiap halaman (node) di tingkat menengah indeks. Pilihan PAD_INDEX hanya berguna bila FILLFACTOR ditentukan, karena PAD_INDEX menggunakan persentase yang ditentukan oleh FILLFACTOR. Secara default, SQL Server memastikan bahwa setiap halaman indeks memiliki cukup ruang kosong untuk menampung setidaknya satu baris dari ukuran maksimum indeks dapat memiliki, mengingat set kunci pada halaman menengah. Jika persentase yang ditentukan untuk FILLFACTOR tidak cukup besar untuk menampung satu baris, SQL Server internal menimpa persentase untuk memungkinkan minimum.

Catatan Jumlah baris pada halaman indeks menengah tidak pernah kurang dari dua, terlepas dari bagaimana nilai FILLFACTOR rendah.

FILLFACTOR = fillfactor

Menentukan persentase yang menunjukkan bagaimana penuh SQL Server harus membuat tingkat daun setiap halaman indeks saat pembuatan indeks. Ketika halaman indeks mengisi, SQL Server harus meluangkan waktu untuk membagi halaman indeks untuk membuat ruang untuk baris baru, yang cukup mahal. Untuk tabel update-intensif, nilai FILLFACTOR dipilih dengan benar menghasilkan kinerja yang lebih baik daripada pembaruan nilai FILLFACTOR tidak tepat. Nilai dari FILLFACTOR asli disimpan dengan indeks di sysindexes.

Ketika FILLFACTOR ditentukan, SQL Server putaran atas jumlah baris untuk ditempatkan pada setiap halaman. Misalnya, menerbitkan CREATE INDEX Clustered ... FILLFACTOR = 33 membuat clustered index dengan FILLFACTOR dari 33 persen. Asumsikan bahwa SQL Server menghitung bahwa 5,2 baris adalah 33 persen dari ruang pada halaman. SQL Server putaran sehingga enam baris ditempatkan pada setiap halaman.

Perhatikan Pengaturan FILLFACTOR eksplisit berlaku hanya ketika indeks tersebut pertama kali diciptakan. SQL Server tidak secara dinamis menjaga persentase tertentu dari ruang kosong di halaman.

Nilai FILLFACTOR ditentukan pengguna dapat dari 1 sampai 100. Jika tidak ada nilai yang ditentukan, default adalah 0. Ketika FILLFACTOR diatur ke 0, hanya halaman daun diisi. Anda dapat mengubah pengaturan default FILLFACTOR dengan mengeksekusi sp_configure.

Gunakan FILLFACTOR dari 100 hanya jika ada INSERT atau UPDATE laporan akan terjadi, seperti dengan meja read-only. Jika FILLFACTOR adalah 100, SQL Server menciptakan indeks dengan halaman daun 100 persen penuh. INSERT atau UPDATE dilakukan setelah penciptaan indeks dengan halaman penyebab persen FILLFACTOR 100 split untuk setiap INSERT dan mungkin setiap UPDATE.

Page 6: Create Index v Indo

Nilai FILLFACTOR kecil, kecuali 0, menyebabkan SQL Server untuk membuat indeks baru dengan halaman daun yang tidak benar-benar penuh. Misalnya, FILLFACTOR dari 10 dapat menjadi pilihan yang masuk akal ketika membuat indeks di atas meja diketahui mengandung sebagian kecil dari data bahwa pada akhirnya akan terus. Nilai FILLFACTOR lebih kecil juga menyebabkan setiap indeks untuk mengambil lebih banyak ruang penyimpanan.

Tabel berikut menggambarkan bagaimana halaman-halaman indeks diisi kalau FILLFACTOR ditentukan.

FILLFACTOR Halaman Menengah Halaman daun

0 persen Satu masuk gratis 100 persen penuh

1-99 persen Satu masuk gratis <= FILLFACTOR persen penuh

100 persen Satu masuk gratis 100 persen penuh

Satu gratis masuk adalah ruang pada halaman yang dapat menampung entri indeks lain.

Penting Membuat clustered index dengan FILLFACTOR yang mempengaruhi jumlah ruang penyimpanan data menempati karena SQL Server mendistribusikan data ketika menciptakan indeks berkerumun.

IGNORE_DUP_KEY

Kontrol apa yang terjadi ketika dilakukan usaha untuk memasukkan nilai kunci duplikat ke dalam kolom yang merupakan bagian dari indeks berkerumun unik. Jika IGNORE_DUP_KEY ditentukan untuk indeks dan pernyataan INSERT yang menciptakan kunci duplikat dijalankan, masalah SQL Server peringatan dan mengabaikan duplikat baris.

Jika IGNORE_DUP_KEY tidak ditentukan untuk indeks, masalah SQL Server pesan kesalahan dan memutar kembali pernyataan INSERT seluruh.

Tabel menunjukkan kapan IGNORE_DUP_KEY dapat digunakan.

Jenis Indeks Pilihan

Clustered Tidak diizinkan

Unik berkerumun IGNORE_DUP_KEY diperbolehkan

Nonclustered Tidak diizinkan

Unik nonclustered IGNORE_DUP_KEY diperbolehkan

DROP_EXISTING

Menentukan bahwa bernama, yang sudah ada sebelumnya bergerombol atau nonclustered indeks harus turun dan dibangun kembali. Nama indeks yang ditetapkan harus sama sebagai indeks

Page 7: Create Index v Indo

yang ada saat ini. Karena indeks nonclustered berisi kunci clustering, indeks nonclustered harus dibangun kembali ketika clustered index dijatuhkan. Jika clustered index diciptakan, indeks nonclustered harus dibangun kembali untuk mengambil set baru kunci ke rekening.

Klausa DROP_EXISTING meningkatkan kinerja ketika menciptakan kembali indeks berkerumun (dengan baik sama atau satu set kunci yang berbeda) di atas meja yang juga nonclustered indeks. Klausa DROP_EXISTING menggantikan eksekusi pernyataan DROP INDEX pada tua berkerumun indeks diikuti dengan pelaksanaan pernyataan CREATE INDEX untuk berkerumun indeks baru. Indeks nonclustered dibangun kembali sekali, dan hanya jika tombol yang berbeda.

Jika tombol tidak berubah (nama indeks yang sama dan kolom sebagai indeks asli disediakan), klausa DROP_EXISTING tidak mengurutkan data lagi. Hal ini dapat berguna jika indeks harus dipadatkan.

Sebuah clustered index tidak dapat dikonversi ke indeks nonclustered menggunakan klausa DROP_EXISTING, namun indeks berkerumun unik dapat diubah ke indeks non-unik, dan sebaliknya.

Catatan Ketika mengeksekusi pernyataan CREATE INDEX dengan klausa DROP_EXISTING, SQL Server mengasumsikan bahwa indeks konsisten, yaitu, tidak ada korupsi dalam indeks. Baris dalam indeks yang ditetapkan harus diurutkan berdasarkan kunci tertentu yang dirujuk dalam pernyataan CREATE INDEX.

STATISTICS_NORECOMPUTE

Menentukan bahwa statistik indeks out-of-date tidak secara otomatis menghitung ulang. Untuk mengembalikan statistik otomatis memperbarui, jalankan UPDATE STATISTIK tanpa klausul NORECOMPUTE.

Penting Menonaktifkan recomputation otomatis statistik distribusi dapat mencegah SQL Server query optimizer dari memilih rencana eksekusi yang optimal untuk query yang melibatkan meja.

SORT_IN_TEMPDB

Menentukan bahwa hasil semacam antara yang digunakan untuk membangun indeks akan disimpan dalam database tempdb. Pilihan ini dapat mengurangi waktu yang dibutuhkan untuk membuat indeks jika tempdb pada disk yang berbeda dari database pengguna, tetapi meningkatkan jumlah ruang disk yang digunakan selama indeks membangun.

Untuk informasi lebih lanjut, lihat tempdb dan Penciptaan Index .

ON filegroup

Menciptakan indeks tertentu pada filegroup yang diberikan. Filegroup harus telah dibuat dengan menjalankan baik MENCIPTAKAN DATABASE atau ALTER DATABASE.

Page 8: Create Index v Indo

Keterangan

Ruang yang dialokasikan untuk tabel dan indeks dengan kenaikan satu tingkat (delapan halaman 8-kilobyte) pada suatu waktu. Setiap kali rupa diisi, yang lain dialokasikan. Indeks pada tabel yang sangat kecil atau kosong akan menggunakan alokasi halaman sampai delapan halaman telah ditambahkan ke indeks dan kemudian akan beralih ke alokasi batas. Untuk laporan pada jumlah ruang yang dialokasikan dan digunakan oleh indeks, gunakan sp_spaceused.

Membuat indeks berkerumun di meja (tumpukan) atau clustered index yang ada membutuhkan ruang kerja tambahan yang tersedia dalam database Anda untuk mengakomodasi menyortir data dan salinan sementara dari tabel asli atau data clustered index yang ada. Anda akan membutuhkan kerja minimal sama dengan 1,2 kali ukuran tumpukan atau clustered index yang ada. Sebuah nilai faktor pengisian kurang dari 100 akan membutuhkan lebih banyak ruang daripada faktor 1.2. Setelah indeks telah dibuat, setiap ruang tidak diperlukan oleh indeks berkerumun baru dirilis.Untuk informasi tentang menghitung ukuran tabel dengan indeks berkerumun, melihat Memperkirakan Ukuran Tabel dengan indeks Clustered .

Ketika membuat indeks di SQL Server 2000, Anda dapat menggunakan opsi SORT_IN_TEMPDB untuk mengarahkan mesin database untuk menyimpan hasil antara semacam indeks tempdb . Pilihan ini dapat mengurangi waktu yang dibutuhkan untuk membuat indeks jika tempdb adalah pada satu set yang berbeda dari disk dari database pengguna, tetapi meningkatkan jumlah ruang disk yang digunakan untuk membuat indeks. Selain ruang yang dibutuhkan dalam database pengguna untuk membuat indeks, tempdb harus memiliki sekitar jumlah yang sama ruang tambahan untuk memegang hasil semacam menengah. Untuk informasi lebih lanjut, lihat tempdb dan Penciptaan Index .

CREATE INDEX Pernyataan dioptimalkan seperti permintaan lainnya. SQL Server query processor dapat memilih untuk memindai indeks lain bukannya melakukan scan meja untuk menghemat I / O operasi. Semacam ini dapat dihilangkan dalam beberapa situasi.

Pada komputer multiprosesor pada SQL Server Enterprise dan Edisi Pengembang, CREATE INDEX otomatis menggunakan prosesor yang lebih untuk melakukan scan dan semacam, dalam cara yang sama seperti pertanyaan lain lakukan. Jumlah prosesor yang digunakan untuk mengeksekusi pernyataan CREATE INDEX tunggal ditentukan oleh pilihan konfigurasi tingkat maks paralelisme serta beban kerja saat ini. Jika SQL Server mendeteksi bahwa sistem sedang sibuk, derajat paralelisme dari operasi CREATE INDEX secara otomatis dikurangi sebelum eksekusi pernyataan dimulai.

Filegroups Seluruh dipengaruhi oleh pernyataan CREATE INDEX sejak backup filegroup terakhir harus didukung sebagai satu unit. Untuk informasi lebih lanjut tentang file dan backup filegroup, lihat CADANGAN .

Backup dan MENCIPTAKAN operasi INDEX tidak memblokir satu sama lain. Jika cadangan sedang berlangsung, indeks dibuat dalam modus sepenuhnya masuk, yang mungkin memerlukan ruang log ekstra.

Untuk menampilkan laporan tentang indeks obyek, mengeksekusi sp_helpindex .

Page 9: Create Index v Indo

Indeks dapat dibuat di atas meja sementara. Ketika tabel dijatuhkan atau sesi berakhir, semua indeks dan pemicu yang dijatuhkan.

Kolom jenis variabel dalam indeks

Ukuran maksimum yang diperbolehkan untuk kunci indeks 900 byte, tetapi SQL Server 2000 memungkinkan indeks akan dibuat pada kolom yang mungkin memiliki kolom besar jenis variabel dengan ukuran maksimum lebih besar dari 900 byte.

Selama pembuatan indeks, SQL Server akan memeriksa kondisi berikut:

Jumlah semua kolom data tetap yang berpartisipasi dalam definisi indeks harus kurang atau sama dengan 900 byte. Ketika indeks yang akan dibuat terdiri dari hanya kolom data tetap, ukuran total dari kolom data tetap harus kurang atau sama dengan 900 byte. Jika tidak, indeks tidak akan dibuat dan SQL Server akan kembali kesalahan.

Jika definisi indeks terdiri dari kolom tetap dan variabel-jenis, dan kolom fixed-data yang memenuhi kondisi sebelumnya (kurang atau sama dengan 900 byte), SQL Server masih memeriksa ukuran total dari kolom jenis variabel. Jika ukuran maksimum dari variabel-tipe kolom ditambah ukuran kolom fixed-data yang lebih besar dari 900 byte, SQL Server menciptakan indeks, tetapi kembali peringatan kepada pengguna. Peringatan itu memperingatkan pengguna bahwa jika insert berikutnya atau tindakan update pada variabel-jenis kolom hasil dalam ukuran total lebih besar dari 900 byte, aksi akan gagal dan pengguna akan mendapatkan error run-time. Demikian juga, jika definisi indeks terdiri dari variabel-jenis kolom saja, dan ukuran total maksimum kolom ini lebih besar dari 900 byte, SQL Server akan membuat indeks, tetapi kembali peringatan.

Untuk informasi lebih lanjut, lihat Ukuran maksimum Indeks Keys .

Pertimbangan ketika mengindeks kolom dihitung dan dilihat

Dalam SQL Server 2000, indeks juga dapat dibuat pada kolom dihitung dan dilihat. Membuat indeks berkerumun unik pada pandangan meningkatkan kinerja query karena pandangan disimpan dalam database dengan cara yang sama sebuah meja dengan indeks berkerumun disimpan.

The UNIK atau PRIMARY KEY mungkin berisi kolom dihitung asalkan memenuhi semua persyaratan untuk mengindeks. Secara khusus, kolom dihitung harus deterministik, tepat, dan tidak harus berisi teks , ntext , atau gambar kolom. Untuk informasi lebih lanjut tentang determinisme, lihat Fungsi deterministik dan nondeterministic .

Penciptaan indeks pada kolom dihitung atau melihat dapat menyebabkan kegagalan suatu INSERT atau UPDATE operasi yang bekerja sebelumnya. Kegagalan tersebut dapat terjadi ketika hasil kolom dihitung dalam kesalahan aritmatika. Sebagai contoh, meskipun kolom dihitung c dalam tabel berikut akan menyebabkan kesalahan aritmatika, pernyataan INSERT akan bekerja:

Page 10: Create Index v Indo

CREATE TABLE t1 (int, int b, c SEBAGAI / b) GO INSERT INTO NILAI t1 ('1 ', '0') GO

Jika, sebaliknya, setelah membuat tabel, Anda membuat indeks pada kolom dihitung c, pernyataan INSERT sama sekarang akan gagal.

CREATE TABLE t1 (int, int b, c SEBAGAI / b) GO CIPTAKAN UNIK Clustered INDEKS idx1 ON t1.c GO INSERT INTO NILAI t1 ('1 ', '0') GO

Hasil query menggunakan indeks pada pandangan didefinisikan dengan ekspresi numerik atau mengambang mungkin berbeda dari permintaan serupa yang tidak menggunakan indeks pada tampilan. Perbedaan ini mungkin hasil dari kesalahan pembulatan selama INSERT, DELETE, atau UPDATE tindakan pada tabel yang mendasari.

Untuk mencegah SQL Server dari menggunakan indexed views, termasuk OPTION (BUKA PANDANGAN) petunjuk pada query. Juga, pengaturan salah satu pilihan terdaftar salah akan mencegah optimizer dari menggunakan indeks pada pandangan. Untuk informasi lebih lanjut tentang OPTION (BUKA PANDANGAN) petunjuk, lihat SELECT .

Pembatasan indexed views

Pernyataan SELECT mendefinisikan pandangan diindeks tidak harus memiliki TOP, DISTINCT, Hitung, HAVING, dan kata kunci UNION. Tidak dapat memiliki subquery.

Daftar SELECT mungkin tidak termasuk tanda bintang (*), daftar wildcard, DISTINCT, COUNT (*), COUNT (<ekspresi>), kolom dihitung dari tabel dasar, dan agregat skalar. 'Tabel *.'

Nonaggregate SELECT daftar tidak dapat memiliki ekspresi. Daftar SELECT agregat (query yang berisi GROUP BY) mungkin termasuk SUM dan COUNT_BIG (<ekspresi>), melainkan harus berisi COUNT_BIG (*). Fungsi agregat Lainnya (MIN, MAX, STDEV, ...) tidak diperbolehkan.

Agregasi kompleks menggunakan AVG tidak dapat berpartisipasi dalam daftar SELECT dari indexed view. Namun, jika query menggunakan agregasi tersebut, optimizer mampu menggunakan pandangan ini diindeks untuk menggantikan AVG dengan kombinasi agregat SUM sederhana dan COUNT_BIG.

Sebuah kolom yang dihasilkan dari ekspresi yang baik mengevaluasi ke tipe data float atau menggunakan ekspresi mengambang untuk evaluasi yang tidak bisa menjadi kunci indeks dalam pandangan diindeks atau pada kolom dihitung dalam sebuah tabel. Kolom seperti ini disebut nonprecise. Gunakan fungsi COLUMNPROPERTY untuk menentukan apakah kolom dihitung tertentu atau kolom dalam pandangan adalah tepat.

Indexed views yang tunduk pada pembatasan tambahan:

Page 11: Create Index v Indo

Pencipta indeks harus memiliki tabel. Semua tabel, pandangan, dan indeks, harus diciptakan dalam database yang sama.

Pernyataan SELECT mendefinisikan indexed view mungkin tidak mengandung pandangan, fungsi rowset, fungsi inline, atau tabel yang diturunkan. Tabel fisik yang sama mungkin terjadi hanya sekali dalam pernyataannya.

Dalam setiap tabel bergabung, ada operasi OUTER JOIN diperbolehkan.

Tidak ada subqueries atau berisi atau predikat FREETEXT diperbolehkan dalam kondisi pencarian.

Jika definisi pandangan mengandung klausa GROUP BY, semua kolom pengelompokan serta COUNT_BIG (*) ekspresi harus muncul dalam daftar SELECT pandangan itu. Juga, kolom ini harus menjadi satu-satunya kolom dalam klausul Clustered INDEKS membuat unik.

Tubuh definisi pandangan yang dapat diindeks harus deterministik dan tepat, mirip dengan persyaratan pada indeks pada kolom dihitung. Lihat Membuat Indeks pada Kolom Computed .

Tingkat kompatibilitas database tidak bisa kurang dari 80. Sebuah database yang berisi pandangan diindeks tidak dapat diubah ke tingkat kompatibilitas yang lebih rendah dari 80.

Izin

CREATE INDEX izin default ke sysadmin peran server tetap dan peran database tetap db_ddladmin dan db_owner dan pemilik meja, dan tidak dapat dipindahtangankan.

Contoh

A. Gunakan indeks sederhana

Contoh ini membuat indeks pada kolom au_id dari tabel penulis.

Nocount set OFF pub PENGGUNAAN JIKA ADA (SELECT nama FROM sysindexes WHERE nama = 'au_id_ind') DROP INDEX authors.au_id_ind GO pub USE CREATE INDEX ON au_id_ind penulis (au_id) GO

B. Gunakan indeks berkerumun unik

Contoh ini membuat indeks pada kolom employeeID dari tabel emp_pay yang memaksa keunikan. Indeks ini secara fisik perintah data pada disk karena klausul Clustered ditentukan.

Nocount set pada pub PENGGUNAAN JIKA ADA (SELECT * FROM INFORMATION_SCHEMA.TABLES MANA nama_tabel = 'emp_pay') DROP TABLE emp_pay GO pub PENGGUNAAN JIKA ADA (SELECT nama FROM sysindexes WHERE nama = 'employeeID_ind') DROP INDEX emp_pay.employeeID_ind GO pub USE CREATE TABLE emp_pay (employeeID int TIDAK NULL, uang base_pay NOT NULL, komisi desimal (2, 2) NOT NULL) INSERT NILAI emp_pay (1, 500, .10) INSERT VALUES emp_pay (2, 1000, 05) INSERT VALUES emp_pay ( 3, 800, .07) INSERT VALUES emp_pay (5, 1500,

Page 12: Create Index v Indo

.03) INSERT VALUES emp_pay (9, 750, .06) GO nocount set OFF CIPTAKAN UNIK Clustered INDEKS employeeID_ind ON emp_pay (employeeID) GO

C. Gunakan indeks komposit sederhana

Contoh ini membuat indeks pada kolom orderID dan employeeID dari tabel order_emp.

Nocount set pada pub PENGGUNAAN JIKA ADA (SELECT * FROM INFORMATION_SCHEMA.TABLES MANA nama_tabel = 'order_emp') DROP TABLE order_emp GO pub PENGGUNAAN JIKA ADA (SELECT nama FROM sysindexes WHERE nama = 'emp_order_ind') DROP INDEX order_emp.emp_order_ind GO pub USE CREATE TABLE order_emp (orderID int IDENTITAS (1000, 1), employeeID int NOT NULL, datetime NOT NULL DEFAULT OrderDate GETDATE (), uang orderamount NOT NULL) INSERT order_emp (employeeID, OrderDate, orderamount) VALUES (5, '4 / 12 / 98 ', 315,19) INSERT order_emp (employeeID, OrderDate, orderamount) VALUES (5, '5 / 30/98', 1929,04) INSERT order_emp (employeeID, OrderDate, orderamount) VALUES (1, '1 / 03/98 ', 2039,82 ) INSERT order_emp (employeeID, OrderDate, orderamount) VALUES (1, '1 / 22/98 ', 445,29) INSERT order_emp (employeeID, OrderDate, orderamount) VALUES (4, '4 / 05/98', 689,39) INSERT order_emp ( employeeID, OrderDate, orderamount) VALUES (7, '3 / 21/98 ', 1598,23) INSERT order_emp (employeeID, OrderDate, orderamount) VALUES (7, '3 / 21/98', 445,77) INSERT order_emp (employeeID, OrderDate, orderamount) VALUES (7, '3 / 22/98 ', 2178,98) GO nocount set OFF CREATE INDEX ON emp_order_ind order_emp (orderID, employeeID)

D. Gunakan opsi FILLFACTOR

Contoh ini menggunakan klausa FILLFACTOR diatur ke 100. Sebuah FILLFACTOR dari 100 mengisi setiap halaman sepenuhnya dan hanya berguna bila Anda tahu bahwa nilai indeks dalam tabel tidak akan pernah berubah.

Nocount set OFF pub PENGGUNAAN JIKA ADA (SELECT nama FROM sysindexes WHERE nama = 'zip_ind') DROP INDEX authors.zip_ind GO pub USE buatlah nonclustered zip_ind INDEX ON penulis (zip) DENGAN FILLFACTOR = 100

E. Gunakan IGNORE_DUP_KEY

Contoh ini membuat indeks berkerumun unik di meja emp_pay. Jika kunci duplikat yang dimasukkan, pernyataan INSERT atau UPDATE diabaikan.

Nocount set pada pub PENGGUNAAN JIKA ADA (SELECT * FROM INFORMATION_SCHEMA.TABLES MANA nama_tabel = 'emp_pay') DROP TABLE emp_pay GO pub PENGGUNAAN JIKA ADA (SELECT nama FROM sysindexes WHERE nama = 'employeeID_ind') DROP INDEX emp_pay.employeeID_ind GO pub USE CREATE TABLE emp_pay (employeeID int TIDAK NULL, uang base_pay NOT NULL, komisi desimal (2, 2) NOT NULL) INSERT NILAI emp_pay (1, 500, .10) INSERT VALUES emp_pay (2, 1000, 05) INSERT VALUES emp_pay ( 3, 800, .07) INSERT VALUES emp_pay (5, 1500, .03) INSERT VALUES emp_pay (9, 750, .06) GO nocount set OFF GO CIPTAKAN UNIK Clustered INDEKS employeeID_ind ON emp_pay (employeeID) DENGAN IGNORE_DUP_KEY

F. Buat indeks dengan PAD_INDEX

Page 13: Create Index v Indo

Contoh ini membuat indeks pada nomor identifikasi penulis dalam tabel penulis. Tanpa klausa PAD_INDEX, SQL Server menciptakan halaman daun yang 10 persen penuh, tetapi halaman di atas tingkat daun diisi hampir sepenuhnya. Dengan PAD_INDEX, halaman menengah juga 10 persen penuh.

Perhatikan Setidaknya dua entri muncul di halaman indeks indeks berkerumun unik ketika PAD_INDEX tidak ditentukan.

Nocount set OFF pub PENGGUNAAN JIKA ADA (SELECT nama FROM sysindexes WHERE nama = 'au_id_ind') DROP INDEX authors.au_id_ind GO pub USE MENCIPTAKAN au_id_ind INDEX ON penulis (au_id) DENGAN PAD_INDEX, FILLFACTOR = 10

G. Buat indeks pada tampilan

Contoh ini akan membuat tampilan dan indeks pada pandangan itu. Kemudian, dua pertanyaan termasuk menggunakan indexed view.

USE Northwind GO - Mengatur opsi untuk mendukung indexed views. SET NUMERIC_ROUNDABORT OFF GO SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON GO - Membuat tampilan. CREATE VIEW V1 DENGAN SCHEMABINDING AS SELECT SUM (UnitPrice * Kuantitas * (1.00-Diskon)) SEBAGAI Pendapatan, OrderDate, ProductID, COUNT_BIG (*) SEBAGAI COUNT DARI dbo. [Orde Detail] od, dbo.Orders o MANA od.OrderID = o.OrderID GROUP BY OrderDate, ProductID GO - Buat indeks pada tampilan. CIPTAKAN UNIK Clustered INDEKS IV1 ON V1 (OrderDate, ProductID) GO - Query ini akan menggunakan tampilan diindeks di atas. SELECT SUM (UnitPrice * Kuantitas * (1.00-Diskon)) AS Rev, OrderDate, ProductID DARI dbo. [Order Detail] od, dbo.Orders o MANA od.OrderID = o.OrderID DAN ProductID di (2, 4, 25, 13, 7, 89, 22, 34) DAN OrderDate> = '05 / 01/1998 'GROUP BY OrderDate, PESANAN ProductID BY DESC Rev - Query ini akan menggunakan tampilan diindeks di atas. SELECT OrderDate, SUM (UnitPrice * Kuantitas * (1.00-Diskon)) SEBAGAI Rev DARI dbo. [Order Detail] od, dbo.Orders o MANA od.OrderID = o.OrderID DAN DATEPART (mm, OrderDate) = 3 DAN DATEPART ( yy, OrderDate) = 1998 GROUP BY PESANAN OrderDate BY ASC OrderDate