Оценка к производительности sql.
У меня есть скалярная функция для проверки некоторого особого условия в основе, это возвращает Битовое значение для TRUE или FALSE.
Я теперь не знаю, как я должен заполнить @BIT параметр
Если я пишу.
set @bit = convert(bit,1)
или
set @bit = 1
или
set @bit='true'
функция будет работать так или иначе, но я не знаю, какой метод рекомендуется для ежедневного использования.
Другой вопрос, у меня есть таблица в моей базе приблизительно с 4 миллионами записей, ежедневная вставка о записях 4K в той таблице.
Теперь я хочу добавить ОГРАНИЧЕНИЕ на ту таблицу со скалярной функцией, которую я уже упомянул
Что-то вроде этого
ALTER TABLE fin_stavke
ADD CONSTRAINT fin_stavke_knjizenje CHECK ( dbo.fn_ado_chk_fin(id)=convert(bit,1))
где "идентификатор" является первичным ключом таблицы 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 вообще?
Если существует также лучший способ добавить управление на этой таблице, сообщенной мне.
Я могу ошибаться, но, судя по всему, вы хотите проверить, что не одновременно 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)
Битовая переменная может быть установлена с целочисленным значением:
set @bit = 1
Иногда вам нужно фактическое битовое значение, чтобы избежать неявного преобразования, тогда вы можете выполнить Исключительное преобразование:
set @bit = cast(1 as bit)
При присвоении его переменной практической разницы нет, но в запросе преобразование будет происходить при анализе запроса, а не при его выполнении.Я использовал его несколько раз и получил реальные различия в производительности.
Я бы использовал
set @bit = 1
Это безопасно (присвоение true битам кажется неправильным), а преобразование кажется бессмысленным.
Я всегда видел, как бит используется как 1 или 0. Я бы придерживался этого. Все будут знать, что вы делаете.
Это ограничение повлияет на производительность ваших вставок, но не сильно, так как вы ищите первичный ключ таблицы. Вероятно, это самый дешевый поиск, который вы можете сделать.