Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как лучше проверить наличие записи.  [new]
Yadrinez
Member

Откуда: :адуктО
Сообщений: 360
Вот пишу тут хранимую процедуру. Требуется проверить что такой-то ID уже есть в целевой таблице.
Как лучше проверить?
Придумал несколько вариантов
Здесь @Client это ID который требуется проверить на наличие.
есть индекс по столбцу Client

IF EXISTS (SELECT TOP(1) Client FROM Postclnt WHERE Client=11111)
SET @ResultMessage='ID под таким номером уже существует.'

IF (SELECT COUNT(Client) FROM Postclnt WHERE Client=11111)>0
SET @ResultMessage='ID под таким номером уже существует.'

IF 11111 IN (SELECT Client FROM Postclnt)
SET @ResultMessage='ID под таким номером уже существует.'

Какой правильней использовать? По плану выполнения вроде все одинаковы получаются.
26 окт 09, 00:09    [7836306]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше проверить наличие записи.  [new]
iljy
Member

Откуда:
Сообщений: 8711
Yadrinez,

как правило не совсем одинаковые, оптимальным и наиболее правильным для проверки считается EXISTS.
26 окт 09, 00:10    [7836309]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше проверить наличие записи.  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
declare @dup int
set @dup = null
select top 1 @dup = 1 from ..... where ....
if @dup is not null .....
позволяет указывать в запросе хинты.
не забываем делать set @dup = null перед очередной проверкой
вариант с count() - один из самых плохих.

-------------------------
There’s no silver bullet!
26 окт 09, 00:14    [7836312]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше проверить наличие записи.  [new]
iljy
Member

Откуда:
Сообщений: 8711
locky,

? по-моему это практически эквивалент EXISTS, и внутри EXISTS хинты тоже можно указывать, так что какая разница?
26 окт 09, 00:17    [7836315]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше проверить наличие записи.  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
iljy,

if exists(select * from sys.objects option(keepfixed plan)) select 1

declare @dup int
set @dup = null
select top(1) @dup = 1 from sys.objects option(keepfixed plan)
??
26 окт 09, 00:23    [7836319]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше проверить наличие записи.  [new]
iljy
Member

Откуда:
Сообщений: 8711
locky
iljy,

if exists(select * from sys.objects option(keepfixed plan)) select 1


А, такие хинты! я про with подумал. Тогда да, если в них есть необходимость - то так. Но необходимость такая редко возникает (у меня по крайней мере ), а с EXISTS писать меньше, и переменную объявлять не надо
26 окт 09, 00:28    [7836329]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше проверить наличие записи.  [new]
Yadrinez
Member

Откуда: :адуктО
Сообщений: 360
locky
declare @dup int
set @dup = null
select top 1 @dup = 1 from ..... where ....
if @dup is not null .....
позволяет указывать в запросе хинты.
не забываем делать set @dup = null перед очередной проверкой
вариант с count() - один из самых плохих.

-------------------------
There’s no silver bullet!


Оригинально. Век живи век учись.
План запроса получается разный.
Не могли бы прокомментировать. Я а то не силен в этом
Во вложении план запроса

К сообщению приложен файл. Размер - 0Kb
26 окт 09, 00:30    [7836330]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше проверить наличие записи.  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Yadrinez,

в первом случае в const стоит значение для поиска и оно служит "первым" рекордсетом.
Затем при помощи вложенных циклов и левого полусоединения проверяется - есть ли хоть одна запись (т.е. поиск по "второму" рекордсету прекращается как только найдена хоть одна запись).

Во втором случае просто выбирается одна строка.
26 окт 09, 00:34    [7836336]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше проверить наличие записи.  [new]
Yadrinez
Member

Откуда: :адуктО
Сообщений: 360
О. Спасибо. ладно не я один не сплю.
26 окт 09, 00:45    [7836342]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше проверить наличие записи.  [new]
Yadrinez
Member

Откуда: :адуктО
Сообщений: 360
В текущей процедуре решил остановиться на EXISTS.
Вариант Locky буду иметь в виду.
26 окт 09, 01:26    [7836363]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше проверить наличие записи.  [new]
-------------------------
Guest
а зачем top(1)? Почему не просто * ?
26 окт 09, 09:19    [7836767]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить