Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / работа с таблицей как с очередью / 21 сообщений из 21, страница 1 из 1
17.10.2002, 12:53:15
    #32059151
miem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
Здравствуйте. Подскажите пожалуйста, как из таблицы организовать очередь.
Нужны всего 2 возможности:
1.достать(и удалить) первую запись
2.положить новую в конец

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

Вопрос как организовать все это наиболее эффективно?
...
Рейтинг: 0 / 0
17.10.2002, 13:21:35
    #32059162
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
Навскидку написать всой счетчик и не ломать себе голову,
min(),max() или временные метки
...
Рейтинг: 0 / 0
17.10.2002, 13:24:57
    #32059165
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
2miem
Ого! Ну у вас и системка, если автоинкрементное поле типа bigint быстро кончится!
...
Рейтинг: 0 / 0
17.10.2002, 13:36:47
    #32059175
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
2.положить новую в конец

В конец чего? Уж не думаете ли Вы, что записи в таблицах имеют порядковый номер?
...
Рейтинг: 0 / 0
17.10.2002, 14:12:27
    #32059199
miem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
2Genady
нет не думаю. Мне нужна очередь лежащая в базе. По-моему это понятно объяснено. Принцип: первый вошел, первый вышел.
2alexeyvg
bigint все равно закончится рано или поздно. А очередь должна продолжать работать. Одновременно, конечно, в ней не будет хранится max bigint записей.

2ALL
Вопрос был про эффективность решения задачи.
...
Рейтинг: 0 / 0
17.10.2002, 14:15:27
    #32059201
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
Ну тогда ,помоему,timestamp и при начале периода актуальности записей выставляй его на новый.
...
Рейтинг: 0 / 0
17.10.2002, 14:27:20
    #32059209
dao
dao
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
доп поле в котором номер от начала - поддерживается на тригерах
удаляется строка - update-1 если не единственная
При вставке
сначала вставляется потом добавляем поле max()+1
Сумбурно но думаю общий смысл понятен
...
Рейтинг: 0 / 0
17.10.2002, 14:29:10
    #32059211
miem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
2 Maxx
а поподробнее и что значит " при начале периода актуальности записей" ?
...
Рейтинг: 0 / 0
17.10.2002, 14:35:32
    #32059220
miem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
2 dao
>удаляется строка - update-1 если не единственная
это как?
...
Рейтинг: 0 / 0
17.10.2002, 14:39:38
    #32059222
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
периоды актуальности записей - рабочий период,то что он будет следует из ваших слов
в таблице одновременно не будет храниться max(bigint)
может я не правильно вас понял.
Так моя идея какова,если вам не нужны все занчения из таблицы,а только значения для определенного рабочего периода,то при его начале определяете новую временную метку,в последствии очередь легко реализуема,но елси нет разбивки по периодам то тогды только счетчик,или опять же datetime.
ЗЫ
All Any idea?
...
Рейтинг: 0 / 0
17.10.2002, 14:40:55
    #32059226
dao
dao
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
в тригере на удаление - проверяешь последняя ли занись если на последняя то обновляешь доп поле set field=field-1
...
Рейтинг: 0 / 0
17.10.2002, 14:42:46
    #32059230
dao
dao
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
Соответственно удаляешь всегда запись со значением 1
...
Рейтинг: 0 / 0
17.10.2002, 14:48:37
    #32059235
Mich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
А если классическим способом: доп. поле, явлающееся указатлем на соседа... и т.д. Можно даже двойной связанный список сделать.
______
...
Рейтинг: 0 / 0
17.10.2002, 14:48:44
    #32059236
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
Поле типа timestamp закончится намного быстрее.
Для поля типа bigint, если вставлять 1000000 записей в сек. круглые сутки, то хватит на 507357 лет.
Желаю Вам учавствовать в решении проблемы 509359-го года.

По эффективности - быстрый вариант с bigint+identity;
...
Рейтинг: 0 / 0
17.10.2002, 15:02:46
    #32059247
miem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
2alexeyvg
про bigint я погорячился. простые подсчеты говорят, что вы правы.

а постоянное вычисление MIN при SELECT и DELETE, это не накладно, или лучше использовать
select top 1 * from t1 ?
можно что-нить подобное придумать для DELETE ?
...
Рейтинг: 0 / 0
17.10.2002, 15:35:07
    #32059280
akuz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE #query (id bigint identity( 1 , 1 ), value int)

INSERT #query VALUES ( 5 )  -- добавить новую в конец
 
INSERT #query VALUES ( 3 )  -- добавить новую в конец
 
INSERT #query VALUES ( 6 )  -- добавить новую в конец
 
INSERT #query VALUES ( 8 )  -- добавить новую в конец
 

select * from #query

DELETE #query WHERE id = (SELECT TOP  1  id FROM #query ORDER BY id)  -- удалить первую
 
DELETE #query WHERE id = (SELECT TOP  1  id FROM #query ORDER BY id)  -- удалить первую
 

select * from #query

drop table #query
...
Рейтинг: 0 / 0
17.10.2002, 15:35:53
    #32059281
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
select top 1 * from t1 использовать вместо MIN можно, только если по автоинкрементному полю сделать кл. индекс, да и то правильность без order by не гарантируется. А делать поле кластерным - возможно, будет медленно.

Тут всё зависит от типичной длинны очереди. Если помещается на одну страницу - тогда без индекса и MIN и MAX быстрее всего. Если на несколько страниц - тоже подойдёт. Ну а если в очереди - 1000...000 записей - тогда автоинкрементному полю сделать уникальный некластерный индекс и искать по MIN и MAX.
...
Рейтинг: 0 / 0
17.10.2002, 16:44:36
    #32059326
miem
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
всем большое спасибо!
...
Рейтинг: 0 / 0
21.10.2002, 02:26:15
    #32060051
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
если поле "автоинкремент" - индекс только кластерный...
затрат на поддержку индекса 0... добавляются запися всегда в конец....
...
Рейтинг: 0 / 0
21.10.2002, 11:40:11
    #32060155
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
2MiCe

Тут можно поспорить. Предсавьте, что очередь небольшая и интенсивно используемая. При кластерном индексе будут постоянно выделяться новые страницы для новых элементов очереди и освобождаться страницы для доставаемых элементов. Поэтому я и писал - некластерный. А если элементов совсем мало - на одну или там три страницы - быстрее всего вообще без индекса.
...
Рейтинг: 0 / 0
21.10.2002, 13:13:31
    #32060215
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с таблицей как с очередью
на счет без индекса - согласен....
а вот "обычный" индекс еще поддерживать нужно....
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / работа с таблицей как с очередью / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]