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

Откуда: Запорожье
Сообщений: 54189
Посоветуйте структуру таблиц и индексов

Юзер вызывает приложение - username, date, form_id - это уже храним в виде полной истории в обычной таблице.
Могу легко написать запросы к этой таблице, выбирающие Шесть последних вызванных им приложений и шесть популярных для него.
Но не чувствую, где будут тормоза и будут ли.
Сколько будет строк в полной истории - скажем, порядка десяти лямов. Сколько инсертов в час - до десяти тысяч. Цифры фонарные
26 апр 18, 07:23    [21369789]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54189
поправил чуть


Посоветуйте структуру таблиц и индексов

Юзер вызывает приложение - username, date, form_id - это уже храним в виде полной истории в обычной таблице.
Могу легко написать запросы к этой таблице, выбирающие Шесть последних вызванных им приложений и шесть популярных для него за последние две недели.
Но не чувствую, где будут тормоза и будут ли.
Сколько будет строк в полной истории - скажем, порядка десяти лямов. Сколько инсертов в час - до десяти тысяч. Цифры фонарные
Какие нужны индексы, или вообще новые таблицы

История - шесть последних - может, вообще строкой хранить?
usernnameList_Form_id
Вася1,2,3,4,5,6
Петя1,3,2,5,8
Тогда при вставке истории читаем строку, отрезаем последний элемент, вставляем спереди самый свежий

Шесть популярных - сделать аналого полной истории, только чистить раз в сутки ночью всё, что старше 2 недель?
26 апр 18, 07:52    [21369814]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20532
andreymx
Посоветуйте структуру таблиц и индексов

Поля таблицы:
- ИД пользователя, FK на таблицу пользователей
- Время события, дата-время
- Событие, текст, либо ИД события, FK на таблицу событий
Индекс:
- составной, (ИД пользователя,Время события)
Возможный текст запроса:
  SELECT TOP 6 [Событие], 'Последние' [type]
  FROM [table]
  WHERE [ИД пользователя] = @ИД_пользователя
  ORDER BY [Время события] DESC
UNION ALL
  SELECT TOP 6 /* WITH TIES */ [Событие], 'Популярные'
  FROM [table]
  WHERE [ИД пользователя] = @ИД_пользователя
  GROUP BY [Событие]
  ORDER BY COUNT(*) DESC
26 апр 18, 08:08    [21369827]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
aleksrov
Member

Откуда:
Сообщений: 948
andreymx,
Я не разработчик, поэтому возможно я не прав, но я это так вижу.
Таблица дата, имя, форма.
Я бы сделал в качестве ключа кластерного, дата и имя.
Если вам нужно шесть последних для конкретного юзера, по нему будет работать быстро.
Самые популярные за две недели. В принципе тоже должен быстро отработать. Здесь вы в where задаете имя и дату, сгруппируете по form_id и посчитаете кол-во, потом выведете 6 самых популярных.
В зависимости от запросов, возможно есть смысл добавить индекс просто по имени. Зависит от того насколько оно уникально и будут ли еще запросы кроме тех двух что назвали вы.
26 апр 18, 08:09    [21369829]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
aleksrov
Member

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

Использовать ID пользователя как первый столбец в индексе, плохая идея.
26 апр 18, 08:21    [21369844]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54189
aleksrov
Akina,

Использовать ID пользователя как первый столбец в индексе, плохая идея.
а чем плохо?
26 апр 18, 08:25    [21369856]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20532
aleksrov
Я бы сделал в качестве ключа кластерного, дата и имя.
Если вам нужно шесть последних для конкретного юзера, по нему будет работать быстро.
Если сделать первым дату - индекс практически не будет работать. Ведь выбираются записи для конкретного пользователя.

andreymx, в принципе, можно рассмотреть предрасчёт "популярности" - таблица (юзер-событие-количество, индекс юзер-количество), обновляемая триггером на таблице журнала событий. И получать вторую суб-выборку из этой таблицы.

aleksrov
Использовать ID пользователя как первый столбец в индексе, плохая идея.
??? обоснуй.
26 апр 18, 08:33    [21369867]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
aleksrov
Member

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

Будут постоянные сплиты, это раз.
И два, с чего это он не будет работать? В особенности для второго запроса, за последнии две недели?
26 апр 18, 08:38    [21369879]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20532
aleksrov
В особенности для второго запроса, за последнии две недели?

