Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Удаление дубликатов строк в MSSQL

#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; Можно выполнять запрос в цикле, удаляя данные маленькими кусками.

Комментариев нет:

Отправить комментарий