|
48 / 48 / 26
Регистрация: 31.05.2011
Сообщений: 139
|
|||||||||||||||||||||
PDO, Postgres. Долго выполняется SELECT, если есть bindValue19.02.2015, 01:35. Показов 2769. Ответов 10
Метки нет (Все метки)
Всем привет!
Очень-очень странный баг. Есть табличка postgres с 3.5кк записей. Есть два почти идентичных скрипта:
Вот что выдают скрипты:
WTF? Почему так получается? Как мне ускорить второй вариант? Это я туплю, или в PDO какой-то баг? PHP 5.5.20 Pgsql 9.1.14
0
|
|||||||||||||||||||||
| 19.02.2015, 01:35 | |
|
Ответы с готовыми решениями:
10
PDO: bindParam и bindValue PDO bindValue и prepare PDO, разница bindParam и bindValue |
| 19.02.2015, 03:03 | |
Сообщение было отмечено Reposlav как решение
Решение
Видимо, вы не первый: http://www.postgresql.org/mess... .gmail.com
1. Попробуйте сделать explain. 2. Если explain ничего интересного не выдаст, попробуйте эти же запросы на таблице с 10ю записями. 3. Попробуйте передавать массив параметров вместо bindValue, прямо в метод execute. 4. Вероятно, посмотреть в документацию PDO на предмет настроек, связанных с подготовленными запросами, и, возможно, конкретно psql-зависимых (на php.net заметил только EMULATE_PREPARES-настройку, наврядли это то, что вам нужно, даже если оно и исправит ситуацию). Скорее всего, как я понял, при bindValue почему-то не используются индексы (это можно выяснить с помощью пункта 1), также я заметил, что в пхп-шных доках для select-запросов обычно параметры передаются с помощью массива в execute, а не через bindValue. Последний же используется больше для insert-запросов. Поэтому начните с пунктов 1 и 3, возможно, что-то сработает
1
|
|
|
48 / 48 / 26
Регистрация: 31.05.2011
Сообщений: 139
|
||||||
| 19.02.2015, 11:03 [ТС] | ||||||
|
NEbO, EXPLAIN пробовал делать и результаты были одинаковыми.
Попробовал выполнить такой запрос:
Пойду ковырять конфиги постгреса. Добавлено через 42 минуты Интересно! Мне помогло добавление нового индекса на (contest_id, likes). Раньше было только два, отдельно на contest_id и отдельно на likes. Кстати, похоже проблема кроется в этом: http://intaro.ru/magazine/2010... statement/ Если кратко - при подготовленном запросе СУБД составляет план запроса только один раз, и применяет этот план даже в том случае, если этот план не эффективен для конкретного запроса. Спасибо, NEbO! Направили меня в нужную сторону.
0
|
||||||
|
Заблокирован
|
|
| 19.02.2015, 18:05 | |
|
Reposlav, поиск без индекса идет простым перебором и 34 номер найдется очень быстро, намного быстрее чем 65448392й номер. Но если этот 65448392й номер находится в проиндексированном поле, то он на несколько порядков найдется быстрее чем без индексов и скорость поиска будет примерно равна скорости поиска 34 номера. Возможно разработчикам PDO есть над чем задуматься, но тест в вашем первом посте абсолютно некорректен поскольку используются совершенно разные способы формирования и обработки запроса.
0
|
|
|
48 / 48 / 26
Регистрация: 31.05.2011
Сообщений: 139
|
|||
| 19.02.2015, 18:18 [ТС] | |||
|
root, собсна, в том-то и дело, что индекс был и есть. Прикол был в том, что в подготовленном запросе Pgsql не использовал индекс для сортировки. А PDO здесь ни при чем, он юзает функционал, предоставляемый СУБД.
И, что самое интересное: Pgsql посчитал, что сначала надо отсортировать, а потом отфильтровать. То есть сначала он отсортировал все 3.5кк записей, а потом отфильтровал из них 7, а не наоборот.
0
|
|||
|
Заблокирован
|
|
| 19.02.2015, 18:21 | |
|
0
|
|
|
48 / 48 / 26
Регистрация: 31.05.2011
Сообщений: 139
|
|
| 19.02.2015, 18:32 [ТС] | |
|
root, мог) Так он сначала провел более сложный, чем фильтрация, алгоритм сортировки над 3.5кк записей, а потом снова пробежался по всем 3.5кк записей, чтобы отфильтровать из них 7.
Он мог сначала отфильтровать все подходящие записи, а потом уже сортировать гораздо меньшее количество записей. Даже в самом пессимистичном случае второй вариант будет не медленнее первого, но в остальных случаях второй подход будет экономить ресурсы вплоть до нескольких порядков, как в данном случае.
0
|
|
|
Заблокирован
|
||
| 19.02.2015, 18:51 | ||
|
0
|
||
|
48 / 48 / 26
Регистрация: 31.05.2011
Сообщений: 139
|
|||
| 19.02.2015, 19:10 [ТС] | |||
|
0
|
|||
|
Заблокирован
|
||
| 19.02.2015, 19:29 | ||
|
0
|
||
|
48 / 48 / 26
Регистрация: 31.05.2011
Сообщений: 139
|
||
| 19.02.2015, 19:59 [ТС] | ||
|
Ну, для начала, алгоритм не выкидывает лишнее, а берет необходимое.
Короче, лучше сначала пройтись по 3.5кк с фильтрацией, а потом по 7 с сортировкой, чем сначала по 3.5кк с сортировкой, а потом по 3.5кк с фильтрацией
0
|
||
| 19.02.2015, 19:59 | |
|
Помогаю со студенческими работами здесь
11
Как объединить результаты select если выполняется условие? Postgres select по полю
Если под слоем есть элемент <select>, то он перекрывает часть меню. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи
и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|