Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Шесть последних и шесть популярных / 16 сообщений из 16, страница 1 из 1
26.04.2018, 07:23
    #39636495
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
Посоветуйте структуру таблиц и индексов

Юзер вызывает приложение - username, date, form_id - это уже храним в виде полной истории в обычной таблице.
Могу легко написать запросы к этой таблице, выбирающие Шесть последних вызванных им приложений и шесть популярных для него.
Но не чувствую, где будут тормоза и будут ли.
Сколько будет строк в полной истории - скажем, порядка десяти лямов. Сколько инсертов в час - до десяти тысяч. Цифры фонарные
...
Рейтинг: 0 / 0
26.04.2018, 07:52
    #39636506
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
поправил чуть


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

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

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

Шесть популярных - сделать аналого полной истории, только чистить раз в сутки ночью всё, что старше 2 недель?
...
Рейтинг: 0 / 0
26.04.2018, 08:08
    #39636510
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
andreymxПосоветуйте структуру таблиц и индексов
Поля таблицы:
- ИД пользователя, FK на таблицу пользователей
- Время события, дата-время
- Событие, текст, либо ИД события, FK на таблицу событий
Индекс:
- составной, (ИД пользователя,Время события)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Возможный текст запроса:
  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
...
Рейтинг: 0 / 0
26.04.2018, 08:09
    #39636512
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
andreymx,
Я не разработчик, поэтому возможно я не прав, но я это так вижу.
Таблица дата, имя, форма.
Я бы сделал в качестве ключа кластерного, дата и имя.
Если вам нужно шесть последних для конкретного юзера, по нему будет работать быстро.
Самые популярные за две недели. В принципе тоже должен быстро отработать. Здесь вы в where задаете имя и дату, сгруппируете по form_id и посчитаете кол-во, потом выведете 6 самых популярных.
В зависимости от запросов, возможно есть смысл добавить индекс просто по имени. Зависит от того насколько оно уникально и будут ли еще запросы кроме тех двух что назвали вы.
...
Рейтинг: 0 / 0
26.04.2018, 08:21
    #39636520
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
Akina,

Использовать ID пользователя как первый столбец в индексе, плохая идея.
...
Рейтинг: 0 / 0
26.04.2018, 08:25
    #39636525
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
aleksrovAkina,

Использовать ID пользователя как первый столбец в индексе, плохая идея.а чем плохо?
...
Рейтинг: 0 / 0
26.04.2018, 08:33
    #39636529
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
aleksrovЯ бы сделал в качестве ключа кластерного, дата и имя.
Если вам нужно шесть последних для конкретного юзера, по нему будет работать быстро.Если сделать первым дату - индекс практически не будет работать. Ведь выбираются записи для конкретного пользователя.

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

aleksrovИспользовать ID пользователя как первый столбец в индексе, плохая идея.??? обоснуй.
...
Рейтинг: 0 / 0
26.04.2018, 08:38
    #39636534
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
Akina,

Будут постоянные сплиты, это раз.
И два, с чего это он не будет работать? В особенности для второго запроса, за последнии две недели?
...
Рейтинг: 0 / 0
26.04.2018, 08:57
    #39636551
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
aleksrovВ особенности для второго запроса, за последнии две недели?
Читаем вопрос:
andreymxШесть последних вызванных им приложений и шесть популярных для него
Теперь ищем про "две недели", и находим:
andreymx Могу легко написать запросы к этой таблице, выбирающие Шесть последних вызванных им приложений и шесть популярных для него за последние две недели .
обращаем внимание на подчёркнутое. Понимаем, что за две недели автору не надо .
aleksrovБудут постоянные сплитыИ? особенно с учётом фильтрации по одному конкретному юзеру?
...
Рейтинг: 0 / 0
26.04.2018, 09:03
    #39636559
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
Akina,

Тогда согласен.
Но причем тут фильтрация и сплиты? При таком индексе тогда FillFactor для него не по умолчанию делать.
...
Рейтинг: 0 / 0
26.04.2018, 09:08
    #39636562
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
Akina,

сорри, есть дисбаланс между заголовком темы и хотелками
нужны шесть самых популярных именно за последние две недели
...
Рейтинг: 0 / 0
26.04.2018, 09:26
    #39636570
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
Попробывал.
Создал таблицу, 10 лямов, 30 пользваотелей, 15 приложений, временной промежуток год.
SQL делает seek что в варианте с User первый, что с Date, планы одинаковые. Но с Date в три раза медленнее выполняется и делает в 10 раз больше лог. чтений.
Акина прав.
Но в таком случае тогда Fillfactor не по умолчанию нужно ставить.
...
Рейтинг: 0 / 0
26.04.2018, 09:27
    #39636572
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
andreymxнужны шесть самых популярных именно за последние две неделиНу ещё одно условие во WHERE... на что это влияет-то?
aleksrovНо причем тут фильтрация и сплиты?Про сплиты как бы не я заговорил. Что же до фильтрации... чтобы выбрать последние, нужна сортировка, а она выполняется после фильтрации.
В первом приближении (фиг знает, как на самом деле будет всё нужное делать сервер):
- если первым в индексе стоИт юзер - сервер читает немножко блоков из индекса для заданного юзера, причём уже сортированных по дате, и последовательно выгребает записи в порядке уменьшения даты, фильтруя дубликаты (если задано найти уникальные приложения).
- если первой стоИт дата - сервер будет читать дофига блоков, фильтруя юзеров (и, если задано, приложения).
...
Рейтинг: 0 / 0
26.04.2018, 09:51
    #39636588
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
Akina,

Понятно. Здесь зависит сколько данных есть в каком блоке. Если юзер работает уже пять лет и для него очень много записей, то возможно вариант сначала выбрать за две недели а потом по по юзеру будет быстрее, чем просто по юзеру.
Попробывал кстати вставку. Вставил 10 000 строк, 80 сплитов, по времени на процентов 20 где-то медленее. Поставил FillFactor 90, 2 сплита, скорость такая же как и без сплитов. Но у автора, опять же примерно, это кол-во вставок за час, а не за минуту.
Вывод. Как посоветовали вы и FillFactor 90.
...
Рейтинг: 0 / 0
26.04.2018, 10:25
    #39636603
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
aleksrovЕсли юзер работает уже пять лет и для него очень много записей, то возможно вариант сначала выбрать за две недели а потом по по юзеру будет быстрее, чем просто по юзеру.Сильно сомневаюсь.
...
Рейтинг: 0 / 0
26.04.2018, 11:18
    #39636630
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Шесть последних и шесть популярных
Akina,

Попробывал, 30% строк все один пользватель, разницы практически нет, если за последнии две недели считай работал этот юзер.
Блин, я ужасно тупил.
Все логично. Если у нас индекс по юзеру, и мы ищем за последнии две недели, sql точно также смотрит промежуточный уровень, данные сначала идут по юзеру, потом дате, он смотрит на какой странице начинаются эти последнии две недели, так как второй столбец тоже есть в промежуточном уровне, и начинает оттуда читать. Он не сканит все страницы для юзера (я почему то думал что он сделает именно это) Итог 140 чтений.
Если же дата первая... Я начала добавлять данные за последнии две недели для разных пользователей, чем больше добавлял, тем больше было чтений, и это логично. В промежуточном уровне указана минимальная дате на странице и связаный с ней юзер, так как наш юзер "раскидан" по всем страницам, sql должен прочитать все данные за последнии две недели.
Вобщем я ошибался, спасибо :)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Шесть последних и шесть популярных / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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