powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос INNER JOIN
4 сообщений из 4, страница 1 из 1
Как оптимизировать запрос INNER JOIN
    #40131013
user999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Пишу запрос к БД, в которую загрузил сырые данные из Яндекс.Метрики.
Выбираю количество просмотров и количество визитов, что бы посчитать среднюю глубину просмотров.
Конечно можно это сделать и другими способами, но это в учебных целях, поэтому прошу отнестись с пониманием.
Если я делаю запросы
Код: sql
1.
2.
3.
SELECT hits."watchID" as y1, TO_CHAR(hits."dateTime", 'YY.MM') as x
FROM hits
WHERE hits."dateTime" >= '2013-07-01' AND hits."dateTime" <= '2013-08-31'


и
Код: sql
1.
2.
3.
SELECT visits."visitID" as y2, TO_CHAR(visits."dateTime", 'YY.MM') as x
FROM visits
WHERE visits."dateTime" >=  '2013-07-01' AND visits."dateTime" <=  '2013-08-30'


То они выполняются за 318 и 100 мс соответственно.
Но когда я их объединяю
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT (COUNT(DISTINCT y1) / COUNT(DISTINCT y2)) AS avr_hits, x
FROM (
	SELECT hits."watchID" AS y1, visits."visitID" AS y2, TO_CHAR(hits."dateTime", 'YY.MM') AS x
	FROM hits INNER JOIN visits
	ON TO_CHAR(hits."dateTime", 'YY.MM') =  TO_CHAR(visits."dateTime", 'YY.MM')
	WHERE hits."dateTime" >= '2013-07-01' AND hits."dateTime" <= '2013-08-30' 
	AND visits."dateTime" >=  '2013-07-01' AND visits."dateTime" <=  '2013-08-30'
	) AS temp_tab
GROUP BY x	


запрос выполняется почти 35 сек.
Поля в БД следующих типов: watchID и visitID = numeric(40), dateTime = timestamp without time zone

Как мне оптимизировать запрос?
...
Рейтинг: 0 / 0
Как оптимизировать запрос INNER JOIN
    #40131019
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user999
Код: sql
1.
ON TO_CHAR(hits."dateTime", 'YY.MM') =  TO_CHAR(visits."dateTime", 'YY.MM')

а ты точно понимаешь, что делает это условие объединения ?

10-ть записей, из hits, за любые даты января 2022 "соединяться" с 10-ю записями, из visits, за любые даты января 2022
В итоге ты получишь 100 записей, по которым потом и будешь делать вычисления ... это реально "так задумано" ? )
...
Рейтинг: 0 / 0
Как оптимизировать запрос INNER JOIN
    #40131028
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообщем, имхо, тут такое "задумывалось" )

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select cast(a.y1 as double precision) / b.y2 as avr_hits, a.x
from 
  (SELECT count(distinct hits."watchID") as y1, TO_CHAR(hits."dateTime", 'YY.MM') as x
  FROM hits
  WHERE hits."dateTime" >= '2013-07-01' AND hits."dateTime" <= '2013-08-30'
  group by TO_CHAR(hits."dateTime", 'YY.MM') a
inner join
  (SELECT count(distinct visits."visitID") as y2, TO_CHAR(visits."dateTime", 'YY.MM') as x
  FROM visits
  WHERE visits."dateTime" >=  '2013-07-01' AND visits."dateTime" <=  '2013-08-30'
  group by TO_CHAR(visits."dateTime", 'YY.MM')) b
on a.x = b.x
...
Рейтинг: 0 / 0
Как оптимизировать запрос INNER JOIN
    #40131033
user999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, спасибо. Именно так я и хотел. Не смог сообразить как такую конструкцию написать. Теперь за 1.3 сек выполняется запрос. Большое спасибо!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос INNER JOIN
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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