Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Спор про очередник / 25 сообщений из 68, страница 1 из 3
02.11.2015, 12:22
    #39092579
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
Предистория.
Пилю очередник отправки писем и смс.
Структура таблиц содержит весь набор полей необходимый для отправки, т.е. полностью независимый сервис.
Количество строк в таблице - миллионы.
Размерность некоторых полей nvarchar(4000).

Так вот вопрос.
Как лучше сделать?
1) Создать таблицу с битовым полем(флаг отправки) и при успешной отправки сообщения взводить 1.
Сервис для выборки необработанных сообщений пользуется этим полем, где флаг отправки -0.
За такую структуру выступаю я.

Либо.
Сделать таблицу и туда складывать всё то, что должно быть отправлено, а уже при успешной отправки перекидывать отработанные строки в другую таблицу, отправленных.
Тогда выборка необработанных будет не по миллионной таблице, а по маленькой.
Это выбор моего начальника.

Аргументы у нас с ним разные.
И мы решили поспорить, что лучше.
И решили свой спор вынести на SQL.ru
...
Рейтинг: 0 / 0
02.11.2015, 12:31
    #39092587
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
Расскажите начальнику, что существует такая фигня, как индексы. И что выборка по фиксированному значению из индекса выполняется очень быстро.

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
02.11.2015, 12:37
    #39092600
Proga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
AkinaРасскажите начальнику, что существует такая фигня, как индексы. И что выборка по фиксированному значению из индекса выполняется очень быстро.

Модератор: Тема перенесена из форума "Microsoft SQL Server".
Ему этого мало. Я развернул свои аргументы в более развёрнутой форме, но здесь не хочу про это писать.
Нужны чёткие аргументы в пользу конкретного подхода именно от сообщества SQL.RU.
...
Рейтинг: 0 / 0
02.11.2015, 14:35
    #39092797
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
ProgaAkinaРасскажите начальнику, что существует такая фигня, как индексы. И что выборка по фиксированному значению из индекса выполняется очень быстро.

Модератор: Тема перенесена из форума "Microsoft SQL Server".
Ему этого мало. Я развернул свои аргументы в более развёрнутой форме, но здесь не хочу про это писать.
Нужны чёткие аргументы в пользу конкретного подхода именно от сообщества SQL.RU.

Четкий аргумент только практика.
Сделайте тестовый стенд.
Проведите на нем нагрузочное тестирование обеих вариантов.
И по результатам сделайте выбор.
:-)
...
Рейтинг: 0 / 0
02.11.2015, 14:42
    #39092806
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
ProgaТак вот вопрос. Как лучше сделать?
Во-первых, этот вопрос имхо вообще не очень важен. Зависит, конечно, от вашей специфики, но если это вспомогательная функция - что скорее всего - и миллионы записей вообще, а не в час, то в общем любое решение будет приемлемым, да и переделать, если захочется, будет нетрудно.

Первое соображение, которое я принял бы в расчёт - перенос. Если запись достаточно большая и траффик достаточно большой, то на каждую операцию делать паразитные delete N байт и insert N байт - становится довольно большой нагрузкой на базу. Это касается как решения "сделать таблицу", так и более вменяемых - например, партиционирования по битовому флагу. По этому соображению Ваш подход, безусловно, выигрывает.

Второе соображение - выборка неотправленных. Этот запрос должен выбирать примерно 1 / (кол-во дней * кол-во циклов отправки в день), то есть малое относительно размера таблицы количество записей. Здесь я задал бы два вопроса: во-первых, как партиционированы данные по времени и во-вторых, как они физически размещаются на диске.

Если записи ложатся на диск более-менее в естественном порядке, то неотправленные записи будут склонны кластеризироваться (сбиваться в кучу в конце таблицы). Это означает, что индекс по ним будет эффективным средством доступа (даже если число логических чтений окажется велико, физических будет довольно мало). Вы, я так понял, говорите про MSSQL. Сколь мне помнится, в нём поддерживаются частичные индексы, а значит, можно сделать индекс только по неотправленным записям и наслаждаться.

Если записи ложатся на диск вразнобой (ну скажем, если вы делаете clustered key по guid pk), то индекс становится менее эффективным. Впрочем, скорее всего, он всё равно останется лучшим решением, нежели full table scan.

Решение начальника имеет некоторое преимущество в этом моменте, поскольку позволит читать неотправленные без индекса, с помощью многоблочных чтений. Но выигрыш будет сравнительно скромен, постоянные записи из таблицы в таблицу его съедят и не заметят. Кроме того, индексные решения позволят выбирать записи по одной, без "пройди всю выборку от начала до конца"; это удобно если, например, вы заходите сделать несколько независимых экземпляров отправщика, работающих по общей очереди.

