powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Шесть последних и шесть популярных
16 сообщений из 16, страница 1 из 1
Шесть последних и шесть популярных
    #39636495
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посоветуйте структуру таблиц и индексов

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


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

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

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

Шесть популярных - сделать аналого полной истории, только чистить раз в сутки ночью всё, что старше 2 недель?
...
Рейтинг: 0 / 0
Шесть последних и шесть популярных
    #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
Шесть последних и шесть популярных
    #39636512
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,
Я не разработчик, поэтому возможно я не прав, но я это так вижу.
Таблица дата, имя, форма.
Я бы сделал в качестве ключа кластерного, дата и имя.
Если вам нужно шесть последних для конкретного юзера, по нему будет работать быстро.
Самые популярные за две недели. В принципе тоже должен быстро отработать. Здесь вы в where задаете имя и дату, сгруппируете по form_id и посчитаете кол-во, потом выведете 6 самых популярных.
В зависимости от запросов, возможно есть смысл добавить индекс просто по имени. Зависит от того насколько оно уникально и будут ли еще запросы кроме тех двух что назвали вы.
...
Рейтинг: 0 / 0
Шесть последних и шесть популярных
    #39636520
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

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

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

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

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

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

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

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

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

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


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