Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для Зеленый1
2 / 2 / 2
Регистрация: 21.04.2011
Сообщений: 100

Оптимизация запроса при поиске записей в таблицах со связью многие-ко-многим

02.03.2014, 07:58. Показов 2025. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Такой вопрос : Есть две таблицы Documents и Lemms, связь многие-ко-многим, связаны через таблицу Fields. В Documents два поля: id и url -адрес документа, строка вида http://yandex.ru, в Lemms - id и text - лемма. В таблице Fields также два поля - id_document и id_lemm. Такая схема показывает, какие леммы находятся в документах. Мне нужно придумать запрос, который бы возвращал id документов, в которых содержатся все введенные пользователем леммы. Я придумал запрос, но так как в таблице Fields около 38 млн записей он работает очень долго :
SQL
1
2
3
4
5
6
7
 SELECT f.id_document, f.id_lemm FROM "Fields" f
WHERE (
SELECT COUNT(*) FROM "Fields" f2 
WHERE f.id_document = f2.id_document 
AND dl2.id_lemm IN (1,2 ) 
GROUP BY id_document 
) = 2
Подзапросом я ищу количество записей в таблице Fields, которые принадлежат документу из внешнего запроса и выбираю только те, в которых есть нужные нам леммы. Потом сравниваю возвращенное мне количество с количеством тех лемм, которые надо было найти, и если совпадает, то выбираю это поле. Подскажите, можно ли как-то оптимизировать данный запрос?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.03.2014, 07:58
Ответы с готовыми решениями:

DataSet, выборка данных в таблицах со связью "многие ко многим"
На рис. показана схема БД. С БД работаю через DataSet. По сути, организовал 2 таблицы со связью многие ко многим через таблицу 2. В...

Модель со связью многие-ко-многим
Уже голова кругом :wall: (Учусь на MVC 5) Есть класс User и Command со связью многие ко многим. public class ListUser : IdentityUser ...

Заполнение таблиц с связью многие-ко-многим
Есть две таблицы Artists и Performers. Между ними установлена связь многие ко многим и автоматически создана таблица связки Groups...

2
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
02.03.2014, 18:11
Предложу так... вроде не ошибся.
SQL
1
2
3
SELECT id_document FROM
(SELECT f.id_document, COUNT(f,id_lemm) AS cnt_lemm FROM FIELDS AS f WHERE f.id_lemm IN (1,2) GROUP BY f.id_document) AS DocLemms
WHERE cnt_lemm=2;
Дальше надо смотреть план запроса. Не могу в уме выстроить, что предложит на выполнение база, но нужны будут следующие основные шаги по оптимизации:
1. Однозначно построить план запрлоса (EXPLAIN)
2. проверить индексы на эти таблицы (какие поля и как задействованы в индексах);
3. изучать план запроса на предмет правильности использования индексов.
1
 Аватар для Зеленый1
2 / 2 / 2
Регистрация: 21.04.2011
Сообщений: 100
09.03.2014, 10:11  [ТС]
grgdvo, спасибо за идею. Анализ показал, что самое дорогое место было в подзапросе при вызове count(*), что логично. В итоге решил отказаться от count в том виде, в каком изначально был, потому что я как понял, просматривается вся таблица, потом уже ко всем записям применяются фильтры и группировки. Оптимизировал вот так
SQL
1
2
3
4
5
SELECT id_document
FROM "Fields" f
WHERE id_lemm IN (1,2)
GROUP BY id_document
HAVING COUNT(*) = 2
В этом случае теперь count(*) вызывался уже для сгруппированных мне записей, что существенно ускорило работу - запрос выполнился за 41 секунду. Добавив индекс по полю id_lemm, запрос стал "летать" - меньше секунды.
PS если кому интересно, нашел документ, который подробно описывает команду explain https://wiki.postgresql.org/wi... XPLAIN.pdf .
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2014, 10:11
Помогаю со студенческими работами здесь

Сохранение данных со связью многие-ко-многим
Здравствуйте, делаю сохранение данных, связь многие-ко-многим, то есть, например, у меня есть модель книг и модель авторов: public...

Представление данных со связью многие-ко-многим
Добрый день, форумчане! Итак, есть простенькая база данных MS ACCESS. Связи между таблицами: Структура таблиц: ...

Отображение таблиц со связью многие ко многим
Есть две таблицы, между которыми установлена связь многие ко многим, через третью таблицу: books(bookID) authors(authorID) ...

Выбрать из таблиц со связью многие ко многим
Здравствуйте! Помогите составить запрос. Суть такая: имеются две таблицы, между ними связь многие ко многим. В первой таблице информация по...

Инициализация базы данных со связью многие ко многим EF CF
Здравствуйте. задача такова: допустим, есть 3 таблицы: производителей (SAMSUNG, ASUS, ACER, HEWLETT PACKARD, LENOVO, BLIZZARD), типов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru