Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Membuat indeks pada variabel tabel

Pertanyaannya diberi tag SQL Server 2000 tetapi untuk kepentingan orang-orang yang mengembangkan versi terbaru, saya akan membahasnya terlebih dahulu.

SQL Server 2014

Selain metode penambahan indeks berbasis kendala yang dibahas di bawah SQL Server 2014 juga memungkinkan indeks non unik untuk ditentukan secara langsung dengan sintaks sebaris pada deklarasi variabel tabel.

Contoh sintaks untuk itu ada di bawah.

/*SQL Server 2014+ compatible inline index syntax*/
DECLARE @T TABLE (
C1 INT INDEX IX1 CLUSTERED, /*Single column indexes can be declared next to the column*/
C2 INT INDEX IX2 NONCLUSTERED,
       INDEX IX3 NONCLUSTERED(C1,C2) /*Example composite index*/
);

Indeks dan indeks yang difilter dengan kolom yang disertakan saat ini tidak dapat dideklarasikan dengan sintaks ini namun SQL Server 2016 santai ini sedikit lebih jauh. Dari CTP 3.1 sekarang dimungkinkan untuk mendeklarasikan indeks yang difilter untuk variabel tabel. Dengan RTM itu mungkin dalam kasus bahwa kolom yang disertakan juga diperbolehkan tetapi posisi saat ini adalah bahwa mereka "kemungkinan tidak akan berhasil masuk ke SQL16 karena kendala sumber daya"

/*SQL Server 2016 allows filtered indexes*/
DECLARE @T TABLE
(
c1 INT NULL INDEX ix UNIQUE WHERE c1 IS NOT NULL /*Unique ignoring nulls*/
)

SQL Server 2000 - 2012

Bisakah saya membuat indeks di Nama?

Jawaban singkat:Ya.

DECLARE @TEMPTABLE TABLE (
  [ID]   [INT] NOT NULL PRIMARY KEY,
  [Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
  UNIQUE NONCLUSTERED ([Name], [ID]) 
  ) 

Jawaban yang lebih detail ada di bawah.

Tabel tradisional di SQL Server dapat memiliki indeks berkerumun atau disusun sebagai tumpukan.

Indeks berkerumun dapat dideklarasikan sebagai unik untuk melarang nilai kunci duplikat atau default ke non unik. Jika tidak unik, maka SQL Server secara diam-diam menambahkan uniqueifier ke kunci duplikat apa pun untuk menjadikannya unik.

Indeks yang tidak berkerumun juga dapat dinyatakan secara eksplisit sebagai unik. Jika tidak, untuk kasus yang tidak unik, SQL Server menambahkan pencari baris (kunci indeks berkerumun atau RID untuk heap) ke semua kunci indeks (bukan hanya duplikat) sekali lagi ini memastikan kunci tersebut unik.

Di SQL Server 2000 - 2012 indeks pada tabel variabel hanya dapat dibuat secara implisit dengan membuat UNIQUE atau PRIMARY KEY paksaan. Perbedaan antara tipe batasan ini adalah bahwa kunci utama harus berada pada kolom yang tidak dapat dibatalkan. Kolom yang berpartisipasi dalam batasan unik mungkin dapat dibatalkan. (meskipun implementasi SQL Server dari kendala unik dengan adanya NULL s bukan per yang ditentukan dalam Standar SQL). Juga sebuah tabel hanya dapat memiliki satu kunci utama tetapi beberapa batasan unik.

Kedua batasan logis ini diimplementasikan secara fisik dengan indeks unik. Jika tidak secara eksplisit ditentukan sebaliknya PRIMARY KEY akan menjadi indeks berkerumun dan batasan unik yang tidak berkerumun tetapi perilaku ini dapat diganti dengan menentukan CLUSTERED atau NONCLUSTERED secara eksplisit dengan deklarasi kendala (Contoh sintaks)

DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)

Sebagai hasil di atas, indeks berikut dapat dibuat secara implisit pada variabel tabel di SQL Server 2000 - 2012.

+-------------------------------------+-------------------------------------+
|             Index Type              | Can be created on a table variable? |
+-------------------------------------+-------------------------------------+
| Unique Clustered Index              | Yes                                 |
| Nonunique Clustered Index           |                                     |
| Unique NCI on a heap                | Yes                                 |
| Non Unique NCI on a heap            |                                     |
| Unique NCI on a clustered index     | Yes                                 |
| Non Unique NCI on a clustered index | Yes                                 |
+-------------------------------------+-------------------------------------+

Yang terakhir membutuhkan sedikit penjelasan. Dalam definisi variabel tabel di awal jawaban ini tidak unik indeks tidak berkerumun pada Name disimulasikan oleh unik indeks pada Name,Id (ingat bahwa SQL Server akan secara diam-diam menambahkan kunci indeks berkerumun ke kunci NCI yang tidak unik).

Indeks berkerumun yang tidak unik juga dapat dicapai dengan menambahkan IDENTITY secara manual kolom untuk bertindak sebagai uniqueifier.

DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)

Tapi ini bukan simulasi akurat tentang bagaimana indeks berkerumun non unik biasanya benar-benar diimplementasikan di SQL Server karena ini menambahkan "Uniqueifier" ke semua baris. Bukan hanya mereka yang membutuhkannya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ubah waktu desimal menjadi jam dan menit

  2. Perubahan Kolom Metadata Saja Baru di SQL Server 2016

  3. Kembalikan nilai dari perintah Sisipkan SQL Server menggunakan c #

  4. Menerapkan Pencarian Teks Lengkap di SQL Server 2016 untuk Pengguna Tingkat Lanjut

  5. Membuat kunci utama komposit di SQL Server