Наконец, совершенно очевидно, что статусов "послан" и "не послан" недостаточно для хорошей реализации этой функциональности. Примерный набор необходимых статусов такой:

успешно отправлен

ждёт отправки

находится в процессе отправки (может быть решено блокировкой, но для MS это вряд ли хороший вариант)

невозможно отправить, перманентная ошибка доставки

не удалось отправить, повторить попытку после заданного промежутка времени

Если же кроме отправки надо контролировать ещё и доставку, набор статусов сообразно увеличивается.

Итого - я советовал бы доработать постановку и затем решение без переноса данных, с флагом или типа того.
...
Рейтинг: 0 / 0
02.11.2015, 14:53
    #39092815
vadiminfo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
AkinaРасскажите начальнику, что существует такая фигня, как индексы. И что выборка по фиксированному значению из индекса выполняется очень быстро.

Вообще-то тут плохая селективность для обычных индексов (B - деревьев): конка принимает всего два значения. Т.е. тут нужны Битмап-индексы. Но они все же не очень хороши для БД оперативной обработки транзакций. Так что этот аргумент, скорее всего, все еще не очевиден.
...
Рейтинг: 0 / 0
02.11.2015, 15:11
    #39092839
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
ProgaСделать таблицу и туда складывать всё то, что должно быть отправлено, а уже при успешной отправки перекидывать отработанные строки в другую таблицу, отправленных.
Тогда выборка необработанных будет не по миллионной таблице, а по маленькой.
я бы сделал конечно так. И дело не в возможностях индексов, а в том что не нужно объединять в одной куче логически не объединяемое. У них общее только то, что оба объекты являются сообщениями (письмами). Но функции обработки списков у них совершенно разные.
...
Рейтинг: 0 / 0
02.11.2015, 15:14
    #39092845
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
vadiminfoВообще-то тут плохая селективность для обычных индексов (B - деревьев): конка принимает всего два значения. Т.е. тут нужны Битмап-индексы.
Вадиииим :(

Тут перекошенное (skewed) распределение. Для sent = false селективность будет очень даже неплохой, во всяком случае на это стоит надеяться :)
...
Рейтинг: 0 / 0
02.11.2015, 15:15
    #39092848
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
в дополнение... в таблице "не отправленных" полезно иметь статус по какой причине запись там находится. По умолчанию это конечно "новая", но если были какие-то проблемы с отправкой, то заполняить это поле соответствующим статусом.

p.s. выше примерно об этом речь шла
...
Рейтинг: 0 / 0
02.11.2015, 15:16
    #39092850
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
ProgaТак вот вопрос. Как лучше сделать?
Да, ну и забыл упомянуть - рано или поздно на эту таблицу захочется повесить внешний ключ, и решения "перекладывать из таблички в табличку", как у них водится, сядут в лужу.
...
Рейтинг: 0 / 0
02.11.2015, 15:17
    #39092851
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
softwarerТут перекошенное (skewed) распределение. Для sent = false селективность будет очень даже неплохой
K.I.S.S.
...
Рейтинг: 0 / 0
02.11.2015, 15:19
    #39092856
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
softwarerProgaТак вот вопрос. Как лучше сделать?
Да, ну и забыл упомянуть - рано или поздно на эту таблицу захочется повесить внешний ключ, и решения "перекладывать из таблички в табличку", как у них водится, сядут в лужу.
кому захочется и зачем? тебе что-ли?
...
Рейтинг: 0 / 0
02.11.2015, 15:22
    #39092864
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
iscrafmK.I.S.S.
YouTube Video
...
Рейтинг: 0 / 0
02.11.2015, 15:25
    #39092870
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
softwarer,

ты свою тупость и ранее показывал, но здесь в очередной раз подтверждаешь что являешься обычным программером-мужланом.
...
Рейтинг: 0 / 0
02.11.2015, 15:32
    #39092881
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
Валер, то, что ты пустое трепло, способное только прийти в топик и нагадить, давно известно всему форуму. Шёл бы ты в привычную тебе среду обитания. Соревноваться с тобой в хамстве я не собираюсь, а в тупости - так и не смогу, пожалуй.
...
Рейтинг: 0 / 0
02.11.2015, 15:38
    #39092889
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
softwarer,

выше все сказано 18359602 тупица. Если не в состоянии отвечать на вопросы 18359660 , то просто игнорируй их, вместо подкладывания роликов не по теме. То что ты возвышенный на этом форуме гопник тоже известно давно.
...
Рейтинг: 0 / 0
02.11.2015, 15:41
    #39092893
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
iscrafmвыше все сказано 18359602
У тебя мания величия.
...
Рейтинг: 0 / 0
02.11.2015, 15:56
    #39092912
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
Proga,

