Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.07.05;
Скачать: CL | DM;

Вниз

tsql, sql express. Как ускорить этот запрос.   Найти похожие ветки 

 
12 ©   (2009-04-27 11:40) [0]

надо срезать БД, поставить это дело на поток (много БД надо срезать)
пишу
declare @Data char(10)
set @Data = "01.01.2008"
delete from journal where document in (select document from document where uredate < @Data)
delete from finjournal where document in (select document from document where uredate < @Data)
delete from document where uredate < @Data

эти 3 таблицы занимают 1,5 - 2 гигабайта
поле document типа GUID
Где-то неделю назад на всех БД сделал дефрагментацию индекса по этим таблицам. Добавление за неделю не должно быть большим ( ну, 1% максимум)
Статистику обновил.

Сейчас выполняется уже 2,5 часа на одной из БД.. Можно быстрее?


 
clickmaker ©   (2009-04-27 11:49) [1]

delete from journal
from journal j
inner join document d on j.document = d.document
where d.uredate < @Data

?


 
Ega23 ©   (2009-04-27 11:49) [2]

create table #docIDs (id uniqueidentifier);

insert into #docIDs (id)
 select document from document where uredate < @Data;

delete from journal where document in (select id from #docIDs);
delete from finjournal where document in (select id from #docIDs);
delete from document where document in (select id from #docIDs);

drop table #docIDs;


Это самое примитивное упрощение, чтобы 3 раза select по дате не делать.

Следующий шаг - сравнение даты не по строке, а по числу (но это надо тип поля смотреть)

А для более реальной оптимизации - надо смотреть структуру БД, какие связи, какие типы столбцов, где какие индексы и т.д.


 
palva ©   (2009-04-27 11:56) [3]


> where uredate < @Data


> Добавление за неделю не должно быть большим ( ну, 1% максимум)

Получается, что вы удаляете практически все, и при этом каждую запись ищете в громадном списке, выданном внутренним селектом. Не экономнее ли будет вытащить новые записи (1%) в новую таблицу, а старую уничтожить?


 
12 ©   (2009-04-27 12:03) [4]

спасибо.

>> Ega23 ©   (27.04.09 11:49) [2]
А намного быстрее будет временную? Просто экспериментировать уже не могу сегодня(уже не с чем), а завтра уже надо на поток ставить

Завтра пораньше приду, попробую еще 2 БД, так и как  clickmaker ©   (27.04.09 11:49) [1] (там с планом сервер долго возился, может и нашел лучший)

ну и вот результат, если что-то прояснит это
delete from journal where document in (select document from document where uredate < @Data)
delete from finjournal where document in (select document from document where uredate < @Data)
delete from document where uredate < @Data
(1985749 row(s) affected)
(514387 row(s) affected)
(262901 row(s) affected)


 
12 ©   (2009-04-27 12:05) [5]

>> palva ©   (27.04.09 11:56) [3]
нет, я удаляю все до 2008 года(более года оставляю)
неделю назад я просто делал дефрагментацию индексов под 0.


 
Ega23 ©   (2009-04-27 12:15) [6]


> А намного быстрее будет временную?


а какая разница - временную, или нет? Ты как минимум 3 раза проходишь по таблице document и выбираешь 3 раза одну и ту же информацию.


 
stas ©   (2009-04-27 13:29) [7]

12 ©   (27.04.09 11:40)
У тебя видимо много записей в этих таблицах, для выполнения удаления сначала все пихается в лог транзакций, который у тебя в этот момент растет до больших размеров.
Сделай это удаление за несколько раз удаляя допустим по 5% записей.


 
12 ©   (2009-04-28 16:59) [8]

Докладываюсь
Советы от EGA и ClickMaker не очень помогли, не заметно что быстрее хоть сколько-то стало, точных цифр не назову, а на глаз одинаково

а вот Sats навредил :)
Удалялось ощутимо дольше

оставил все как есть. Так понятнее читается.


 
Bless ©   (2009-04-28 17:39) [9]

Не знаю, поможет ли, да и кроме того в обоих случаях желательно, чтоб с этими таблицами кроме тебя никто не работал, не знаю, возможно ли это в твоем случае. Но вдруг будет полезно:

1) может, перед удалением есть смысл удалить индексы/триггеры у таблиц, из которых удаляешь, восстановив их после процедуры удаления? Не уверен, что поможет, но если есть возможность попробовать, почему бы нет?

2) Если данных в таблицах остается сильно меньше, чем удаляется, то может вместо удаления из таблицы сделать так:
- скопировать то, что должно отстаться, во временную таблицу
- сделать trancate table
- вернуть данные из временной таблицы в основную.


 
test ©   (2009-04-28 17:45) [10]

drop table journal
drop finjournal
drop document
Пересоздай быстро и эффективно


 
12 ©   (2009-04-28 17:48) [11]

2) Если данных в таблицах остается сильно меньше, чем удаляется, то может вместо удаления из таблицы сделать так:
- скопировать то, что должно отстаться, во временную таблицу
- сделать trancate table
- вернуть данные из временной таблицы в основную

мда, это надо проверить..
еще и palva об этом намекал
но мне кажется, там фифти фифти как раз. Тем более sql-express, там на БД ограничение.

а триггеры то я отключаю, вот насчет индексов не уверен. Это ж потом надо переиндексировать еще будет.. Но можно попробовать


 
test ©   (2009-04-28 18:12) [12]

Проиндексируй по полю uredate все таблицы о индексам он побыстрее шустрит



Страницы: 1 вся ветка

Текущий архив: 2009.07.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.009 c
4-1212234617
hub00
2008-05-31 15:50
2009.07.05
Область подсвечивания.


2-1242577574
Wind
2009-05-17 20:26
2009.07.05
Получить список Экспортируемых функций


3-1223120706
keymaster
2008-10-04 15:45
2009.07.05
Занятная проблема с Oracle XE


2-1242276948
Rimdus
2009-05-14 08:55
2009.07.05
Указаель на TForm...


15-1241720907
@!!ex
2009-05-07 22:28
2009.07.05
Утилита для построения диаграмм.