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

Откуда:
Сообщений: 6
Задача типовая.
Есть некоторая таблица, в которой есть поле идентификатора (первичный ключ кластеризованный) и поле статуса.
Есть процедура, которая может обрабатывать только по одной записи из этой таблицы, для чего ей нужно передать идентификатор записи, и по завершении обработки она поменяет значение статуса.
Какой подход будет более оптимальным: курсор, select top 1 с ограничением по статусу, временная таблица.
По возможности хотелось бы услышать аргументированный ответ.
20 дек 11, 09:08    [11793600]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
SQL Newbee
Какой подход будет более оптимальным: курсор, select top 1 с ограничением по статусу, временная таблица.
курсор или временная таблица. select top 1 с ограничением по статусу будет делать поиск в каждой итерации
20 дек 11, 09:09    [11793607]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
SQL Newbee
Member

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

По временной таблица тоже будет поиск, курсор в плане показывает тоже поиск по временной таблице в tempdb
20 дек 11, 09:11    [11793615]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Переписать процедуру так, чтобы она могла обрабатывать произвольное количество записей. Ибо, в подавляющем большинстве случаев "обработать построчно набор записей", затраты на организацию цикла ничтожны, по сравнению с самой построчной обработкой.
20 дек 11, 09:22    [11793673]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
SQL Newbee
Member

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

Именно, но этого пока не позволяет сделать выработавшийся подход, а переписать всю систему дорого.
20 дек 11, 09:24    [11793677]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
SQL Newbee,

Это можно делать постепенно и прозрачно.
20 дек 11, 09:34    [11793722]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
SQL Newbee
alexeyvg,

По временной таблица тоже будет поиск, курсор в плане показывает тоже поиск по временной таблице в tempdb
Это не поиск, это взять значение по ключу (если правильно написать).

А "select top 1 с ограничением по статусу будет делать поиск в каждой итерации" будет скорее всего просто сканить. Разумеется, в каких то случаях можно использовать и этот подход, например, при небольшом количестве записей.
SQL Newbee
invm,

Именно, но этого пока не позволяет сделать выработавшийся подход, а переписать всю систему дорого.
Да, печально, когда подход вырабатывают неспециалисты :-) Всё таки хотя бы один специалист на проект нужен.
20 дек 11, 09:36    [11793735]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
alexeyvg
Да, печально, когда подход вырабатывают неспециалисты :-) Всё таки хотя бы один специалист на проект нужен.
Специалистам нужно платить, а этой статьи расходов все стараются избегать :)
20 дек 11, 09:41    [11793765]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
SQL Newbee
Member

Откуда:
Сообщений: 6
alexeyvg
Всё таки хотя бы один специалист на проект нужен.

Фигово одному специалисту на проекте.

Скана не будет, в обоих случаях поиск. С учетом того что стоимость у поиска логарифмическая, в идеале размер таблицы на производительность выборки особо не влияет. Складывается впечатление, что прозрачнее и без горожения огорода из доп структур, select top 1, хотя по сути везде получается примерно одно и то же
20 дек 11, 09:51    [11793818]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
SQL Newbee
Member

Откуда:
Сообщений: 6
Забыл добавить, что полю статуса, некластерный индекс имеется
20 дек 11, 10:00    [11793889]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
SQL Newbee, например, можно так:

Было
create dbo.uspProcessing
 @id int
as
begin
 ...
end;


Стало
create type dbo.IdentifierList as table
(
 id int not null primary key
);
go
create dbo.uspBulkProcessing
 @ids dbo.IdentifierList readonly
as
begin
 ...
end;
go
create dbo.uspProcessing
 @id int
as
begin
 declare @t dbo.IdentifierList;
 
 insert into @t (id) values (@id);
 
 exec dbo.uspBulkProcessing @t;
end;
20 дек 11, 10:03    [11793914]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
SQL Newbee
Member

Откуда:
Сообщений: 6
invm,
Идея хорошая, примерно хотя бы что-то подобное и хочется в будущем, если все-таки архитектура будет пересматриваться.
20 дек 11, 10:22    [11794058]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
SQL Newbee, так вы это можете сделать без пересмотра архитектуры.
20 дек 11, 10:36    [11794173]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
лолл
Member

Откуда:
Сообщений: 450
SQL Newbee,

курсор будет быстрее, чем запрос в цикле.
а чего такого сложно выполняет процедура, что вы даже не хотите хотя бы попробовать написать ее аналог, работающий с таблицей?
20 дек 11, 13:20    [11795755]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальное решение классической задачи (цикл)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
SQL Newbee
alexeyvg
Всё таки хотя бы один специалист на проект нужен.

Фигово одному специалисту на проекте.

Скана не будет, в обоих случаях поиск. С учетом того что стоимость у поиска логарифмическая, в идеале размер таблицы на производительность выборки особо не влияет. Складывается впечатление, что прозрачнее и без горожения огорода из доп структур, select top 1, хотя по сути везде получается примерно одно и то же
Не совсем поиск. Конечно, скана всей таблицы не будет, но это же не поиск по уникальному индексу, в плане наверняка после поиска есть фильтр (хотя зависит от конкретной реализации ваших таблиц - если статус включён в состав индекса, а поля из списка селекта в include, то всё нормально)
20 дек 11, 14:56    [11796962]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить