powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Медленный запрос для 2 больших таблиц
10 сообщений из 10, страница 1 из 1
Медленный запрос для 2 больших таблиц
    #39667885
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 2 таблицы Table1 (1 млн записей) и Тable2 (10 млн записей)
Свзяь между таблицами один ко многим.
Нужно вытащить определнное колчичество записей, например 100 из Table1,
следующим запросом:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT *
FROM Table1
WHERE Field1 IN (SELECT Field1 FROM Table2  WHERE Field2 = 'val1' GROUP BY Field1 )
AND Field2='val2'
ORDER BY Field3
LIMIT 100


Можно переписать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT *
FROM Table1
INNER JOIN Table2 ON Table1.Field1=Table2.Field1
WHERE Table2.Field2 = 'val1'
AND Table1.Field2='val2'
GROUP BY Table1.Field1
ORDER BY Table1.Field3
LIMIT 100



Но оба запроса выполняются медленно.
Хочется из вложенного запроса делать выборку не всей таблицы Table2 по фильтру Field2 = 'val1',
а только 100 записей, например
Код: sql
1.
2.
3.
4.
5.
SELECT *
FROM Table1
WHERE Field1 IN (SELECT Field1 FROM Table2  WHERE Field2 = 'val1' GROUP BY Field1 LIMIT 100)
AND Field2='val2'
ORDER BY Field3


но так как есть условие Table1.Field2='val2', то этот запрос неверный. Может есть
стандартное решение аналогичной проблемы?
...
Рейтинг: 0 / 0
Медленный запрос для 2 больших таблиц
    #39667892
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11,

Для начала уберите GROUP BY в первом запросе и покажите какой план получается.
Ну и скорее всего будет нужен индекс на Table1(Field2, Field3)

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Медленный запрос для 2 больших таблиц
    #39667913
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

Пока не хочу затрагивать вопрос индексов, меня интересует вопрос возможного улучшения самого запроса.
Для подзапроса в первом запросе мне нужно уникальные Table2.Field1, если убрать GROUP BY, тогда нужно написать DISTINCT в начало подзапроса
...
Рейтинг: 0 / 0
Медленный запрос для 2 больших таблиц
    #39667919
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11Для подзапроса в первом запросе мне нужно уникальные Table2.Field1, если убрать GROUP BY, тогда нужно написать DISTINCT в начало подзапроса

Интересная мысль. Обоснуйте почему?
Если можно с ссылкой на SQL стандарт или документацию.

PS: что значит улучшение самого запроса?? если улучшения возможные зависят от доступных индексов и только от них.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Медленный запрос для 2 больших таблиц
    #39667923
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

Если при наличии предложения GROUP BY, в предложении SELECT отсутствуют агрегатные функции, то запрос просто вернет по одной строке из каждой группы. Эту возможность, наряду с ключевым словом DISTINCT, можно использовать для исключения дубликатов строк в результирующем наборе.
http://www.sql-tutorial.ru/ru/book_group_by_clause.html

Под словами улучшения структуры запроса, возможно вместо IN использовать EXISTS, либо другие варианты. Если это не возможно буду думать про индексы
...
Рейтинг: 0 / 0
Медленный запрос для 2 больших таблиц
    #39667924
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11Maxim Boguk,

Пока не хочу затрагивать вопрос индексов, меня интересует вопрос возможного улучшения самого запроса.
Для подзапроса в первом запросе мне нужно уникальные Table2.Field1, если убрать GROUP BY, тогда нужно написать DISTINCT в начало подзапроса

йа худею, дорогая редакция.

а о кардинальностях речь тоже пока не ко двору ?

при соотв. инд-ах и кардинальностях просится екзист вместо угробища с групбаем.
+ тонкости одербаев с лимитами при наличии фильтров. всё завязывается на индексы.

при других условиях -- может и групбай в цте не повредить. и фуллскан. раз уж без индексов.
...
Рейтинг: 0 / 0
Медленный запрос для 2 больших таблиц
    #39667925
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11Maxim Boguk,

Если при наличии предложения GROUP BY, в предложении SELECT отсутствуют агрегатные функции, то запрос просто вернет по одной строке из каждой группы. Эту возможность, наряду с ключевым словом DISTINCT, можно использовать для исключения дубликатов строк в результирующем наборе.
http://www.sql-tutorial.ru/ru/book_group_by_clause.html

Под словами улучшения структуры запроса, возможно вместо IN использовать EXISTS, либо другие варианты. Если это не возможно буду думать про индексы

вы не ответили на вопрос максима. "нужно" и "хотелось бы" -- сыршенно разные математические конструкции.

вы написали выше "нужно" -- т.е. "необходимо", но для конструкции с "ИН" такой необходимости нет.
...
Рейтинг: 0 / 0
Медленный запрос для 2 больших таблиц
    #39667926
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,
У таблиц бинарная связь с показателем кардиналь­ности "один ко многим" (1:М).
Table1.Field1 - Pk
Table2.Field1 - Fk
...
Рейтинг: 0 / 0
Медленный запрос для 2 больших таблиц
    #39667931
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11Maxim Boguk,

Если при наличии предложения GROUP BY, в предложении SELECT отсутствуют агрегатные функции, то запрос просто вернет по одной строке из каждой группы. Эту возможность, наряду с ключевым словом DISTINCT, можно использовать для исключения дубликатов строк в результирующем наборе.
http://www.sql-tutorial.ru/ru/book_group_by_clause.html


Как то не очевидно каким боком это связано с IN.
Чем вам дубликаты внутри IN то мешают?
Я спросил зачем вам "Для подзапроса в первом запросе мне нужно уникальные Table2.Field1"?

PS: на всякий случай подсказка - "GROUP BY Field1" с очень хорошими шансами вам делает запрос СИЛЬНО медленнее.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Медленный запрос для 2 больших таблиц
    #39667978
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11qwwq,
У таблиц бинарная связь с показателем кардиналь­ности "один ко многим" (1:М).
Table1.Field1 - Pk
Table2.Field1 - Fk

кардинальность :
автор для конечного множества понятие мощности совпадает с привычным понятием количества .


тут за реальные числа в конечных множествах и их числовые соотношения трут, а не за эфемерные типы связей

/*от цифири зависит оптимальность того или иного
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Медленный запрос для 2 больших таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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