Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос. / 13 сообщений из 13, страница 1 из 1
15.11.2017, 18:49
    #39553827
Архиневолокоточ ерепопиндрик-й
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос.
Есть запрос c вложеным подзапросом такого типа:

Код: sql
1.
2.
3.
SELECT id,
(SELECT f1 FROM table2 WHERE id=t1.id LIMIT 1)
FROM table1;




Подзапрос (вложеный который) отрабатывает за 20мс.

Сам запрос, без подзапроса тоже быстро отрабатывает.

Но т.к. подзапросов этих очень много, весь запрос с подзапросом работает десятки секунд


Подскажите, как его можно оптимизировать?
...
Рейтинг: 0 / 0
15.11.2017, 18:55
    #39553832
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос.
Архиневолокоточ ерепопиндрик-й,

а что вам мешает инер джойн делать?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
  t1.id,
  t2.f1
FROM
  table1 AS t1
  INNER JOIN
  table2 AS t2
  ON t2.id = t1.id 
...
Рейтинг: 0 / 0
15.11.2017, 18:58
    #39553835
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос.
Lonepsycho,

Судя по лимиту в подзапрос - у человека отношение таблиц один-ко-многим. А мешает сделать через соединение, как всегда - недостаточное владение предметной областью....
...
Рейтинг: 0 / 0
15.11.2017, 19:11
    #39553841
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос.
Щукина Анна,

тогда надо знать больше о данных, которые там хранятся. в прочем, бесцеремонный лимит на селект по ид, без каких либо сортировок, момент интересный.
...
Рейтинг: 0 / 0
16.11.2017, 10:56
    #39554136
Архиневолокоточ ерепопиндрик-й
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос.
LonepsychoЩукина Анна,

тогда надо знать больше о данных, которые там хранятся. в прочем, бесцеремонный лимит на селект по ид, без каких либо сортировок, момент интересный.

Верно подмечено.

Я неправильно упростил суть запроса.

В подзапросе естественно есть сортировка, по дате: нужно самое свежее значение.

Вот так корректно:

Код: sql
1.
2.
3.
SELECT id,
(SELECT f1 FROM table2 WHERE id=t1.id ORDER BY date1 DESC LIMIT 1)
FROM table1;
...
Рейтинг: 0 / 0
16.11.2017, 10:58
    #39554139
Архиневолокоточ ерепопиндрик-й
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос.
LonepsychoАрхиневолокоточ ерепопиндрик-й,

а что вам мешает инер джойн делать?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
  t1.id,
  t2.f1
FROM
  table1 AS t1
  INNER JOIN
  table2 AS t2
  ON t2.id = t1.id 



Это было бы слишком просто :)

Во второй табличке с t1.id много записей, а нужна только самая свежая по date1.
...
Рейтинг: 0 / 0
16.11.2017, 11:10
    #39554156
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос.
Архиневолокоточ ерепопиндрик-йLonepsychoЩукина Анна,

тогда надо знать больше о данных, которые там хранятся. в прочем, бесцеремонный лимит на селект по ид, без каких либо сортировок, момент интересный.

Верно подмечено.

Я неправильно упростил суть запроса.

В подзапросе естественно есть сортировка, по дате: нужно самое свежее значение.

Вот так корректно:

Код: sql
1.
2.
3.
SELECT id,
(SELECT f1 FROM table2 WHERE id=t1.id ORDER BY date1 DESC LIMIT 1)
FROM table1;



Ну так покажите explain (analyze, costs, buffers, timing) для него чтобы посмотреть что там не так.
20ms как то многовато кроме случая когда диски тормозят.
Хотя конечно смотря сколько строк в table1.
...
Рейтинг: 0 / 0
16.11.2017, 11:15
    #39554160
Архиневолокоточ ерепопиндрик-й
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос.
Maxim BogukАрхиневолокоточ ерепопиндрик-йпропущено...


Верно подмечено.

Я неправильно упростил суть запроса.

В подзапросе естественно есть сортировка, по дате: нужно самое свежее значение.

Вот так корректно:

Код: sql
1.
2.
3.
SELECT id,
(SELECT f1 FROM table2 WHERE id=t1.id ORDER BY date1 DESC LIMIT 1)
FROM table1;



Ну так покажите explain (analyze, costs, buffers, timing) для него чтобы посмотреть что там не так.
20ms как то многовато кроме случая когда диски тормозят.
Хотя конечно смотря сколько строк в table1.

В подзапросе
Код: sql
1.
(SELECT f1 FROM table2 WHERE id=t1.id ORDER BY date1 DESC LIMIT 1)


там все нормально.
indexScan.
Таблица большая.

Плюс в цикле делал этот подзапрос, по каждому id, которые есть в выборке с замером времени.

20ms складываются в секунды

Можно ли как-то хитро эти две таблицы соединить?
...
Рейтинг: 0 / 0
16.11.2017, 11:16
    #39554163
Архиневолокоточ ерепопиндрик-й
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос.
Может быть через временную таблицу как нить?
...
Рейтинг: 0 / 0
16.11.2017, 11:36
    #39554178
Архиневолокоточ ерепопиндрик-й
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос.
Архиневолокоточ ерепопиндрик-йМожет быть через временную таблицу как нить?

Через временную таблицу отменяется, т.к. БД редонли
...
Рейтинг: 0 / 0
16.11.2017, 11:39
    #39554181
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос.
Архиневолокоточ ерепопиндрик-й,

LATERAL
...
Рейтинг: 0 / 0
16.11.2017, 11:45
    #39554185
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос.
Архиневолокоточ ерепопиндрик-й,

Без результатов explain обсуждать смысла вообще нет. Может оно там у вас вообще в диски упирается и тогда нормальное железо вам в помощь.
...
Рейтинг: 0 / 0
16.11.2017, 11:49
    #39554188
Архиневолокоточ ерепопиндрик-й
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос.
Спасибо, получилось.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос. / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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