Форум программистов, компьютерный форум, киберфорум
Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/47: Рейтинг темы: голосов - 47, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11

Очень долго выполняется запрос

26.11.2013, 18:41. Показов 10240. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Запрос выполняется минут десять. Разве так должно быть?

Обрисовываю ситуацию. Берутся две главные таблицы и одна связующая со связями многие ко многим. Главные таблицы состоят из двух колонок. Одна - ключ, а вторая - текст. Первая таблица 2000 строк. Вторая - 10000 строк. Связующая таблица состоит из ключей первой и второй. Но она гигантская по размерам - 500'000 строк. Сама задача проста. Связать первую и вторую таблицы если из первой таблицы запросу соответствуют 1000 строк, а из второй 5000 строк.

Последовательность примерно такая. Сначала запрос к каждой строке первой таблицы. Это 2000 операций. Из них останутся 1000 строк. Затем самое страшное. 1000 строк полученных сравниваются с 500'000 строк связующей таблицы. Это значит 1000 х 500'000 = 500'000'000 операций. В итоге останется 5000 строк в промежуточной таблице. Дальше попроще, выбираем из второй таблицы по полученному ключу. Это еще 5000 х 10'000 = 50'000'000 операций. В итоге сумма канечно устрашающая 550'002'000. Это только операции сравнения. Операций считывания посчитать проще. Разом все 2000 строк из первой, разом все 500'000 строк из связующей и разом все 10'000 строк из второй. Причем разом они должны намного быстрее делаться, чем по отдельности.

Вопрос знатокам, а сколько у вас ориентировочно будет выполняться такой запрос? И еще какие есть способы ускорить процесс не изменяя базы данных?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.11.2013, 18:41
Ответы с готовыми решениями:

Не выполняется запрос в SQLite3
Доброго времени суток, товарищи! Начинаю изучать СУБД в рамках универской программы. Создал базу данных, создал ряд таблиц, немного...

Запрос выполняется очень долго
Обращаюсь к специалистам за помощью. Задача, поставленная в данной базе решена. Но последний запрос (запрос2) зависает на 8-10...

Запрос выполняется очень долго
Помагите оптимизировать запрос. Выполняется бесконечно долго (Запрос занял 95.9257 сек.) SELECT sklad.* FROM sklad LEFT JOIN prodal ON...

26
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
28.11.2013, 15:18
Студворк — интернет-сервис помощи студентам
непрочной вам стенки в таком случае...
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
28.11.2013, 15:44
Цитата Сообщение от WirusaNet
Мне сначала нужно понять, почему БД выполняет не оптимальный алгоритм?
Может это тебе только кажется?

Цитата Сообщение от WirusaNet
Может ли она вообще выполнить более оптимальный алгоритм? И что нужно сделать для того?
Для этого кроме использования упомянутых индексов есть и другие настройки, которые, разумеется, свои в каждой СУБД. Поэтому для того, чтобы оптимизировать запросы, надо знать архитектуру конкретной СУБД.

Цитата Сообщение от WirusaNet
Может быть окажется, что БД может выполнять и мой алгоритм.
Для этого производители СУБД должны предоставлять определенный API, а они, как уже было сказано, его не предоставляют.
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
28.11.2013, 22:09  [ТС]
Большая база уже удалена. Есть тока уменьшенная. Пример проблемного запроса.

SQL
1
2
3
SELECT COUNT(*)
FROM tt3
JOIN to123 ON tt3.nomber3 = to123.nomber3
Главная таблица 2679 записей. Связующая 24074 записи. На выполнение данного запроса уходит 20 секунд. Это очень долго для элементарного запроса.

