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

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

26.11.2013, 18:41. Показов 9523. Ответов 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
 Аватар для arni
913 / 878 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
26.11.2013, 19:52
Firebird 2.5.
Таблица 1: ~6 тыс. записей
Таблица 2: ~13 тыс. записей
Таблица 3 (многие-ко-многим, но не просто соответствие, но и ~30 полей дополнительно): ~2.2 млн. записей

SQL
1
2
3
4
SELECT COUNT(*)
  FROM t1
  JOIN t3 ON t3.FK_ID=t1.ID
  JOIN t2 ON t3.FK_ID=t2.ID
19 сек.

если сделать не count(*), а выдать одно числовое поле (т.е. фетч 2+ млн.записей в грид), то уже 30 сек.
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
27.11.2013, 00:59  [ТС]
Да это быстро. Спасибо. У меня база данных SQLite, может все из за нее. Хотя для работы программы 30 сек ожидания это тоже долго.

Для своей базы я придумал алгоритм как соединять эти таблицы, но я его программой реализовал. Долго бился над ним. Вот как бы заставить саму СУБД пользоваться моим алгоритмом. То есть мне нужно записать функцию в базу данных и что бы она вместо JOIN выполняла эту функцию. Это возможно?
0
 Аватар для arni
913 / 878 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
27.11.2013, 08:28
Вы не приводите своих метрик.
Не понятно, построены ли у вас индексы по столбцам соединения.
Совершенно не понятно, кому нужны резалтсеты-миллионики. Если это грид, то считается плохо, если количество строк более сотни. Если это отчет, то речь может идти об тысячи записей. Но миллионами никто не ворочает на выходе - человек не может оперировать такими выборками. Т.е. нужно строить такие запросы, которые ужимают выборку до приемленых размеров (десятки, сотни, редко - тысяча строк). Соединение и фильрация по столбцам, покрытым индексами, должны выполняться буквально неск. сек., даже на таблицах миллиониках. Правда с SQLite я не работал, но в целом уважаемая компактная СУБД - врятли она ущербна. Скорее проблемы на стороне программиста/проектировщика.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
27.11.2013, 12:28
Цитата Сообщение от WirusaNet Посмотреть сообщение
Запрос выполняется минут десять. Разве так должно быть?

Последовательность примерно такая. Сначала запрос к каждой строке первой таблицы. Это 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 строк из второй. Причем разом они должны намного быстрее делаться, чем по отдельности.
WirusaNet, правильно ли я вас понял?

Вы считываете в клиенте всё содержимое трех таблиц в память, а потом в клиенте же начинаете искать нужные вам строки по всем таблицам?
После того, как программа в клиенте отлажена, вы хотите, чтобы сервер выполнял не какие-то свои запросы, а конкретно ваш отлаженный алгоритм

Так?
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
28.11.2013, 12:40  [ТС]
Да. именно так. Таблицы загружаю из базы данных, а нужный результат получаю программой. Удобнее было бы, если заставить базу данных выполнять мой алгоритм.

А на счет вопроса - построены ли у вас индексы по столбцам соединения. Я сам ничего специально не делал. Создал две таблицы с данными и связующую. Про индексы даже не слышал ничего. Ключем сделал обычные числовые данные типа Integer.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
28.11.2013, 12:50
Цитата Сообщение от WirusaNet Посмотреть сообщение
Про индексы даже не слышал ничего
То есть ты работаешь с БД, даже ничего не прочитав (хотя бы общие вещи) по теории реляционных БД???
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
28.11.2013, 13:15
Цитата Сообщение от WirusaNet Посмотреть сообщение
Да. именно так. Таблицы загружаю из базы данных, а нужный результат получаю программой.
В таком случае вы обречены на мучительно долгое и непродуктивное императивное программирование баз данных: затраты по извлечению и передаче к клиенту гигантского объема не нужных данных, ковыряние в этих данных по жестко заданному (и не факт, что оптимальному) вашему сценарию обработки, очистка (если производится вашим клиентом) мусора, не удовлетворяющего требованиям к данным

Фактически, вы мучительно долго делаете на клиенте то, что умеет оптимально быстро делать сервер

ЗАЧЕМ?

Почитайте про декларативное программирование, забудьте про обработку массивов при работе с SQL (sic! в SQL НЕТ МАССИВОВ!!!), поищите информацию об оптимизации SQL-запросов - и ваши данные будут извлекаться практически моментально.

Удобнее было бы, если заставить базу данных выполнять мой алгоритм.
Согласен, если под своим алгоритмом вы понимаете правильно составленный SQL-запрос, а не программу на императивном языке программирования.

