Повышение производительности на временных таблицах SQL Server - PullRequest
1 голос
/ 17 августа 2011

Я часто использую временные таблицы для упрощения загрузки данных (более простая отладка, более чистые операторы выбора и т. Д.). Если производительность требует этого, я создам физическую таблицу и т. Д.

Недавно я заметил, что автоматически объявляю свои временные таблицы глобальными (## temp_load), а не локальными (#temp_table). Я не знаю почему, но это было моей привычкой в ​​течение многих лет. Мне никогда не нужно , чтобы таблицы были глобальными, но мне любопытно, есть ли дополнительные издержки для их создания как глобальных. И я должен работать над изменением своих привычек.

Существуют ли дополнительные риски для того, чтобы сделать их глобальными?

1 Ответ

2 голосов
/ 17 августа 2011

Неглобальные временные таблицы гарантированно никогда не столкнутся.

Глобальные временные таблицы аналогичны материализованным таблицам в том смысле, что имя должно быть уникальным для каждого сервера.

Как правило, используйте таблицы ##GLOBAL_TEMP, только когда это необходимо.

В противном случае, если вы пишете процесс, который мог бы запускаться более одного раза одновременно, процессы будут взаимодействовать друг с другом непредсказуемым образом, что крайне затрудняет поиск и устранение неисправностей - Instance 1 может изменить данные, используемые Instance 2 что приводит к тому, что Instance 3 также приводит к неверным результатам.

Мое личное мнение о временных таблицах таково, что я использую их только когда:

  • У меня есть набор результатов от среднего до большого (более 1 м строк)
  • Мне нужно будет индексировать этот набор результатов
  • Мне не нужно будет использовать этот набор результатов более одного раза за итерацию процесса
  • Я уверен, что мне не нужно будет возобновлять процесс в любой момент

Я выделил этот последний пункт, потому что это основная причина, по которой я пытаюсь свести к минимуму использование временной таблицы:

Если у вас длительный процесс и вы используете временные таблицы для хранения промежуточных наборов данных, и что-то умирает, скажем, на 90%, вы должны полностью перезапустить , если эти данные не в материализованной таблице большую часть времени.

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

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