Ускоряване на delete
6 отговора
805 прегледа
Ускоряване на delete
Здраейте, имам таблица в която има следните полета
time host
таблицата служи като лог файл, а аз искам периодично да премахвам старите записи по определен критерий. В таблицата постоянно се добавят записи, като само time расте, а host и port се повтарят. Това което искам е да премахна от таблицата тези записи които се повтарят по-малко от 5 пъти. За момента реших проблема като използвам temporary table.
CREATE TEMPORARY TABLE tmptable select host,count(host) as cnt from log group by host HAVING cnt<5;
след това затривам записите
delete from log using tmptable,log where log.host=tmptable.host;
Проблема ми в крайна сметка е,че това май става супер бавно:
Query OK, 153 rows affected (1 min 35.85 sec)
Има ли начин да се оптимизира тази заявка или това е най-добрия вариант?
time host
таблицата служи като лог файл, а аз искам периодично да премахвам старите записи по определен критерий. В таблицата постоянно се добавят записи, като само time расте, а host и port се повтарят. Това което искам е да премахна от таблицата тези записи които се повтарят по-малко от 5 пъти. За момента реших проблема като използвам temporary table.
CREATE TEMPORARY TABLE tmptable select host,count(host) as cnt from log group by host HAVING cnt<5;
след това затривам записите
delete from log using tmptable,log where log.host=tmptable.host;
Проблема ми в крайна сметка е,че това май става супер бавно:
Query OK, 153 rows affected (1 min 35.85 sec)
Има ли начин да се оптимизира тази заявка или това е най-добрия вариант?
Re: Ускоряване на delete
Като начало няма да е зле да сложиш първичен ключ и да свързваш таблиците по него.
След това, можеш и да не минаваш изобщо през временна таблица, а да изтриеш с една вложена заявка.
Everything louder than everything else...
След това, можеш и да не минаваш изобщо през временна таблица, а да изтриеш с една вложена заявка.
Everything louder than everything else...
Re: Ускоряване на delete
Ами ако не се лъжа като ключ може да се използва time,защото си расте с времето. Не е съвсем правилно, но смятам че е решение.
Как може да стане това с вложена заявка?
Как може да стане това с вложена заявка?
Re: Ускоряване на delete
Ако става дума за SQL Server и записите които изтриваш са много повече от тези които оставяш в таблицата, варианта ти е следния:
SELECT записи които искам да запазя INTO #tmpLogTable
TRUNCATE TABLE LogTable
INSERT INTO LogTable SELECT * FROM #tmpLogTable
Това което ти забавя изтриването е 1) сървър прави table scan (т.е. обхожда цялата таблица за да намери записите които изтриваш) 2) DELETE е операция която се log-ва и това отнема много време за големи таблици. TRUNCATE TABLE не се log-ва и не изисква сканиране на таблицата...
Епа, това е моето хоби... [линк]
SELECT записи които искам да запазя INTO #tmpLogTable
TRUNCATE TABLE LogTable
INSERT INTO LogTable SELECT * FROM #tmpLogTable
Това което ти забавя изтриването е 1) сървър прави table scan (т.е. обхожда цялата таблица за да намери записите които изтриваш) 2) DELETE е операция която се log-ва и това отнема много време за големи таблици. TRUNCATE TABLE не се log-ва и не изисква сканиране на таблицата...
Епа, това е моето хоби... [линк]
Re: Ускоряване на delete
Да, идята е добра, но няма как да знам какво точно съдържа таблицата,а да правя заявки за да установя това не знам дали като резултат ще получа по бързо действие.
Re: Ускоряване на delete
е що да няма как да знаеш - зимаш тея дето се повтарят повече от 5 пъти и ги бухаш в темп таблицата. после мачкаш старата и обратно. пробвай, може пък да се забърза.
Re: Ускоряване на delete
Предполагам е супер бавно, защото групирането по текстова колона е доста натоварващо за процесора. Затова ти предлагам да направиш малко реорганизация -> малко нормални форми :). Изнеси полето хост във външна таблица и му създай сурогатен ключ - число, което да използваш в лог таблицата. Така, ще ти е лесно и бързо да групираш по хост колоната. Едно е да сравняваш 3-4 байта, друго е 20-30-40. От което излиза, че поне 5-6 пъти трябва да се ускори грубо или поне така ми се иска :) В ДЕЛЕТЕ заявката също използвай сурогатният ключ. После ако искаш да се отървеш от мъртвите записи в хост таблицата може да направиш един вложен СЕЛЕКТ в ДЕЛЕТЕ над хост.
Дано помогне :)
Дано помогне :)