Читаем вопрос:
andreymx
Шесть последних вызванных им приложений и шесть популярных для него

Теперь ищем про "две недели", и находим:
andreymx
Могу легко написать запросы к этой таблице, выбирающие Шесть последних вызванных им приложений и шесть популярных для него за последние две недели.

обращаем внимание на подчёркнутое. Понимаем, что за две недели автору не надо.
aleksrov
Будут постоянные сплиты
И? особенно с учётом фильтрации по одному конкретному юзеру?
26 апр 18, 08:57    [21369924]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
aleksrov
Member

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

Тогда согласен.
Но причем тут фильтрация и сплиты? При таком индексе тогда FillFactor для него не по умолчанию делать.
26 апр 18, 09:03    [21369946]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54189
Akina,

сорри, есть дисбаланс между заголовком темы и хотелками
нужны шесть самых популярных именно за последние две недели
26 апр 18, 09:08    [21369956]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Попробывал.
Создал таблицу, 10 лямов, 30 пользваотелей, 15 приложений, временной промежуток год.
SQL делает seek что в варианте с User первый, что с Date, планы одинаковые. Но с Date в три раза медленнее выполняется и делает в 10 раз больше лог. чтений.
Акина прав.
Но в таком случае тогда Fillfactor не по умолчанию нужно ставить.
26 апр 18, 09:26    [21370003]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20532
andreymx
нужны шесть самых популярных именно за последние две недели
Ну ещё одно условие во WHERE... на что это влияет-то?
aleksrov
Но причем тут фильтрация и сплиты?
Про сплиты как бы не я заговорил. Что же до фильтрации... чтобы выбрать последние, нужна сортировка, а она выполняется после фильтрации.
В первом приближении (фиг знает, как на самом деле будет всё нужное делать сервер):
- если первым в индексе стоИт юзер - сервер читает немножко блоков из индекса для заданного юзера, причём уже сортированных по дате, и последовательно выгребает записи в порядке уменьшения даты, фильтруя дубликаты (если задано найти уникальные приложения).
- если первой стоИт дата - сервер будет читать дофига блоков, фильтруя юзеров (и, если задано, приложения).
26 апр 18, 09:27    [21370005]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
aleksrov
Member

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

Понятно. Здесь зависит сколько данных есть в каком блоке. Если юзер работает уже пять лет и для него очень много записей, то возможно вариант сначала выбрать за две недели а потом по по юзеру будет быстрее, чем просто по юзеру.
Попробывал кстати вставку. Вставил 10 000 строк, 80 сплитов, по времени на процентов 20 где-то медленее. Поставил FillFactor 90, 2 сплита, скорость такая же как и без сплитов. Но у автора, опять же примерно, это кол-во вставок за час, а не за минуту.
Вывод. Как посоветовали вы и FillFactor 90.
26 апр 18, 09:51    [21370072]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20532
aleksrov
Если юзер работает уже пять лет и для него очень много записей, то возможно вариант сначала выбрать за две недели а потом по по юзеру будет быстрее, чем просто по юзеру.
Сильно сомневаюсь.
26 апр 18, 10:25    [21370147]     Ответить | Цитировать Сообщить модератору
 Re: Шесть последних и шесть популярных  [new]
aleksrov
Member

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

Попробывал, 30% строк все один пользватель, разницы практически нет, если за последнии две недели считай работал этот юзер.
Блин, я ужасно тупил.
Все логично. Если у нас индекс по юзеру, и мы ищем за последнии две недели, sql точно также смотрит промежуточный уровень, данные сначала идут по юзеру, потом дате, он смотрит на какой странице начинаются эти последнии две недели, так как второй столбец тоже есть в промежуточном уровне, и начинает оттуда читать. Он не сканит все страницы для юзера (я почему то думал что он сделает именно это) Итог 140 чтений.
Если же дата первая... Я начала добавлять данные за последнии две недели для разных пользователей, чем больше добавлял, тем больше было чтений, и это логично. В промежуточном уровне указана минимальная дате на странице и связаный с ней юзер, так как наш юзер "раскидан" по всем страницам, sql должен прочитать все данные за последнии две недели.
Вобщем я ошибался, спасибо :)
26 апр 18, 11:18    [21370311]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить