Обновить случайную выборку в большой таблице

Используя 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';

Но пара замечаний:

  1. Вы, вероятно, не увидите значительного улучшения производительности по сравнению с ORDER BY NEWID(), На столе с 1-миллиметровыми строками это заняло больше минуты на моей машине.
  2. ТОП есть, потому что TABLESAMPLE не гарантирует точное количество строк - он основан на приблизительном подсчете того, сколько страниц может содержать 50 000 строк. Вы можете получить меньше или больше в зависимости от вашего фактора заполнения, количества столбцов переменной длины, количества значений NULL и т. Д. Приведенный выше TOP поможет ограничить его до 50 000, когда оценка приведет к большему количеству читаемых страниц, но это не поможет, если оценка ниже.

Сейчас обсуждается это в другом вопросе.

Другие вопросы по тегам