Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tạo chỉ mục trên một biến bảng

Câu hỏi được gắn thẻ SQL Server 2000 nhưng vì lợi ích của những người đang phát triển trên phiên bản mới nhất, tôi sẽ giải quyết câu hỏi đó trước.

SQL Server 2014

Ngoài các phương pháp thêm chỉ mục dựa trên ràng buộc được thảo luận bên dưới, SQL Server 2014 cũng cho phép chỉ định trực tiếp các chỉ mục không phải là duy nhất bằng cú pháp nội tuyến trên khai báo biến bảng.

Cú pháp mẫu cho điều đó ở bên dưới.

/*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*/
);

Tuy nhiên, các chỉ mục và chỉ mục đã lọc có các cột đi kèm hiện không thể được khai báo bằng cú pháp này tuy nhiên SQL Server 2016 thư giãn điều này xa hơn một chút. Từ CTP 3.1, bây giờ có thể khai báo các chỉ mục đã lọc cho các biến bảng. Bởi RTM nó có thể trong trường hợp các cột được bao gồm cũng được cho phép nhưng vị trí hiện tại là chúng "có thể sẽ không vào được SQL16 do các hạn chế về tài nguyên"

/*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

Tôi có thể tạo chỉ mục trên Name không?

Câu trả lời ngắn gọn:Có.

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

Dưới đây là câu trả lời chi tiết hơn.

Các bảng truyền thống trong SQL Server có thể có chỉ mục được phân cụm hoặc được cấu trúc dưới dạng đống.

Các chỉ mục được phân nhóm có thể được khai báo là duy nhất để không cho phép các giá trị khóa trùng lặp hoặc mặc định thành không duy nhất. Nếu không phải là duy nhất thì SQL Server sẽ âm thầm thêm một mã duy nhất vào bất kỳ khóa trùng lặp nào để làm cho chúng trở thành duy nhất.

Các chỉ mục không phân cụm cũng có thể được khai báo rõ ràng là duy nhất. Mặt khác, đối với trường hợp không phải là duy nhất, SQL Server thêm công cụ định vị hàng (khóa chỉ mục theo cụm hoặc RID cho một đống) vào tất cả các khóa chỉ mục (không chỉ các khóa trùng lặp), điều này một lần nữa đảm bảo chúng là duy nhất.

Trong SQL Server 2000 - 2012 chỉ mục trên các biến bảng chỉ có thể được tạo ngầm định bằng cách tạo UNIQUE hoặc PRIMARY KEY hạn chế. Sự khác biệt giữa các kiểu ràng buộc này là khóa chính phải nằm trên (các) cột không thể nullable. Các cột tham gia vào một ràng buộc duy nhất có thể không có giá trị. (mặc dù SQL Server triển khai các ràng buộc duy nhất khi có NULL s không theo quy định trong Tiêu chuẩn SQL). Ngoài ra, một bảng có thể chỉ có một khóa chính nhưng có nhiều ràng buộc duy nhất.

Cả hai ràng buộc logic này đều được thực hiện vật lý với một chỉ mục duy nhất. Nếu không được chỉ định rõ ràng, nếu không, PRIMARY KEY sẽ trở thành chỉ mục được phân cụm và các ràng buộc duy nhất không được phân cụm nhưng hành vi này có thể bị ghi đè bằng cách chỉ định CLUSTERED hoặc NONCLUSTERED rõ ràng với khai báo ràng buộc (Cú pháp ví dụ)

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

Do đó, các chỉ mục sau có thể được tạo ngầm định trên các biến bảng trong 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                                 |
+-------------------------------------+-------------------------------------+

Cái cuối cùng yêu cầu một chút giải thích. Trong định nghĩa biến bảng ở đầu câu trả lời này, câu trả lời không duy nhất chỉ mục không phân cụm trên Name được mô phỏng bởi một duy nhất lập chỉ mục trên Name,Id (nhớ lại rằng SQL Server sẽ âm thầm thêm khóa chỉ mục nhóm vào khóa NCI không phải duy nhất).

Cũng có thể đạt được chỉ mục nhóm không phải duy nhất bằng cách thêm IDENTITY theo cách thủ công để hoạt động như một mã duy nhất.

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

Nhưng đây không phải là mô phỏng chính xác về cách một chỉ mục được phân cụm không duy nhất thường thực sự được triển khai trong SQL Server vì điều này thêm "Uniqueifier" vào tất cả các hàng. Không chỉ những thứ yêu cầu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để loại bỏ tất cả các ký tự không phải chữ cái khỏi chuỗi trong SQL Server?

  2. Làm cách nào để cập nhật hai bảng trong một câu lệnh trong SQL Server 2005?

  3. LEFT () so với SET TEXTSIZE trong SQL Server:Sự khác biệt là gì?

  4. Cách APPROX_COUNT_DISTINCT () hoạt động trong SQL Server

  5. Ví dụ về Chuyển đổi ‘smalldatetime’ thành ‘datetime’ trong SQL Server (T-SQL)