Таблица 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 строк?