#sql_server
Я хочу удалить дубликаты строк из таблицы. Я попробовал такое решение: WITH CTE AS( SELECT [col1], [col2], [col3], [col4], [col5], [col6], [col7], RN = ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col1) FROM dbo.Table1 ) DELETE FROM CTE WHERE RN > 1 На моем 3770k, 16gb ram, сперва tempdb выросла до 65 gb, а спустя сутки выполнения запроса я его прервал. В таблице 15 колонок, 200 млн. строк, 42 Гб всего. Есть ли какой-то более быстрый способ для удаления дубликатов или сколько примерно это должно занимать при таком объеме базы? Могу ли я ускорить процесс сравнивая на дублирование только две колонки?
Ответы
Ответ 1
Приведенный запрос противоречит вопросу. Указанный запрос в CTE группирует строки по первому столбцу ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col1). Поэтому запрос удаляет не дубликаты записей, а все записи с идентичным полем col1 кроме первой. При удалении дубликатов важно в аргументе PARTITION BY функции ROW_NUMBER() указать перечисление всех столбцов. Пример для удаления только 1000 первых дубликатов: WITH cte AS ( SELECT RN = ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4, col5, col6, col7 ORDER BY col1) FROM dbo.Table1) DELETE TOP (1000) FROM cte WHERE RN > 1; Можно выполнять запрос в цикле, удаляя данные маленькими кусками.
Комментариев нет:
Отправить комментарий