Обновить случайную выборку в большой таблице
Используя SQL Server 2012, у меня есть таблица с 7 миллионами строк. Колонка PK - это GUID (COMB GUID). Я пытаюсь проверить производительность запроса и сначала нужно обновить случайную выборку данных, я хочу изменить значение столбца (не PK) из 50000 строк.
Выбор Top 500 Order по NEWID() занимает слишком много времени, я думаю, что SQL Server сканирует всю таблицу. Я не могу получить правильный синтаксис для TABLESAMPLE, он возвращает пустой набор.
Каков наилучший способ заставить это работать?
1 ответ
Решение
И рассматривать это как обновление:
;WITH x AS
(
SELECT TOP (50000) col
FROM dbo.table TABLESAMPLE (50000 ROWS)
)
UPDATE x SET col = 'something else';
Но пара замечаний:
- Вы, вероятно, не увидите значительного улучшения производительности по сравнению с
ORDER BY NEWID()
, На столе с 1-миллиметровыми строками это заняло больше минуты на моей машине. - ТОП есть, потому что TABLESAMPLE не гарантирует точное количество строк - он основан на приблизительном подсчете того, сколько страниц может содержать 50 000 строк. Вы можете получить меньше или больше в зависимости от вашего фактора заполнения, количества столбцов переменной длины, количества значений NULL и т. Д. Приведенный выше TOP поможет ограничить его до 50 000, когда оценка приведет к большему количеству читаемых страниц, но это не поможет, если оценка ниже.
Сейчас обсуждается это в другом вопросе.