Какова скорость сопоставления временных таблиц с физическими таблицами в SQL? - PullRequest
5 голосов
/ 21 октября 2008

У меня есть скрипт, который должен временно извлекать данные, чтобы выполнять над ним дополнительные операции, но затем мне не нужно больше его сохранять после запуска скрипта. В настоящее время у меня есть данные в серии временных локальных таблиц (CREATE TABLE #table), которые затем удаляются по завершении их использования. Я думал о переходе на физические таблицы, которые обрабатываются таким же образом (таблица CREATE TABLE), если будет улучшение скорости выполнения сценария (или, может быть, другие преимущества?).

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

РЕДАКТИРОВАТЬ: я должен указать, что я говорю о физических таблицах против временных таблиц. Имеется много информации о временных таблицах и переменных таблицы, например, http://sqlnerd.blogspot.com/2005/09/temp-tables-vs-table-variables.html.

Ответы [ 5 ]

1 голос
/ 21 октября 2008

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

1 голос
/ 21 октября 2008

Какие операции с данными вы выполняете и с какими данными вы работаете?

Я бы придерживался временных таблиц - для больших наборов данных я всегда считал, что это лучший способ, и не только в SQL Server. Вы можете попробовать глобальную временную таблицу (CREATE TABLE ## tablename), которая выходит за рамки действия оператора create.

Из электронной документации по SQL Server (2005):

Если вы создаете глобальный временный Таблица ## сотрудники, любой пользователь в База данных может работать с этой таблицей. Если никто другой пользователь не работает с этой таблицей после его создания таблица удаляется при отключении. Если другой пользователь работает с таблицей после его создания SQL Server удаляет его после отключения и после всех других сессий больше нет активно использую его.

1 голос
/ 21 октября 2008

Временные таблицы являются большим НЕТ в SQL Server.

  • Они вызывают перекомпиляцию плана запроса, что является дорогостоящим.
  • Создание и удаление таблицы также являются дорогостоящими операциями, которые вы добавляете в свой процесс.
  • Если во временные данные поступает большой объем данных, ваши операции будут медленными из-за отсутствия индексов. Вы МОЖЕТЕ создать индексы для временных таблиц. Но я никогда не буду рекомендовать временную таблицу для чего-либо с большим количеством записей.

Ваш другой подход: создание и последующее удаление обычных таблиц просто создает те же издержки.

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

Я рекомендую переосмыслить стратегию обработки. Некоторые альтернативы так же просты, как использование коррелированных запросов, производных таблиц или табличных переменных. Взгляните на: http://www.sql -server-performance.com / article / per / temp_tables_vs_variables_p1.aspx


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

0 голосов
/ 21 октября 2008

Я не уверен на 100% в этом, но я считаю, что табличные переменные строго находятся в памяти, но временные таблицы находятся в базе данных tempdb, которая хранится на диске. Это использует SQL Server, я не уверен, насколько последовательны разные RDMS по этому поводу.

0 голосов
/ 21 октября 2008

Для MySql, по крайней мере, единственная экономия времени, которую вы собираетесь получить, - это экономия времени на фактическом создании временной таблицы. AFAIK все таблицы обрабатываются одинаково на диске, они просто исчезают в конце сеанса. Это то, что я видел на практике. Опять же, это MySQL 4.x и 5.x

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