А на счет вопроса - построены ли у вас индексы по столбцам соединения. Я сам ничего специально не делал. Создал две таблицы с данными и связующую. Про индексы даже не слышал ничего. Ключем сделал обычные числовые данные типа Integer.
Наиболее часто (но не всегда) для оптимизации выполнения запроса достаточно построить правильные индексы в таблицах.
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
28.11.2013, 13:21  [ТС]
Совсем не так. Я вообще то базы и не пишу. И очень много чего то не прочитал. Вот и индексы не читал. Но про связующую таблицу читал. Но связующие таблицы и есть теория реляционных БД. Объект должен быть один и не повторяться, а для звязей создаем спец таблицы. А индексы это уже дополнительные инструменты. Если у меня не возможно задать индексы, то что, виновата теория? Изначально я и спрашивал про дополнительные механизмы для ускорения процесса. Полагаю теперь нужно зяняться индексами. Но очень интересует вопрос, как заставить базу данных мой алгоритм делать?
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
28.11.2013, 13:32
Цитата Сообщение от WirusaNet Посмотреть сообщение
Но очень интересует вопрос, как заставить базу данных мой алгоритм делать?
1. Согласиться с тем, что любой SQL-сервер разрабатывался с целью максимально быстрого извлечения требуемых данных, и не задавать подобных вопросов.

2. Разобраться, что требуется сделать в вашей конкретной базе данных для того, чтобы сервер выполнял свою работу по извлечению данных максимально эффективно
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
28.11.2013, 13:40  [ТС]
Цитата Сообщение от cygapb-007 Посмотреть сообщение
В таком случае вы обречены на мучительно долгое и непродуктивное императивное программирование баз данных: затраты по извлечению и передаче к клиенту гигантского объема не нужных данных, ковыряние в этих данных по жестко заданному (и не факт, что оптимальному) вашему сценарию обработки, очистка (если производится вашим клиентом) мусора, не удовлетворяющего требованиям к данным
Я этого и хочу избежать. И тогда все будет без мусора, ковыряния и всего другого. Да и запрос тут элементарный, его никак не оптимизируешь. Он такой же как во втором посте.

Меня сам алгоритм заинтересовал. Ведь база данных выполняет свой алгоритм. Как я могу повлиять на него? Здесь тока про индексы весь разговор. Это я понял, буду думать. Но вот мне хотелось бы и свой алгоритм прямо в базе делать. И он не запрос, а именно алгоритм, который нужно будет записать на языке базы данных.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
28.11.2013, 13:45
Цитата Сообщение от WirusaNet Посмотреть сообщение
Но вот мне хотелось бы и свой алгоритм прямо в базе делать. И он не запрос, а именно алгоритм, который нужно будет записать на языке базы данных.
В любом SQL закрыт непосредственный доступ к хранимым данным. В вашем распоряжении только SQL-запросы.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
28.11.2013, 13:47
Цитата Сообщение от WirusaNet Посмотреть сообщение
Но вот мне хотелось бы и свой алгоритм прямо в базе делать
Это все равно, что купить машину (пусть Ford), выкинуть двигатель и сделать свой. Можно ли после этого назвать такое авто Ford-ом?
Алгоритмы, применяемые в СУБД, являются таким мотором. Маловероятно, что ты придумаешь алгоритм, который переплюнет многолетний труд создателей СУБД. Но в любом случае ни один создатель СУБД таких возможностей по замене их собственных алгоритмов не предоставляет
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
28.11.2013, 13:52  [ТС]
Цитата Сообщение от cygapb-007 Посмотреть сообщение
Согласиться с тем, что любой SQL-сервер разрабатывался с целью максимально быстрого извлечения требуемых данных, и не задавать подобных вопросов.
Я бы посоветовал не отвечать на вопрос если он не нравится. Так будет правильней, чем советовать не задавать вопросов. И что значит согласиться с тем. Я бы и хотел взглянуть на этот алгоритм. Да и суть опять не в этом. Для разных ситуаций разный алгоритм. Этот хорош в этом месте, а другой в другом. Если это не возможно реализовать, это не значит что вопросы не нужно задавать. Нужно так и ответить, мол нельзя и все.

Добавлено через 1 минуту
Цитата Сообщение от Grossmeister Посмотреть сообщение
Это все равно, что купить машину (пусть Ford), выкинуть двигатель и сделать свой. Можно ли после этого назвать такое авто Ford-ом?
Алгоритмы, применяемые в СУБД, являются таким мотором. Маловероятно, что ты придумаешь алгоритм, который переплюнет многолетний труд создателей СУБД. Но в любом случае ни один создатель СУБД таких возможностей по замене их собственных алгоритмов не предоставляет
Так многие фирмы делают с машинами. А с фордом так и нужно делать. И что значит мало вероятно. Это нужно тока сравнивать.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
28.11.2013, 13:59
Цитата Сообщение от WirusaNet Посмотреть сообщение
Я бы и хотел взглянуть на этот алгоритм.
Ну так и взгляние, кто мешает-то?

Называется - план выполнения запроса

Если бы не поленились поискать темы про оптимизацию - обязательно бы наткнулись на его упоминание.

