Имя: Пароль:
IT
Админ
SQL. Оптимизировать ещё один запрос
,
0 DirecTwiX
 
21.03.13
20:07
На этот раз, надеюсь, последний)
До этой ветки была SQL. Помогите оптимизировать запрос с следующим запросом:

SELECT
   A,
   COUNT(*) AS Cnt
FROM
   (SELECT
       A
   FROM
       tbl
   LIMIT 8000000) a  
GROUP BY
   A
ORDER BY
   Cnt DESC
LIMIT 10

Суть простая - получить самые популярные элементы. Чтобы быстро выполнять такой запрос можно сделать таблицу итогов, где считать количество..

Но основной запрос имеет следующуу форму:

SELECT
   A,
   COUNT(*) AS Cnt
FROM
   (SELECT
       A
   FROM
       tbl
   WHERE
       B = :B
   LIMIT 8000000) a  
GROUP BY
   A
ORDER BY
   Cnt DESC
LIMIT 10

Суть немного изменилась, но всё равно осталась простой - Самые популярные элементы среди :B.
Выполняется он тоже небыстро, нужно что-то придумать)
У каждого :B в среднем 250 А.

Таблицу итогов тут сделать сложно физически. Её размер будет превышать исходную таблицу в 250*250 в среднем, что никуда не годится. Да и запись/удаление будут выполняться очень затратно.
Идеи?)
1 DirecTwiX
 
21.03.13
20:09
Косяк... Неправильно последний запрос написал..
2 DirecTwiX
 
21.03.13
20:11
Вот второй запрос:


SELECT
   A,
   COUNT(*) AS Cnt
FROM
   (SELECT
       A
   FROM
       tbl
   WHERE
       owner_id IN (SELECT DISTINCT owner_id FROM tbl WHERE A=:A)
   ) a  
GROUP BY
   A
ORDER BY
   Cnt DESC
LIMIT 10

Суть немного другая - самые популярные элементы среди пользователей, у которых есть :A среди элементов.

Если несложно, можно переместить в шапку? Спасибо
3 DirecTwiX
 
21.03.13
20:12
сО следующим запросом*
Тоже просьба поправить)
4 Demiurg
 
21.03.13
20:29
зачем вы хотите вернуть 8 миллионов строк?
5 ILM
 
гуру
21.03.13
20:34
(9) Когда 8 миллиардов пользователей, то почему бы и не вернуть 8 миллионов самых популярных элементов.

Ох, маркетолухи, они такие олухи. Я бы не возвращал, даже глядя по 100 штук в секунду, им понадобиться очень много времени (дня три не меньше).
6 DirecTwiX
 
21.03.13
21:05
(4) 8млн  для  отладки (не хочу ждать несколько десятков минут). В  идеале надо все.
7 DirecTwiX
 
21.03.13
21:06
(5)  Пользователей  меньше, в 250  раз  примерно)
8 КонецЦикла
 
21.03.13
21:36
Такой запрос выполняется очень часто?
Заведи колонку "популярность" и не ипи моск
Можно триггер повесить на запись
9 DirecTwiX
 
21.03.13
22:41
(8) Планируется выполнять его очень часто
Как же такую колонку завести? Проблема в условии "самые популярные элементы среди пользователей, у которых есть :A среди элементов"
10 КонецЦикла
 
21.03.13
22:47
(9) А это типа @А? Т.е. типа переменная?
Иди ищи Glory на SQL.ru, он умный :)
11 DirecTwiX
 
21.03.13
22:58
(10) Да, переменная)
Ещё с научником на эту тему буду говорить) Надеюсь на что-нибудь умное)
12 КонецЦикла
 
21.03.13
23:06
(11) У тебя там "Управление планетой Земля"?
Отпишись, интересно
13 Sorm
 
21.03.13
23:48
(2) Мда... Используешь IN и спрашиваешь - "а че так долго?". Ниче, что "SELECT DISTINCT owner_id FROM tbl WHERE A=:A" выполнится для каждой строки "верхней" таблицы? Никаких IN при работе с большим количеством данных, только джойны по индексированным таблицам.
14 DirecTwiX
 
21.03.13
23:55
(12) Придумал сайт, верю что взлетит)
Идея самая что ни на есть простая)

(13) У себя реализовано через джоин - этот писал от руки сразу в форум)
Но за информацию спасибо. Соединяю по user_id, индекс на нём имеется. Норм?
15 Sorm
 
22.03.13
00:14
(14) " У себя реализовано через джоин - этот писал от руки сразу в форум" - своебразная постановка задач.
16 DirecTwiX
 
22.03.13
01:07
(15) Главное - суть. Я же новую сструктуру пытаюсь придумать)
17 КонецЦикла
 
22.03.13
02:46
(14) А чо там? Секрет?
Кол-во пользователей как абонентов у приличного оператора сотовой связи
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший