Bisakah Anda membuat indeks pada variabel tabel di SQL Server 2000?
yaitu
DECLARE @TEMPTABLE TABLE (
[ID] [int] NOT NULL PRIMARY KEY
,[Name] [nvarchar] (255) COLLATE DATABASE_DEFAULT NULL
)
Bisakah saya membuat indeks Name
?
sql
sql-server
tsql
indexing
table-variable
GordyII
sumber
sumber
CREATE TABLE #T1(X INT); CREATE TABLE #T2(X INT); CREATE INDEX IX ON #T1(X); CREATE INDEX IX ON #T2(X);
Jawaban:
Pertanyaan ini ditandai dengan SQL Server 2000 tetapi untuk kepentingan orang-orang yang mengembangkan versi terbaru saya akan membahasnya terlebih dahulu.
SQL Server 2014
Selain metode menambahkan indeks berbasis kendala yang dibahas di bawah ini, SQL Server 2014 juga memungkinkan indeks yang tidak unik ditentukan secara langsung dengan sintaks sebaris pada deklarasi variabel tabel.
Sintaks contoh untuk itu di bawah ini.
Indeks dan indeks yang difilter dengan kolom yang disertakan saat ini tidak dapat dideklarasikan dengan sintaks ini namun SQL Server 2016 melonggarkan ini sedikit lebih jauh. Dari CTP 3.1 sekarang dimungkinkan untuk mendeklarasikan indeks yang difilter untuk variabel tabel. Dengan RTM itu mungkin kasus yang menyertakan kolom juga diperbolehkan tetapi posisi saat ini adalah bahwa mereka "kemungkinan tidak akan masuk ke SQL16 karena keterbatasan sumber daya"
SQL Server 2000 - 2012
Jawaban singkat: Ya.
Jawaban lebih rinci ada di bawah.
Tabel tradisional di SQL Server dapat memiliki indeks berkerumun atau disusun sebagai tumpukan .
Indeks yang dikelompokkan dapat dinyatakan sebagai unik untuk melarang nilai kunci duplikat atau default menjadi tidak unik. Jika tidak unik maka SQL Server menambahkan diam-diam a unikifier ke kunci duplikat untuk membuatnya unik.
Indeks non-cluster juga dapat secara eksplisit dinyatakan unik. Jika tidak, untuk kasus yang tidak unik SQL Server menambahkan baris locator (kunci indeks berkerumun atau RID untuk heap) ke semua kunci indeks (bukan hanya duplikat) ini lagi memastikan mereka unik.
Dalam SQL Server 2000 - 2012 indeks pada variabel tabel hanya dapat dibuat secara implisit dengan membuat
UNIQUE
atauPRIMARY KEY
kendala. Perbedaan antara jenis kendala ini adalah bahwa kunci utama harus pada kolom yang tidak dapat dibatalkan. Kolom yang berpartisipasi dalam kendala unik mungkin nullable. (meskipun implementasi SQL Server kendala unik di hadapanNULL
s tidak sesuai yang ditentukan dalam SQL Standard). Juga sebuah tabel hanya dapat memiliki satu kunci utama tetapi beberapa kendala unik.Kedua kendala logis ini diimplementasikan secara fisik dengan indeks yang unik. Jika tidak ditentukan secara eksplisit, maka
PRIMARY KEY
akan menjadi indeks berkerumun dan kendala unik yang tidak berkerumun tetapi perilaku ini dapat diganti dengan menentukanCLUSTERED
atauNONCLUSTERED
secara eksplisit dengan deklarasi kendala (Contoh sintaks)Sebagai hasil dari di atas indeks berikut ini dapat secara implisit dibuat pada variabel tabel di SQL Server 2000 - 2012.
Yang terakhir membutuhkan sedikit penjelasan. Dalam tabel definisi variabel di awal jawaban ini indeks non clustered non unik
Name
disimulasikan oleh indeks unik onName,Id
(ingat bahwa SQL Server akan diam-diam menambahkan kunci indeks clustered ke kunci NCI non unik pula).Indeks
IDENTITY
kluster yang tidak unik juga dapat dicapai dengan menambahkan kolom secara manual untuk bertindak sebagai pemisah.Tapi ini bukan simulasi yang akurat tentang bagaimana indeks berkerumun non unik biasanya sebenarnya diimplementasikan dalam SQL Server karena ini menambahkan "Uniqueifier" ke semua baris. Bukan hanya mereka yang membutuhkannya.
sumber
Harus dipahami bahwa dari sudut pandang kinerja tidak ada perbedaan antara tabel @temp dan tabel #temp yang mendukung variabel. Mereka berada di tempat yang sama (tempdb) dan diimplementasikan dengan cara yang sama. Semua perbedaan muncul dalam fitur tambahan. Lihat artikel lengkap yang luar biasa ini: /dba/16385/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server/16386#16386
Meskipun ada kasus di mana tabel temp tidak dapat digunakan seperti dalam tabel atau fungsi skalar, untuk sebagian besar kasus lain sebelum v2016 (di mana bahkan indeks yang difilter dapat ditambahkan ke variabel tabel) Anda cukup menggunakan tabel #temp.
Kelemahan untuk menggunakan indeks bernama (atau kendala) di tempdb adalah bahwa nama-nama tersebut kemudian dapat berbenturan. Tidak hanya secara teoritis dengan prosedur lain tetapi seringkali cukup mudah dengan contoh lain dari prosedur itu sendiri yang akan mencoba untuk menempatkan indeks yang sama pada salinan tabel #temp.
Untuk menghindari bentrokan nama, hal seperti ini biasanya berfungsi:
Ini memastikan nama selalu unik bahkan antara eksekusi simultan dari prosedur yang sama.
sumber
Jika variabel Tabel memiliki data besar, maka alih-alih variabel tabel (@table) membuat tabel temp (#table). Variabel tabel tidak memungkinkan untuk membuat indeks setelah dimasukkan.
Buat tabel dengan indeks berkerumun unik
Masukkan data ke dalam tabel "#Table" Temp
Buat indeks yang tidak berkerumun.
sumber