|
|
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
Предистория. Пилю очередник отправки писем и смс. Структура таблиц содержит весь набор полей необходимый для отправки, т.е. полностью независимый сервис. Количество строк в таблице - миллионы. Размерность некоторых полей nvarchar(4000). Так вот вопрос. Как лучше сделать? 1) Создать таблицу с битовым полем(флаг отправки) и при успешной отправки сообщения взводить 1. Сервис для выборки необработанных сообщений пользуется этим полем, где флаг отправки -0. За такую структуру выступаю я. Либо. Сделать таблицу и туда складывать всё то, что должно быть отправлено, а уже при успешной отправки перекидывать отработанные строки в другую таблицу, отправленных. Тогда выборка необработанных будет не по миллионной таблице, а по маленькой. Это выбор моего начальника. Аргументы у нас с ним разные. И мы решили поспорить, что лучше. И решили свой спор вынести на SQL.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 12:22 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
Расскажите начальнику, что существует такая фигня, как индексы. И что выборка по фиксированному значению из индекса выполняется очень быстро. Модератор: Тема перенесена из форума "Microsoft SQL Server". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 12:31 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
AkinaРасскажите начальнику, что существует такая фигня, как индексы. И что выборка по фиксированному значению из индекса выполняется очень быстро. Модератор: Тема перенесена из форума "Microsoft SQL Server". Ему этого мало. Я развернул свои аргументы в более развёрнутой форме, но здесь не хочу про это писать. Нужны чёткие аргументы в пользу конкретного подхода именно от сообщества SQL.RU. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 12:37 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
ProgaAkinaРасскажите начальнику, что существует такая фигня, как индексы. И что выборка по фиксированному значению из индекса выполняется очень быстро. Модератор: Тема перенесена из форума "Microsoft SQL Server". Ему этого мало. Я развернул свои аргументы в более развёрнутой форме, но здесь не хочу про это писать. Нужны чёткие аргументы в пользу конкретного подхода именно от сообщества SQL.RU. Четкий аргумент только практика. Сделайте тестовый стенд. Проведите на нем нагрузочное тестирование обеих вариантов. И по результатам сделайте выбор. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 14:35 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
ProgaТак вот вопрос. Как лучше сделать? Во-первых, этот вопрос имхо вообще не очень важен. Зависит, конечно, от вашей специфики, но если это вспомогательная функция - что скорее всего - и миллионы записей вообще, а не в час, то в общем любое решение будет приемлемым, да и переделать, если захочется, будет нетрудно. Первое соображение, которое я принял бы в расчёт - перенос. Если запись достаточно большая и траффик достаточно большой, то на каждую операцию делать паразитные delete N байт и insert N байт - становится довольно большой нагрузкой на базу. Это касается как решения "сделать таблицу", так и более вменяемых - например, партиционирования по битовому флагу. По этому соображению Ваш подход, безусловно, выигрывает. Второе соображение - выборка неотправленных. Этот запрос должен выбирать примерно 1 / (кол-во дней * кол-во циклов отправки в день), то есть малое относительно размера таблицы количество записей. Здесь я задал бы два вопроса: во-первых, как партиционированы данные по времени и во-вторых, как они физически размещаются на диске. Если записи ложатся на диск более-менее в естественном порядке, то неотправленные записи будут склонны кластеризироваться (сбиваться в кучу в конце таблицы). Это означает, что индекс по ним будет эффективным средством доступа (даже если число логических чтений окажется велико, физических будет довольно мало). Вы, я так понял, говорите про MSSQL. Сколь мне помнится, в нём поддерживаются частичные индексы, а значит, можно сделать индекс только по неотправленным записям и наслаждаться. Если записи ложатся на диск вразнобой (ну скажем, если вы делаете clustered key по guid pk), то индекс становится менее эффективным. Впрочем, скорее всего, он всё равно останется лучшим решением, нежели full table scan. Решение начальника имеет некоторое преимущество в этом моменте, поскольку позволит читать неотправленные без индекса, с помощью многоблочных чтений. Но выигрыш будет сравнительно скромен, постоянные записи из таблицы в таблицу его съедят и не заметят. Кроме того, индексные решения позволят выбирать записи по одной, без "пройди всю выборку от начала до конца"; это удобно если, например, вы заходите сделать несколько независимых экземпляров отправщика, работающих по общей очереди. Наконец, совершенно очевидно, что статусов "послан" и "не послан" недостаточно для хорошей реализации этой функциональности. Примерный набор необходимых статусов такой: успешно отправлен ждёт отправки находится в процессе отправки (может быть решено блокировкой, но для MS это вряд ли хороший вариант) невозможно отправить, перманентная ошибка доставки не удалось отправить, повторить попытку после заданного промежутка времени Если же кроме отправки надо контролировать ещё и доставку, набор статусов сообразно увеличивается. Итого - я советовал бы доработать постановку и затем решение без переноса данных, с флагом или типа того. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 14:42 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
AkinaРасскажите начальнику, что существует такая фигня, как индексы. И что выборка по фиксированному значению из индекса выполняется очень быстро. Вообще-то тут плохая селективность для обычных индексов (B - деревьев): конка принимает всего два значения. Т.е. тут нужны Битмап-индексы. Но они все же не очень хороши для БД оперативной обработки транзакций. Так что этот аргумент, скорее всего, все еще не очевиден. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 14:53 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
ProgaСделать таблицу и туда складывать всё то, что должно быть отправлено, а уже при успешной отправки перекидывать отработанные строки в другую таблицу, отправленных. Тогда выборка необработанных будет не по миллионной таблице, а по маленькой. я бы сделал конечно так. И дело не в возможностях индексов, а в том что не нужно объединять в одной куче логически не объединяемое. У них общее только то, что оба объекты являются сообщениями (письмами). Но функции обработки списков у них совершенно разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 15:11 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
vadiminfoВообще-то тут плохая селективность для обычных индексов (B - деревьев): конка принимает всего два значения. Т.е. тут нужны Битмап-индексы. Вадиииим :( Тут перекошенное (skewed) распределение. Для sent = false селективность будет очень даже неплохой, во всяком случае на это стоит надеяться :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 15:14 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
в дополнение... в таблице "не отправленных" полезно иметь статус по какой причине запись там находится. По умолчанию это конечно "новая", но если были какие-то проблемы с отправкой, то заполняить это поле соответствующим статусом. p.s. выше примерно об этом речь шла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 15:15 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
ProgaТак вот вопрос. Как лучше сделать? Да, ну и забыл упомянуть - рано или поздно на эту таблицу захочется повесить внешний ключ, и решения "перекладывать из таблички в табличку", как у них водится, сядут в лужу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 15:16 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
softwarerТут перекошенное (skewed) распределение. Для sent = false селективность будет очень даже неплохой K.I.S.S. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 15:17 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
softwarerProgaТак вот вопрос. Как лучше сделать? Да, ну и забыл упомянуть - рано или поздно на эту таблицу захочется повесить внешний ключ, и решения "перекладывать из таблички в табличку", как у них водится, сядут в лужу. кому захочется и зачем? тебе что-ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 15:19 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
iscrafmK.I.S.S. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 15:22 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
softwarer, ты свою тупость и ранее показывал, но здесь в очередной раз подтверждаешь что являешься обычным программером-мужланом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 15:25 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
Валер, то, что ты пустое трепло, способное только прийти в топик и нагадить, давно известно всему форуму. Шёл бы ты в привычную тебе среду обитания. Соревноваться с тобой в хамстве я не собираюсь, а в тупости - так и не смогу, пожалуй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 15:32 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
softwarer, выше все сказано 18359602 тупица. Если не в состоянии отвечать на вопросы 18359660 , то просто игнорируй их, вместо подкладывания роликов не по теме. То что ты возвышенный на этом форуме гопник тоже известно давно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 15:38 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
iscrafmвыше все сказано 18359602 У тебя мания величия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 15:41 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
Proga, в такой задаче разница в объемах "исходящие" и "отправленные" - многие порядки. К тому же наборы функций для обработки у них кардинально отличаются. К тому же, со временем, "отправленные" ("входящие") возможно потребуется архивировать. В общем множество причин говорить о них, как о разных списках. Просто много лет подобная задача работает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 15:56 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
softwareriscrafmвыше все сказано 18359602 У тебя мания величия. есть повод для этого, хотя мании конечно нет. Но тупость кодеров, возводимая в разряд истины, достает иногда. Ты прав. Представь себе поставленную задачу для начала, а потом уже умничай про индексы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 16:01 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
ProgaПредистория. Пилю очередник отправки писем и смс. Структура таблиц содержит весь набор полей необходимый для отправки, т.е. полностью независимый сервис. Количество строк в таблице - миллионы. Размерность некоторых полей nvarchar(4000). Так вот вопрос. Как лучше сделать? 1) Создать таблицу с битовым полем(флаг отправки) и при успешной отправки сообщения взводить 1. Сервис для выборки необработанных сообщений пользуется этим полем, где флаг отправки -0. За такую структуру выступаю я. Либо. Сделать таблицу и туда складывать всё то, что должно быть отправлено, а уже при успешной отправки перекидывать отработанные строки в другую таблицу, отправленных. Тогда выборка необработанных будет не по миллионной таблице, а по маленькой. Это выбор моего начальника. Аргументы у нас с ним разные. И мы решили поспорить, что лучше. И решили свой спор вынести на SQL.ru Вообще-то говоря, пофигу, если создать индекс по критерию необходимости отправки. И если хранить данные по отправленным письмам нужно, то лучше их никуда не копировать, а помечать. Обычно требующих отправки писем много меньше, чем всех остальных, и индекс будет великолепно работать. А в некоторых СУБД (напр. oracle) его можно создавать ещё и только для тех записей, которые надо отправлять, т.е. не хранить индексные записи для тех строк, которые уже отправлены -- индекс будет сам маленьким и будет работать ещё стремительнее. Вообще, все эти желания что-то откуда-то удалять и переписывать в другие места -- это от технической безграмотности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 16:24 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
vadiminfoAkinaРасскажите начальнику, что существует такая фигня, как индексы. И что выборка по фиксированному значению из индекса выполняется очень быстро. Вообще-то тут плохая селективность для обычных индексов (B - деревьев): конка принимает всего два значения. Т.е. тут нужны Битмап-индексы. Но они все же не очень хороши для БД оперативной обработки транзакций. Так что этот аргумент, скорее всего, все еще не очевиден. вообще-то хорошая , с "отправлено"==1 будет 99% записей, но с "отправлено"==0 -- 1% записей. Это -- очень хорошая селективность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 16:26 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
MasterZivВообще, все эти желания что-то откуда-то удалять и переписывать в другие места -- это от технической безграмотности. на чем основан такой вывод? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 16:30 |
|
||
|
Спор про очередник
|
|||
|---|---|---|---|
|
#18+
MasterZivvadiminfoпропущено... Вообще-то тут плохая селективность для обычных индексов (B - деревьев): конка принимает всего два значения. Т.е. тут нужны Битмап-индексы. Но они все же не очень хороши для БД оперативной обработки транзакций. Так что этот аргумент, скорее всего, все еще не очевиден. вообще-то хорошая , с "отправлено"==1 будет 99% записей, но с "отправлено"==0 -- 1% записей. Это -- очень хорошая селективность. если функциональность оценивается по критериям "селективности", то это хороший признак "мусорного" решения. Даже если просто нужна куча для хранения отправленных писем, то мешать это все в одной куче с исходящими не стоит. У их даже набор реквизитов может быть разный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2015, 16:36 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=39092963&tid=1540445]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
69ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 10ms |
| total: | 187ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...