в такой задаче разница в объемах "исходящие" и "отправленные" - многие порядки. К тому же наборы функций для обработки у них кардинально отличаются. К тому же, со временем, "отправленные" ("входящие") возможно потребуется архивировать. В общем множество причин говорить о них, как о разных списках. Просто много лет подобная задача работает...
...
Рейтинг: 0 / 0
02.11.2015, 16:01
    #39092921
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
softwareriscrafmвыше все сказано 18359602
У тебя мания величия.
есть повод для этого, хотя мании конечно нет. Но тупость кодеров, возводимая в разряд истины, достает иногда. Ты прав. Представь себе поставленную задачу для начала, а потом уже умничай про индексы.
...
Рейтинг: 0 / 0
02.11.2015, 16:24
    #39092956
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
ProgaПредистория.
Пилю очередник отправки писем и смс.
Структура таблиц содержит весь набор полей необходимый для отправки, т.е. полностью независимый сервис.
Количество строк в таблице - миллионы.
Размерность некоторых полей nvarchar(4000).

Так вот вопрос.
Как лучше сделать?
1) Создать таблицу с битовым полем(флаг отправки) и при успешной отправки сообщения взводить 1.
Сервис для выборки необработанных сообщений пользуется этим полем, где флаг отправки -0.
За такую структуру выступаю я.

Либо.
Сделать таблицу и туда складывать всё то, что должно быть отправлено, а уже при успешной отправки перекидывать отработанные строки в другую таблицу, отправленных.
Тогда выборка необработанных будет не по миллионной таблице, а по маленькой.
Это выбор моего начальника.

Аргументы у нас с ним разные.
И мы решили поспорить, что лучше.
И решили свой спор вынести на SQL.ru


Вообще-то говоря, пофигу, если создать индекс по критерию необходимости отправки.
И если хранить данные по отправленным письмам нужно, то лучше их никуда не копировать, а помечать.
Обычно требующих отправки писем много меньше, чем всех остальных, и индекс будет великолепно работать.
А в некоторых СУБД (напр. oracle) его можно создавать ещё и только для тех записей, которые надо отправлять, т.е. не хранить
индексные записи для тех строк, которые уже отправлены -- индекс будет сам маленьким и будет работать ещё стремительнее.

Вообще, все эти желания что-то откуда-то удалять и переписывать в другие места -- это от технической безграмотности.
...
Рейтинг: 0 / 0
02.11.2015, 16:26
    #39092959
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
vadiminfoAkinaРасскажите начальнику, что существует такая фигня, как индексы. И что выборка по фиксированному значению из индекса выполняется очень быстро.

Вообще-то тут плохая селективность для обычных индексов (B - деревьев): конка принимает всего два значения. Т.е. тут нужны Битмап-индексы. Но они все же не очень хороши для БД оперативной обработки транзакций. Так что этот аргумент, скорее всего, все еще не очевиден.

вообще-то хорошая , с "отправлено"==1 будет 99% записей, но с "отправлено"==0 -- 1% записей. Это -- очень хорошая селективность.
...
Рейтинг: 0 / 0
02.11.2015, 16:30
    #39092963
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
MasterZivВообще, все эти желания что-то откуда-то удалять и переписывать в другие места -- это от технической безграмотности.
на чем основан такой вывод?
...
Рейтинг: 0 / 0
02.11.2015, 16:36
    #39092972
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
MasterZivvadiminfoпропущено...

Вообще-то тут плохая селективность для обычных индексов (B - деревьев): конка принимает всего два значения. Т.е. тут нужны Битмап-индексы. Но они все же не очень хороши для БД оперативной обработки транзакций. Так что этот аргумент, скорее всего, все еще не очевиден.

вообще-то хорошая , с "отправлено"==1 будет 99% записей, но с "отправлено"==0 -- 1% записей. Это -- очень хорошая селективность.
если функциональность оценивается по критериям "селективности", то это хороший признак "мусорного" решения. Даже если просто нужна куча для хранения отправленных писем, то мешать это все в одной куче с исходящими не стоит. У их даже набор реквизитов может быть разный.
...
Рейтинг: 0 / 0
02.11.2015, 16:40
    #39092980
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
Proga,

2
...
Рейтинг: 0 / 0
02.11.2015, 17:04
    #39093015
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спор про очередник
iscrafm,

подходы разработчиков и админов сильно различаются :)
главное не забыть про почтальона :)
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Спор про очередник / 25 сообщений из 68, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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