Как я должен использовать BIT в SQL Server 2005 - PullRequest
5 голосов
/ 27 апреля 2010

Относительно производительности SQL.

У меня есть скалярная функция для проверки некоторых конкретных условий в базе, она возвращает значение BIT для True или False.

Я сейчас не знаю, как мне заполнить параметр @BIT

Если я напишу.

set @bit = convert(bit,1)

или

set @bit = 1

или

set @bit='true'

Функция будет работать в любом случае, но я не знаю, какой метод рекомендуется для ежедневного использования.

Еще один вопрос, у меня в базе около 4 миллионов записей, ежедневная вставка составляет около 4 КБ записей в этой таблице.

Теперь я хочу добавить CONSTRAINT в эту таблицу с помощью скалярной функции, о которой я уже упоминал

как то так

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

где "id" - это первичный ключ таблицы fin_stavke, а dbo.fn_ado_chk_fin выглядит как

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

if exists (select * from fin_stavke where id=@stavka_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

Повлияет ли этот тип и метод проверки ограничения на производительность моей таблицы и SQL-кода вообще плохо?

Если есть и лучший способ добавить контроль к этой таблице, пожалуйста, дайте мне знать.

Ответы [ 4 ]

4 голосов
/ 27 апреля 2010

Возможно, я ошибаюсь, но, судя по всему, вам нужно только проверить, не являются ли doc_id и protocol_id NULL?

Для этого можно добавить ограничение таблицы .

ALTER TABLE fin_stavke
ADD CONSTRAINT fin_stavke_knjizenje CHECK ( doc_id IS NOT NULL OR protocol_id IS NOT NULL)
2 голосов
/ 27 апреля 2010

Я бы использовал

 set @bit = 1

Это безопасно (присваивать true биту кажется неправильным), и преобразование кажется бессмысленным.

1 голос
/ 27 апреля 2010

Битовая переменная может быть установлена ​​с целочисленным значением:

set @bit = 1

Иногда вы хотите, чтобы действительное значение бита избегало неявного преобразования, тогда вы можете выполнить явное преобразование:

set @bit = cast(1 as bit)

При присвоении переменной переменной нет никакой практической разницы, но в запросе преобразование будет происходить, когда запрос анализируется, а не когда он выполняется. Я использовал его несколько раз и получил реальную разницу в производительности.

1 голос
/ 27 апреля 2010

Я всегда видел бит, используемый как 1 или 0. Я бы придерживался этого. Все будут знать, что ты делаешь.

Это ограничение будет влиять на производительность ваших вставок, но ненамного, поскольку вы будете искать первичный ключ таблицы. Вероятно, это самый дешевый поиск, который вы можете сделать.

...