Лучший способ проверить производительность хранилища данных? - PullRequest
1 голос
/ 27 января 2011

У меня есть хранилище данных на основе Postgresql.

До сих пор я пытался выполнять запросы к базе данных, содержащей лишь небольшую часть моей реальной базы данных. После того, как я написал запросы таким образом, чтобы сделать их эффективными для этой небольшой тестовой базы данных, я запустил запросы на реальной.

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

Ответы [ 2 ]

1 голос
/ 31 января 2011

Узнайте, как интерпретировать вывод EXPLAIN, а затем убедитесь, что вывод EXPLAIN показывает, что выбранный план запроса в большой базе данных аналогичен ожидаемому до запуска запроса.

0 голосов
/ 28 января 2011

Три вопроса:

1) Насколько сложны запросы? Генерация индексов и временных таблиц предполагает, что сервер должен генерировать эти вещи из-за сложных операций с неиндексированными столбцами. Насколько вероятно это? Судя по тому, что вы сообщаете, вероятный ответ «сложен»

2) Насколько велики наборы возврата? Конечный результат - 100 строк или 1 миллион? Из того, что вы сообщаете, ответ может быть любым. Я подозреваю, что этот вопрос не так важен, но важно хотя бы знать.

3) Повторяя вопрос 1 по-другому, даже если возвращаемые наборы малы, есть ли огромные промежуточные результаты, которые необходимо скомпилировать на пути к маленькому результату? Снова, я подозреваю, что ответ здесь - большие сложные промежуточные результаты.

Это предполагает, что по крайней мере некоторые вещи должны быть проиндексированы, и, возможно, данные должны быть структурированы так, чтобы они были ближе к тому, что вы пытаетесь запросить.

Последний вопрос: это распространенная проблема для большинства ваших наиболее важных запросов или только для одного или двух?

РЕДАКТИРОВАТЬ В ОТВЕТ НА КОММЕНТАРИЙ: Я выполняю запросы к хранилищу данных весь день, и некоторые из них занимают около 10 минут. Некоторым требуются часы, и я отталкиваю их в фоновую работу и разбиваю на этапы, чтобы не затопить все. Такова природа обработки очень больших наборов данных.

Мои вопросы в первоначальном ответе направлены на выяснение того, завершатся ли ваши проблемные запросы когда-либо . Можно невольно написать запрос, который выдает столько промежуточных данных, что вы можете уйти, вернуться через 2 дня, и он все еще выполняется. Поэтому я хотел бы повторить три моих первоначальных вопроса, фактически они являются единственным способом полностью ответить на ваш вопрос.

Резюме: Да, некоторые запросы занимают гораздо больше времени, это природа зверя. Лучшее, на что вы можете надеяться, - это производительность, линейно зависящая от объема считываемых данных, и если обрабатывается 100 миллионов строк, это займет минуты, а не секунды. Но что еще более важно, если запрос выполняется за 4 секунды на 1 млн строк, а на 100 млн строк занимает >> 400 секунд (например, час), то те оригинальные вопросы, которые я задал, помогут вам выяснить, почему, с целью оптимизации эти запросы.

...