Ускоряване на delete

6 отговора 805 прегледа
#1

Ускоряване на 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)

Има ли начин да се оптимизира тази заявка или това е най-добрия вариант?

Отговор
в отговор на Martinnnnnn #2

Re: Ускоряване на delete

Като начало няма да е зле да сложиш първичен ключ и да свързваш таблиците по него.

След това, можеш и да не минаваш изобщо през временна таблица, а да изтриеш с една вложена заявка.

Everything louder than everything else...
Отговор
в отговор на Dakota #3

Re: Ускоряване на delete

Ами ако не се лъжа като ключ може да се използва time,защото си расте с времето. Не е съвсем правилно, но смятам че е решение.
Как може да стане това с вложена заявка?

Отговор
в отговор на Martinnnnnn #4

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-ва и не изисква сканиране на таблицата...

Епа, това е моето хоби... [линк]
Отговор
в отговор на fiffy #5

Re: Ускоряване на delete

Да, идята е добра, но няма как да знам какво точно съдържа таблицата,а да правя заявки за да установя това не знам дали като резултат ще получа по бързо действие.

Отговор
в отговор на Martinnnnnn #6

Re: Ускоряване на delete

е що да няма как да знаеш - зимаш тея дето се повтарят повече от 5 пъти и ги бухаш в темп таблицата. после мачкаш старата и обратно. пробвай, може пък да се забърза.

Отговор
в отговор на Martinnnnnn #7

Re: Ускоряване на delete

Предполагам е супер бавно, защото групирането по текстова колона е доста натоварващо за процесора. Затова ти предлагам да направиш малко реорганизация -> малко нормални форми :). Изнеси полето хост във външна таблица и му създай сурогатен ключ - число, което да използваш в лог таблицата. Така, ще ти е лесно и бързо да групираш по хост колоната. Едно е да сравняваш 3-4 байта, друго е 20-30-40. От което излиза, че поне 5-6 пъти трябва да се ускори грубо или поне така ми се иска :) В ДЕЛЕТЕ заявката също използвай сурогатният ключ. После ако искаш да се отървеш от мъртвите записи в хост таблицата може да направиш един вложен СЕЛЕКТ в ДЕЛЕТЕ над хост.

Дано помогне :)

Отговор