|
Медленный запрос для 2 больших таблиц
|
|||
---|---|---|---|
#18+
Есть 2 таблицы Table1 (1 млн записей) и Тable2 (10 млн записей) Свзяь между таблицами один ко многим. Нужно вытащить определнное колчичество записей, например 100 из Table1, следующим запросом: Код: sql 1. 2. 3. 4. 5. 6.
Можно переписать так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Но оба запроса выполняются медленно. Хочется из вложенного запроса делать выборку не всей таблицы Table2 по фильтру Field2 = 'val1', а только 100 записей, например Код: sql 1. 2. 3. 4. 5.
но так как есть условие Table1.Field2='val2', то этот запрос неверный. Может есть стандартное решение аналогичной проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2018, 18:46 |
|
Медленный запрос для 2 больших таблиц
|
|||
---|---|---|---|
#18+
polin11, Для начала уберите GROUP BY в первом запросе и покажите какой план получается. Ну и скорее всего будет нужен индекс на Table1(Field2, Field3) -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2018, 19:57 |
|
Медленный запрос для 2 больших таблиц
|
|||
---|---|---|---|
#18+
Maxim Boguk, Пока не хочу затрагивать вопрос индексов, меня интересует вопрос возможного улучшения самого запроса. Для подзапроса в первом запросе мне нужно уникальные Table2.Field1, если убрать GROUP BY, тогда нужно написать DISTINCT в начало подзапроса ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2018, 22:30 |
|
Медленный запрос для 2 больших таблиц
|
|||
---|---|---|---|
#18+
polin11Для подзапроса в первом запросе мне нужно уникальные Table2.Field1, если убрать GROUP BY, тогда нужно написать DISTINCT в начало подзапроса Интересная мысль. Обоснуйте почему? Если можно с ссылкой на SQL стандарт или документацию. PS: что значит улучшение самого запроса?? если улучшения возможные зависят от доступных индексов и только от них. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2018, 22:45 |
|
Медленный запрос для 2 больших таблиц
|
|||
---|---|---|---|
#18+
Maxim Boguk, Если при наличии предложения GROUP BY, в предложении SELECT отсутствуют агрегатные функции, то запрос просто вернет по одной строке из каждой группы. Эту возможность, наряду с ключевым словом DISTINCT, можно использовать для исключения дубликатов строк в результирующем наборе. http://www.sql-tutorial.ru/ru/book_group_by_clause.html Под словами улучшения структуры запроса, возможно вместо IN использовать EXISTS, либо другие варианты. Если это не возможно буду думать про индексы ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2018, 22:58 |
|
Медленный запрос для 2 больших таблиц
|
|||
---|---|---|---|
#18+
polin11Maxim Boguk, Пока не хочу затрагивать вопрос индексов, меня интересует вопрос возможного улучшения самого запроса. Для подзапроса в первом запросе мне нужно уникальные Table2.Field1, если убрать GROUP BY, тогда нужно написать DISTINCT в начало подзапроса йа худею, дорогая редакция. а о кардинальностях речь тоже пока не ко двору ? при соотв. инд-ах и кардинальностях просится екзист вместо угробища с групбаем. + тонкости одербаев с лимитами при наличии фильтров. всё завязывается на индексы. при других условиях -- может и групбай в цте не повредить. и фуллскан. раз уж без индексов. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2018, 23:00 |
|
Медленный запрос для 2 больших таблиц
|
|||
---|---|---|---|
#18+
polin11Maxim Boguk, Если при наличии предложения GROUP BY, в предложении SELECT отсутствуют агрегатные функции, то запрос просто вернет по одной строке из каждой группы. Эту возможность, наряду с ключевым словом DISTINCT, можно использовать для исключения дубликатов строк в результирующем наборе. http://www.sql-tutorial.ru/ru/book_group_by_clause.html Под словами улучшения структуры запроса, возможно вместо IN использовать EXISTS, либо другие варианты. Если это не возможно буду думать про индексы вы не ответили на вопрос максима. "нужно" и "хотелось бы" -- сыршенно разные математические конструкции. вы написали выше "нужно" -- т.е. "необходимо", но для конструкции с "ИН" такой необходимости нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2018, 23:05 |
|
Медленный запрос для 2 больших таблиц
|
|||
---|---|---|---|
#18+
qwwq, У таблиц бинарная связь с показателем кардинальности "один ко многим" (1:М). Table1.Field1 - Pk Table2.Field1 - Fk ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2018, 23:07 |
|
Медленный запрос для 2 больших таблиц
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2018, 23:31 |
|
Медленный запрос для 2 больших таблиц
|
|||
---|---|---|---|
#18+
polin11qwwq, У таблиц бинарная связь с показателем кардинальности "один ко многим" (1:М). Table1.Field1 - Pk Table2.Field1 - Fk кардинальность : автор для конечного множества понятие мощности совпадает с привычным понятием количества . тут за реальные числа в конечных множествах и их числовые соотношения трут, а не за эфемерные типы связей /*от цифири зависит оптимальность того или иного ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2018, 12:12 |
|
|
start [/forum/topic.php?fid=53&msg=39667892&tid=1995693]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
129ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 280ms |
total: | 498ms |
0 / 0 |