Но нет, нравится вам головой об стенку... Что ж, продолжайте...
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
28.11.2013, 14:06  [ТС]
Цитата Сообщение от cygapb-007 Посмотреть сообщение
Ну так и взгляние, кто мешает-то?
Называется - план выполнения запроса
Посмотрю.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
28.11.2013, 14:21
Цитата Сообщение от WirusaNet Посмотреть сообщение
Это нужно тока сравнивать
ОК.
А почему бы не распространить этот принцип на любые готовые программы? Производитель предоставляет всем желающим исходники, любой желающий составляет свои алгоритмы вместо имеющихся и сранивает. Вот только есть подозрение, что после этого все будут заниматься только этим и никаких других программ писать уже не будут (просто не хватит времени). А техподдержка производителей будет завалена кучей претензий, почему та или иная программа плохо работает (а ведь не сразу разберешь, используется ли исходный движок или он уже сильно модифицирован).
А если распространить этот принцип не только на программы, но и на остальные товары, то...
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
28.11.2013, 14:51  [ТС]
Может мои ответы немного неприятные, но я никого не пытаюсь задеть. Стараюсь по крайне мере. Но здесь вот проще простого. Этот алгоритм я буду использовать только сам и только для этого запроса. Всё остальное остается как было. А их алгоритм мне бы было даже интересно посмотреть и сравнить со своим. Если разберусь во всех дебрях, то посмотрю. И ещё добавлю. Я и не обвиняю БД. Мне сначала нужно понять, почему БД выполняет не оптимальный алгоритм? Может ли она вообще выполнить более оптимальный алгоритм? И что нужно сделать для того? Может быть окажется, что БД может выполнять и мой алгоритм.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
28.11.2013, 15:02
Цитата Сообщение от WirusaNet Посмотреть сообщение
Мне сначала нужно понять, почему БД выполняет не оптимальный алгоритм?
Покажите уже наконец-то план выполнения запроса
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 11
28.11.2013, 15:08  [ТС]
Ну я простой любитель, а не профи. Если за год разберусь, что это такое, то покажу. Но боюсь что и за год не уложусь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.11.2013, 15:08
Помогаю со студенческими работами здесь

Очень долго выполняется запрос 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...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Квантовые алгоритмы и обработка строк в Q#
EggHead 07.06.2025
Квантовые вычисления перевернули наше представление о том, как работать с данными, а Q# стал одним из ключевых языков для разработки квантовых алгоритмов. В традиционых системах мы оперируем битами —. . .
NUnit и C#
UnmanagedCoder 07.06.2025
В . NET существует несколько фреймворков для тестирования: MSTest (встроенный в Visual Studio), xUnit. net (более новый фреймворк) и, собственно, NUnit. Каждый имеет свои преимущества, но NUnit. . .
с++ Что нового?
russiannick 06.06.2025
Продолжаю обзор dev-cpp5. 11. Посмотрев на проекты, предоставленные нам для обучения, становится видно, что они разные по содержащимся файлам где: . dev обязательно присутствует . cpp/ . c один из них. . .
WebAssembly в Kubernetes
Mr. Docker 06.06.2025
WebAssembly изначально разрабатывался как бинарный формат инструкций для виртуальной машины, обеспечивающий высокую производительность в браузерах. Но потенциал технологии оказался гораздо шире - она. . .
Как создать первый микросервис на C# с ASP.NET Core, step by step
stackOverflow 06.06.2025
Если говорить простыми словами, микросервисная архитектура — это подход к разработке, при котором приложение строится как набор небольших, слабо связанных сервисов, каждый из которых отвечает за. . .
Рисование коллайдеров Box2D v2 на Three.js с помощью порта @box2d/core
8Observer8 06.06.2025
Используется порт Box2D v2 под названием @box2d/ core - пакет NPM. Загрузил документацию Box2D v2 на Netlify: https:/ / box2d-v2-docs. netlify. app/ Документацию Box2D v2 можно скачать с официального. . .
Как создать стек в Python
AI_Generated 05.06.2025
Как архитектор с более чем десятилетним опытом работы с Python, я неоднократно убеждался, что знание низкоуровневых механизмов работы стеков дает конкурентное преимущество при решении сложных задач. . . .
Server-Sent Events (SSE) в Node.js
run.dev 05.06.2025
Потоковая передача данных с сервера прямо в браузер стала повседневной потребностью - от биржевых графиков и спортивных трансляций до чатов и умных дашбордов. Много лет разработчики полагались на. . .
Создаем RESTful API на Golang с Fiber
golander 04.06.2025
Я перепробовал десятки фреймворков для создания RESTful API за последние годы, и когда впервые столкнулся с Fiber, понял, что это совсем другой уровень. Нет, я не собираюсь рассказывать сказки о. . .
Как работать с куки в ASP.NET Core
UnmanagedCoder 04.06.2025
Когда я впервые начал работать с куки в ASP. NET Core, меня поразило, насколько отличается работа с ними от классического ASP. NET. В Core все стало более декомпозированным - больше нет удобного. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »