2010-04-27 16 views
5

Co do wydajności SQL.Jak powinienem używać BIT w SQL Server 2005

Mam funkcję wartości skalarnej do sprawdzania niektórych warunków w bazie, zwraca wartość BIT dla True lub False.

I teraz nie wiem, w jaki sposób należy wypełnić parametr @BIT

Jeśli piszę.

set @bit = convert(bit,1) 

lub

set @bit = 1 

lub

set @bit='true' 

funkcja będzie działać w każdym razie, ale nie wiem, która metoda jest zalecana do codziennego użytku.

Kolejne pytanie, mam tabelę w mojej bazie z około 4 milionami rekordów, codzienna wstawka to około 4K rekordów w tej tabeli.

Teraz chcę dodać ograniczenia w tej tabeli z funkcją ceniony skalarnego że wspominałem już

coś takiego

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

gdzie „id” jest klucz podstawowy fin_stavke stołowego i dbo.fn_ado_chk_fin wygląda na to, że jest to:

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 

Czy ten typ i metoda sprawdzania ograniczenia wpłyną negatywnie na wydajność mojej tabeli i SQL w ogóle?

Jeśli istnieje lepszy sposób na dodanie kontroli na tej tabeli, proszę dać mi znać.

+0

Bit jest przypisany jako 0 lub 1, więc jeśli zadeklarujesz @bit jako Bit, powinieneś użyć set @bit = 1 lub set @bit = 0. – Lazarus

+0

MSSQL nie obchodzi, w jaki sposób je ustawić. możesz ustawić go na "true", a następnie porównać go do 1, a SQL nie będzie dbać. – DForck42

Odpowiedz

4

może się mylę, ale z niecierpliwością na to, wydaje się, chcesz tylko sprawdzić, czy nie zarówno doc_id i protocol_idNULL?

Aby to osiągnąć, można dodać ograniczenie tabeli .

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

Masz całkowitą rację: – adopilot

+0

+1, o czym myślałem, ale tylko, jeśli fin_stavke.id jest unikatowe, co wydaje się rozsądnym założeniem w tym przypadku: –

+1

@adopilot - wydrukowano i oprawiono komentarz. Przyda się, gdy następnym razem będę kłócić się z moją żoną. –

1

Zawsze widziałem bitów używanych jako 1 lub 0. Trzymałbym się z tym. Wszyscy będą wiedzieć, co robisz.

To ograniczenie ma wpływ na wydajność wkładek, ale nie na wiele, ponieważ starasz się uzyskać klucz podstawowy tabeli. Prawdopodobnie jest to najtańszy sposób wyszukiwania.

2

użyję

set @bit = 1 

Jest bezpieczny (przypisywanie wierny trochę czuje się źle) i konwertować tylko wydaje się bezcelowe.

1

Zmienna nieco można ustawić wartość całkowitą:

set @bit = 1 

Czasami chcesz rzeczywistą wartość bitową, aby uniknąć niejawna konwersja, to można zrobić excplicit konwersję:

set @bit = cast(1 as bit) 

Po przypisaniu zmiennej nie ma praktycznej różnicy, ale w zapytaniu konwersja nastąpi, gdy zapytanie zostanie przeanalizowane, a nie kiedy zostanie wykonane. Użyłem go kilka razy i uzyskałem rzeczywiste różnice w wydajności.

Powiązane problemy