2010-04-27 64 views
5

Về hiệu suất SQL.Làm thế nào tôi nên sử dụng BIT trong SQL Server 2005

Tôi có hàm vô hướng có giá trị để kiểm tra một số điều kiện cụ thể trong cơ sở, nó trả về giá trị BIT cho True hoặc False.

Tôi hiện không biết cách điền thông số @BIT

Nếu tôi viết.

set @bit = convert(bit,1) 

hoặc

set @bit = 1 

hoặc

set @bit='true' 

chức năng sẽ làm việc anyway nhưng tôi không biết đó là phương pháp được khuyến khích sử dụng hàng ngày.

Một câu hỏi khác, tôi có bảng trong cơ sở của mình với khoảng 4 triệu bản ghi, chèn hàng ngày là khoảng 4K bản ghi trong bảng đó.

Bây giờ tôi muốn thêm CONSTRAINT vào đó bảng với hàm vô hướng có giá trị mà tôi đã đề cập

Something như thế này

ALTER TABLE fin_stavke 
ADD CONSTRAINT fin_stavke_knjizenje CHECK (dbo.fn_ado_chk_fin(id)=convert(bit,1)) 

nơi "id" là chìa khóa chính của bảng fin_stavke và dbo.fn_ado_chk_fin trông giống như

create FUNCTION fn_ado_chk_fin 
(
    @stavka_id int 
) 
RETURNS bit 
AS 
BEGIN 
declare @bit bit 

if exists (select * from fin_stavke where [email protected]_id and doc_id is null and protocol_id is null) 
     begin 
      set @bit=0 


     end 
    else 
     begin 
      set @bit=1 
     end 
return @bit; 
END 
GO 

Loại và phương pháp kiểm tra ràng buộc này có ảnh hưởng xấu đến hiệu suất trên bảng và SQL của tôi không?

Nếu có cách nào tốt hơn để thêm quyền kiểm soát trên bảng này, vui lòng cho tôi biết.

+0

Một bit được gán là 0 hoặc 1, vì vậy nếu bạn khai báo @ bit là bit thì bạn nên sử dụng đặt @bit = 1 hoặc đặt @ bit = 0 Tôi đã nghĩ. – Lazarus

+0

MSSQL không quan tâm bạn đã đặt nó theo cách nào. bạn có thể đặt nó thành 'true, sau đó so sánh nó với 1 và SQL sẽ không quan tâm. – DForck42

Trả lời

4

Tôi có thể sai nhưng ngoại hình của nó, có vẻ như bạn chỉ muốn kiểm tra xem không phải cả hai doc_idprotocol_id đều là NULL?

Bạn có thể thêm ràng buộc bảng để đạt được điều này.

ALTER TABLE fin_stavke 
ADD CONSTRAINT fin_stavke_knjizenje CHECK (doc_id IS NOT NULL OR protocol_id IS NOT NULL) 
+0

Bạn hoàn toàn đúng – adopilot

+0

+1, những gì tôi đã suy nghĩ, nhưng chỉ khi fin_stavke.id là duy nhất, mà có vẻ như một giả định hợp lý trong trường hợp này –

+1

@adopilot - in và đóng khung nhận xét của bạn. Nó sẽ có ích trong lần sau tôi cãi nhau với vợ tôi. –

1

Tôi luôn thấy bit được sử dụng là 1 hoặc 0. Tôi muốn gắn bó với điều đó. Mọi người sẽ biết bạn đang làm gì.

Ràng buộc đó sẽ ảnh hưởng đến hiệu suất của các lần chèn của bạn nhưng không nhiều vì bạn đang tìm kiếm khóa chính của bảng. Nó có lẽ là tra cứu rẻ nhất bạn có thể làm.

2

Tôi muốn sử dụng

set @bit = 1 

Nó an toàn (gán đúng với một chút cảm giác sai) và chuyển đổi chỉ có vẻ vô nghĩa.

1

Một biến bit có thể được thiết lập với một giá trị số nguyên:

set @bit = 1 

Đôi khi bạn muốn có một giá trị bit thực tế để tránh việc chuyển đổi ngầm, sau đó bạn có thể làm một chuyển đổi excplicit:

set @bit = cast(1 as bit) 

Khi gán nó vào một biến không có sự khác biệt thực tế, nhưng trong truy vấn, chuyển đổi sẽ xảy ra khi truy vấn được phân tích cú pháp thay vì khi truy vấn được thực thi. Tôi đã sử dụng nó một vài lần và có sự khác biệt về hiệu suất thực tế.

Các vấn đề liên quan