Bài đăng

Các Loại Ràng Buộc Trong SQL Server [CHECK, CONSTRAINT, DEFAULT, FOREIGN KEY, PRIMARY KEY, UNIQUE KEY]

Ràng buộc trong SQL Server được dùng để duy trì tính nhất quán của dữ liệu, đảm bảo dữ liệu phù hợp với các qui định theo yêu cầu của bài toán. Ví dụ một database về bán hàng đòi hỏi mỗi bản ghi phải có ID sản phẩm hợp lệ, số lượng bán phải là một số nguyên và giá bán phải lớn hơn 0. Đó là các yêu cầu về tính nhất quán của dữ liệu và các ràng buộc cần được khai báo để thực thi các yêu cầu này. Do đó, ràng buộc giúp ngăn chặn dữ liệu không hợp lệ và chỉ cho phép dữ liệu hợp lệ được lưu vào database. SQL Server cung cấp các loại ràng buộc sau: PRIMARY KEY : khóa chính của bảng, là định danh duy nhất cho mỗi bản ghi trong bảng. Nó đòi hỏi cột (hoặc các cột) tạo thành khóa chính phải thỏa mãn hai điều kiện: không NULL và mỗi giá trị phải duy nhất trong toàn bảng. Mỗi bảng chỉ cho phép tối đa một khóa chính và theo nguyên tắc thiết kế, mỗi bảng đều cần có khóa chính. Có ba cách khai báo khóa chính: --Cách 1 CREATE   TABLE  dbo. Bang ( Cot_1  INT   NOT   NULL   P...

Hàm Kiểu Bảng trong Sql Server

Hình ảnh
Hàm kiểu bảng (table-valued function) là một loại hàm do người dùng định nghĩa, trong đó kết quả trả về là một cấu trúc kiểu bảng và bạn có thể sử dụng như một bảng thông thường, như SELECT hay JOIN với nó. Trong Management Studio, hàm kiểu bảng xuất hiện ở mục “Table-Valued Functions” ở bên trong “Functions”: Hàm kiểu bảng được chia làm hai loại: in-line và multi-statement. Ta sẽ tìm hiểu cách viết hai loại này và sự khác biệt của chúng trong bài này. Ở mức đơn giản nhất hàm kiểu bảng có thể chỉ là một câu lệnh SELECT đơn thuần. Ví dụ tôi cần viết một hàm lấy về thông tin của các sản phẩm dựa trên ModelID: --ví dụ 1 USE AdventureWorks GO CREATE FUNCTION dbo. fn_ProductInfoByModelID ( @p INT ) RETURNS TABLE AS RETURN SELECT P. ProductID , P. Name , P. ProductNumber FROM Production. Product P WHERE P. ProductModelID = @p GO -- gọi hàm trực tiếp SELECT * FROM dbo. fn_ProductInfoByModelID ( 5 )   --hoặc join với hàm SELECT TH. * , P. Name FROM Production. Transactio...

Tối Ưu Hóa Câu Lệnh Bằng Covering Index trong Sql server

Hình ảnh
Khi một non-clustered index được dùng để thực thi một câu lệnh, ta thường thấy trong kế hoạch thực thi thao tác  Key Lookup  (hoặc Bookmark Lookup), là thao tác mà hệ thống sau khi tìm kiếm trên cây index nhảy tới bản ghi tương ứng trong bảng để lấy các trường dữ liệu cần trả về: USE AdventureWorks GO SELECT ContactID, FirstName, LastName FROM Person. Contact WHERE EmailAddress = 'kristina1@adventure-works.com' Ta thấy index IX_Contact_EmailAddress trên trường EmailAddress đã được sử dụng (thao tác Index Seek), và  câu lệnh đạt được hiệu năng tốt hơn rất nhiều so với quét bảng  khi không có index. Tuy nhiên thao tác Key Lookup ở đó vẫn chiếm tới một nửa chi phí câu lệnh. Một kỹ thuật có thể giúp tối ưu hơn nữa cho câu lệnh này, là loại bỏ Key Lookup bằng cách đưa các trường dữ liệu cần thiết vào cây index. Khi đó hệ thống chỉ cần tìm trên index và trả kết quả về cho câu lệnh mà không cần phải truy nhập vào bảng. Index lúc đó được gọi là  covering index ...

Clustered Index trong Sql Server

Hình ảnh
Clustered index là loại index theo đó các bản ghi trong bảng được sắp thứ tự theo trường index. Khi bảng được tạo clustered index thì bản thân nó trở thành một cây index, với các node lá chứa khóa là các trường được index và cũng đồng thời chứa tất cả các trường còn lại của bảng. Vì các bản ghi chỉ có thể được sắp xếp trên cây index theo một thứ tự nhất định nên mỗi bảng chỉ có thể có tối đa một clustered index. Bạn tạo clustered index như sau: CREATE CLUSTERED INDEX index_name ON dbo. Tblname ( Colname1, Colname2... ) Khi bảng đã có clustered index thì các index khác (nonclustered) sẽ dùng khóa của trường clustered index làm con trỏ để trỏ về bản ghi tương ứng (nếu bảng không có clustered index thì một giá trị RID nội bộ được dùng). Clustered index không đòi hỏi phải duy nhất (unique). Nhưng khi nó không duy nhất thì khóa index được gắn thêm một giá trị 4-byte ngẫu nhiên để đảm bảo các node index vẫn là duy nhất. Mục đích của việc này là để cho con trỏ trong các index khác luôn tr...