Кааак же я давно на SQL запросы не писал, во как красиво получилось
Потом объясню нафига он нужен
Upd 1: запрос подрос, это вам не животных кормить
Upd 2: запрос стал неприлично большим
Upd 3: Я НЕНАВИЖУ ЭТО ЗАПРОС он выполняется 12.2704 СЕКУНД
во так красивее
paste.org.ru/?vw900tчитать дальше
select idclass, SUM( p2.v * webdata.weight ), p2.v
from webdata ,
(
select words.idword, words.count/wordInFile.count* LN(fileCount.count/docWithWord.count) as v from
(select idword, count from filedata where idfile=22 ) as words
,
(
select idword
from fileData left join word on fileData.idword = word.id
group by idWord
having count(*)<150
order by count(*) desc
) as n1,
select sum(count) as count
from
(select idword, count from filedata where idfile=22 ) as n1
,
(
select idword
from fileData left join word on fileData.idword = word.id
group by idWord
having count(*)<150
order by count(*) desc
) as n2
where n1.idword = n2.idword
) as wordInFile,
(select idword as c, count(*) as count from filedata group by idword) as docWithWord,
(select count(*) as count from file) as fileCount
,
(
select SQRT( SUM( POW( words.count/wordInFile.count* LN(fileCount.count/docWithWord.count) ,2 ) ) ) from
(select idword, count from filedata where idfile=22 ) as words
,
(
select idword
from fileData left join word on fileData.idword = word.id
group by idWord
having count(*)<150
order by count(*) desc
) as n1,
(
select sum(count) as count
from
(select idword, count from filedata where idfile=22 ) as n1
,
(
select idword
from fileData left join word on fileData.idword = word.id
group by idWord
having count(*)<150
order by count(*) desc
) as n2
where n1.idword = n2.idword
) as wordInFile,
(select idword as c, count(*) as count from filedata group by idword) as docWithWord,
(select count(*) as count from file) as fileCount
where
words.idword = n1.idword and
docWithWord.c = words.idword
) as m2
where
words.idword = n1.idword and
docWithWord.c = words.idword
) as p2
where webdata.idword = p2.idword
group by idclass
Экспериментальный запрос у нас недавно выполнялся 1153 секунды. Есть стойкое ощущение, что в одной из девяти таблиц, участвующих в выборке забыли индекс
ЗЫ исходя из моего опыта подобное лучше разбить на отдельный запросы. Быстре будет работать.
ну мне надо его вызывать каждый раз для каждого файла
файлов в базе пока 690 и это меня реально не прикалывает т.к. запрос надо обязательно улучшать
попробую сделать что ты посоветовал
индексы оказались установлены т.к. мне нужны значения ключей и вторичных ключей
второй select, заканчивающийся в низу, в as p2 , выполняется 1.2 секунды
без group by весь запрос будет 2 сек. занимать
а без SUM в самом верхнем select тоже около 2 сек
значит ему 12768 умножений и сложений так тяжело даются, это тупик ?
EXPLAIN показывает
Практика показывает что выборка через временную таблицу будет быстрее, нежели через вложенные запросы. Плюс в ней ты можешь сделать индексы перед выборкой.
не, все спасибо, нашел ошибки
1) where webdata.idword = p2.idword - тут должен браться не p2.idword а select words.idword as thisId
2) содержание таблицы webdata было не верным т.е. были поля которых быть не должно
3) замена where на INNER JOIN увеличила скорость
итого выполняется за 2 сек