Почему быстрее выбрать и скопировать 58000 строк, чем удалить 10000 - PullRequest
0 голосов
/ 30 мая 2018

Таблица MS Access 2010 содержит 68 000 строк, и примерно 10 000 из них являются дубликатами.Удаление всех 10000 с помощью следующего запроса занимает почти 8 часов:

DELETE * FROM [DATA]
WHERE NOT EXISTS (
    SELECT MAXID FROM (
        SELECT MAX(ID) AS MAXID
        FROM [DATA]
        GROUP BY ID_TIME, CURRENCY, ....
    )
    WHERE ID = MAXID
)

Измените DELETE на SELECT, и это по-прежнему занимает 10 минут.Однако если я удаляю NOT, выполнение запроса занимает около секунды, хотя количество возвращаемых строк увеличивается на 48 000:

SELECT * FROM [DATA]
WHERE EXISTS (
    SELECT MAXID FROM (
        SELECT MAX(ID) AS MAXID
        FROM [DATA]
        GROUP BY ID_TIME, CURRENCY, ....
    )
    WHERE ID = MAXID
)

Копирование всех 58 000 строк во временную таблицу с полным удалением каждогозапись в исходной таблице, копирование всего обратно в оригинал и затем удаление всего во временной таблице:

INSERT INTO DATA_TEMPORARY_CLEANUP_TABLE
SELECT * FROM [DATA]
WHERE EXISTS (
    SELECT MAXID FROM (
        SELECT MAX(ID) AS MAXID
        FROM [DATA]
        GROUP BY ID_TIME, CURRENCY, ....
    )
    WHERE ID = MAXID
);

DELETE * FROM [DATA];

INSERT INTO [DATA]
SELECT * FROM DATA_TEMPORARY_CLEANUP_TABLE;

DELETE * FROM [DATA_TEMPORARY_CLEANUP_TABLE];

Максимум 30 секунд.Почему?

(1) Почему NOT EXISTS намного медленнее, чем EXITS?
(2) Почему удаление 10000 строк почти в 1000 раз медленнее, чем копирование 116 000 и 126 000 строк?

...