FOR SYSTEM_TIME ВСЕ с ORDER BY - PullRequest
2 голосов
/ 27 мая 2019

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

Однако, ORDER BY в моей учетной записи вместе с временной подсказкой FOR SYSTEM_TIME ALL заставляет ее пролить данные в базу данных tempdb.,Это настоящий убийца производительности.Мне нужно ORDER BY для нумерации страниц.Я также попробовал UNION как временной таблицы, так и таблицы истории, и применил к этому ORDER BY, но это, естественно, приводит к той же проблеме производительности.Можно ли что-нибудь сделать, чтобы решить эту проблему?

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

Просто FOR SYTEM_TIME ALL:

enter image description here

Просто ORDER BY:

enter image description here

FOR SYSTEM_TIME ALL с ORDER BY:

enter image description here

1 Ответ

0 голосов
/ 27 мая 2019

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

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