Имя: Пароль:
IT
 
SQL. Время запроса увеличивается непропрорционально.
,
0 DirecTwiX
 
17.03.13
14:26
Запрос типа:
SELECT at.T, aa.A, Cnt FROM (SELECT T_id, A_id, COUNT(*) AS Cnt FROM (SELECT T_id, A_id FROM audio limit 8000000) a  GROUP BY A_id, T_id HAVING Cnt>1 ORDER BY Cnt DESC LIMIT ".$n.") q1
           INNER JOIN a_T at ON q1.T_id=at.id
           INNER JOIN a_T aa ON q1.A_id=aa.id

На A_id, T_id есть составной индекс, который работает)
Во внутреннем запросе есть число, которое я и изменяю. Картина следующая:
500к - 0.36
1кк - 0.77
2кк - 1,7
4кк - 3,44
8кк - 62

Первый раз запрос с 4кк тоже выдал 60 секунд, но повторные начали выполняться за 3,44.

Куда копать, может кто знает?)
1 GANR
 
17.03.13
14:47
Во второй раз работает быстрее, так как СУБД использует кэш. Возможно, при 8К СУБД просто не делает и не использует кэш, так как иначе забьется вся оперативная память.
2 DirecTwiX
 
17.03.13
15:20
Грусть.. А я уже обрадовался, что запросы достаточно быстро выполняются.
Спасибо
3 GANR
 
17.03.13
17:43
(2) Возможно, если покрутить настройки СУБД, то она даст такой большой кэш. Но я лично, не знаю что именно делать, может тут http://sql-ex.ru/ прольют свет на проблему.
4 bahmet
 
17.03.13
17:53
Запрос какой то извратный. Попахивает отсутствием понимание что и как храним и для чего.
5 GANR
 
17.03.13
17:59
(4) да это эксперимент, имхо, рабочий запрос не надо в ветку выкладывать - там поди от 100 строк
6 DirecTwiX
 
17.03.13
21:07
(4) А что извратного то? Да, первый селект может лишний, а так всё норм - обычный селект с джойнами
7 acsent
 
17.03.13
21:12
пиши запросы в 1с форматировании, а то же нихрена не понятно про что там
8 Demiurg
 
18.03.13
01:54
(0) в подобных вопросах принято показывать планы запроса у хорошего и плохого вариантов...
9 DirecTwiX
 
18.03.13
08:10
(8) Планы?
10 Лефмихалыч
 
18.03.13
08:41
(0) запрос говно и дело не в индексах.
1. Используй временные таблицы.
2. Нафига, вот нафига в самом внетреннем запросе выгребать все данные, если тебе нужны только DISTINCT?
3. Зачем два inner join с одной и той же таблицей? Один надо удалить и, если она не большая, то это соединение имеет смысл перенести в самый внутренний селект, где 8 млн
11 DirecTwiX
 
18.03.13
13:55
1. Это может сократить время в моём случае? Что-то сомневаюсь
2. Там итак все различные (по построению таблицы)
3. Таблицы разные - описался, когда на форум вставлял
Какой смысл переносить соединение внутрь вообще? Если на входе миллионы строк, а на выходе до 1000?
12 Demiurg
 
18.03.13
19:02
(9) да, планы, не знакомые слова что ли?
13 DirecTwiX
 
18.03.13
21:14
(12) Планы таблиц не знакомы)
14 DirecTwiX
 
18.03.13
22:11
Или это озночает состав?
Все id - int
Через соединение VARCHAR прикрепляю
15 фобка
 
18.03.13
23:07
sql serv использует не только кэш, но и статистики.
1. 60 сек на запрос это много.
2. Зачем здесь нужен OrderBy?
16 sapphire
 
18.03.13
23:19
(0) Переписать запрос
17 bahmet
 
18.03.13
23:45
Более того, переписывать структуру и обслуживающий персонал менять)
18 bahmet
 
18.03.13
23:47
Для начала выкинь нах свой самый внутренний запрос на 8 млн
19 DirecTwiX
 
19.03.13
00:13
(15)
1. Знаю)
2. Нужно отсортировать по популярности

(16) Да как его переписать - он и так примитвнейший
(17) Над структурой думал, но размер базы вырастет минимум в 10000 раз

(18) Чтобы я по десять минут ждал?
20 КонецЦикла
 
19.03.13
00:24
Чего ваяешь?
Работаешь со своей структурой данных или лезешь в чужую?
Засыпал всех каверзными вопросами, может просто почитать-подумать?
21 bahmet
 
19.03.13
01:00
(19) а ты запрос наваял чтоб чтото осмыленное получить или хоть бы, главное быстро?)
Без знания природы полей, колва значений их, дисперсии и прочего, можно лишь посоветовать ТСу сидеть в конфигураторе 1с и не рыпаться
22 DirecTwiX
 
19.03.13
01:15
(20) Своя структура.
Ваяю сайт. Суть такова: есть люди, у них есть "предпочтения" (предпочтение = комбинация двух значений id, по которым и группирую). Таблица имеет вид:
id1, id2, user_id

У пользователя в среднем 200 предпочтений

Нужно найти самые популярные предпочтения

(21) Осмысленное конечно) И быстр надо