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

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

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

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

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

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

а постоянное вычисление MIN при SELECT и DELETE, это не накладно, или лучше использовать
select top 1 * from t1 ?
можно что-нить подобное придумать для DELETE ?
...
Рейтинг: 0 / 0
работа с таблицей как с очередью
    #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
работа с таблицей как с очередью
    #32059281
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select top 1 * from t1 использовать вместо MIN можно, только если по автоинкрементному полю сделать кл. индекс, да и то правильность без order by не гарантируется. А делать поле кластерным - возможно, будет медленно.

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

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


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