Временные таблицы и производительность SQL SELECT - PullRequest
4 голосов
/ 16 сентября 2008

Почему использование временных таблиц с оператором SELECT улучшает количество логических операций ввода-вывода? Разве это не увеличит количество обращений к базе данных, а не уменьшит ее. Это потому, что «проблема» разбита на разделы? Я хотел бы знать, что происходит за кулисами.

Ответы [ 4 ]

3 голосов
/ 16 сентября 2008

Нет общего ответа. Это зависит от того, как используется временная таблица.

Временная таблица может уменьшить количество операций ввода-вывода за счет кэширования строк, созданных после сложного фильтра / объединения, которые многократно используются позже в пакете. Таким образом, БД может избежать попадания в базовые таблицы несколько раз, когда требуется только подмножество записей.

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

Создание временной таблицы для однократного использования всего ее содержимого медленнее, чем включение временного запроса в основной запрос, поскольку оптимизатор запросов не может видеть мимо временной таблицы и вынуждает (вероятно) ненужный спул 1008 * данных вместо того, чтобы разрешить их потоковую передачу из исходных таблиц.

1 голос
/ 16 сентября 2008

Я предполагаю, что под временными таблицами вы подразумеваете подвыбор в предложении WHERE. (Это называется полусоединением, и вы обычно можете увидеть это в текстовом плане выполнения вашего запроса.)

Когда оптимизатор запросов встречает таблицу sub-select / temp, он делает некоторые предположения о том, что делать с этими данными. По сути, оптимизатор создаст план выполнения, который выполняет соединение с результирующим набором вложенного выбора, уменьшая количество строк, которые необходимо прочитать из других таблиц. Поскольку строк меньше, обработчик запросов может читать меньше страниц с диска / памяти и сокращать количество операций ввода-вывода.

0 голосов
/ 16 сентября 2008

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

Например: произвольная глубина рекурсивных отношений (босс)

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

0 голосов
/ 16 сентября 2008

AFAIK, по крайней мере с mysql, таблицы tmp хранятся в оперативной памяти, что делает SELECT намного быстрее, чем все, что попадает в HD

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