При запросе плана выполнения запроса выдает:

 0 Trace 0 0 0 00 
 1 Null 0 1 0 00 
 2 Goto 0 19 0 00 
 3 OpenRead 0 22439 0 1 00 
 4 OpenRead 1 22449 0 3 00 
 5 Rewind 0 13 0 00 
 6 Rewind 1 12 0 00 
 7 Column 0 0 2 00 
 8 Column 1 2 3 00 
 9 Ne 3 11 2 collseq(BINARY) 6b 
 10 AggStep 0 0 1 count(0) 00 
 11 Next 1 7 0 01 
 12 Next 0 6 0 01 
 13 Close 0 0 0 00 
 14 Close 1 0 0 00 
 15 AggFinal 1 0 0 count(0) 00 
 16 SCopy 1 4 0 00 
 17 ResultRow 4 1 0 00 
 18 Halt 0 0 0 00 
 19 Transaction 0 0 0 00 
 20 VerifyCookie 0 462 0 00 
 21 TableLock 0 22439 0 tt3 00 
 22 TableLock 0 22449 0 to123 00 
 23 Goto 0 3 0 00 

Для большой базы думаю план должен быть такой же. И даже на урезаной базе производительность очень низкая.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
29.11.2013, 08:33
Простите, не узнаю вас в гриме... (с)
Версию SQL озвучьте?

В плане не отражено использование индексов для поиска данных, поэтому, вероятнее всего, ускорить запрос поможет индекс:
SQL
1
CREATE INDEX IX_to123_nomer3 ON to123(nomer3)
Кроме того, насколько я понял из плана, в tt3 22439 строк, а в to123 - 22449 строк, что отличается от заявленных вами. Возможно, требуется обновить статистику на сервере.
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
29.11.2013, 12:48  [ТС]
Версия SQLite. Индексов нет, это точно. А вот в таблице tt3 именно 2679 записей. Самому интересно как так. Могу тока предположить что когда то максимальное число записей в этой таблице было именно 22439. Но они уже удалены.

Если отойти от индексов. Разве без них должен именно так медленно выполнятся данный запрос.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
29.11.2013, 13:09
Цитата Сообщение от WirusaNet Посмотреть сообщение
Версия SQLite. Индексов нет, это точно. А вот в таблице tt3 именно 2679 записей. Самому интересно как так. Могу тока предположить что когда то максимальное число записей в этой таблице было именно 22439. Но они уже удалены.

Если отойти от индексов. Разве без них должен именно так медленно выполнятся данный запрос.
Да, так и должно быть.

Реляционная модель обеспечивает получение результирующего множества данных, соответствующего критериям отбора. О времени получения результата ничего не говорится.

Техническая реализация обеспечивает построение оптимального плана выполнения запроса, учитывающего ожидаемое количество записей в результате обработки, наличие и селективность индексов, возможность параллельной обработки... В общем много чего учитывает SQL при разборе запроса, в результате формирует план, позволяющий выполнить запрос с минимальной нагрузкой на сервер.

Ваша задача - предоставить оптимизатору возможность построить действительно быстрый план обработки.

Добавлено через 2 минуты
сделайте индекс и потом снова покажите план выполнения запроса?
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
29.11.2013, 13:29
Цитата Сообщение от WirusaNet
Если отойти от индексов. Разве без них должен именно так медленно выполнятся данный запрос.
Если нет индексов, то выполняется FULL SCAN каждой таблицы, входящей в выборку. В этом случае действительно (во всяком случае в Oracle) читаются все блоки, которые были заполнены, даже если в них уже не осталось ни одной строки (если таблица после удаления не подвергалась сжатию).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.11.2013, 13:29

Очень долго выполняется запрос SQL
Добрый день! Товарищи, помогите разобраться почему SQL запрос выполняется жутко долго (2,5 минуты) Как и где можно протестировать этот...

Очень долго выполняется хранимая процедура
Добрый день при выполнению запроса, а точнее при сохранении данных с excel хранимая процедура долго обрабатывается USE GO /******...

Долго выполняется запрос к БД
Добрый день. Есть в БД табличка с 192 полями, в ней может быть около 100 тыс. записей. запрос count(*) выполняется 1,31 сек. а выбор...

Критически долго выполняется запрос
Есть таблица со множеством полей типа: CREATE TABLE big_data ( id serial NOT NULL, ... is_active boolean NOT NULL, ...

MS SQL. Запрос долго выполняется
Доброго времени суток! Помогите разобраться почему запрос долго выполняется select max(Id) as id FROM gftec WHERE ID_TEC=6 GROUP BY...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru