powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / подскажите по расчистке БД и последующему обслуживанию
90 сообщений из 90, показаны все 4 страниц
подскажите по расчистке БД и последующему обслуживанию
    #39646599
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Не занимались расчисткой БД совсем, несколько лет хранили всё, и сейчас ситуация следующая:
database_size: 65530 MB
unallocated_space: 7168 MB
reserved: 59536944 KB
data: 21540368 KB
index_size: 37946336 KB
unused: 50240 KB
в основных таблицах по 20-30 млн строк.

Есть утилита для расчистки(от поставщика ПО, с которым мы работаем), но она крайне примитивная, ей задаётся дата и всё что ДО этой даты - уничтожается. Но нам такой вариант не подходит. Есть определённые данные, которые мы хотим хранить.
Написали свой скрипт, который отбирает нужные и не нужные данные и через хранимую процедуру удаляет только те записи, которые не нужны. Опыты показывают, что 50-80% данных будут уничтожаться.
Поставили скрипт исполняться в нерабочее время и по ночам он начал потихонечку расчищать БД: сначала выбирает необходимые id и потом удаляет их из множества таблиц.
Вот лог последнего выполнения по основной таблице, значение ДО/ПОСЛЕ выполнения:
rows: 22931608/22877252 (удалил 54356 записей)
reserved: 11118952/11119144 (увеличилось на 192)
data: 2453136/2453192 (увеличилось на 56)
index_size: 8659424/8658760 (уменьшилось на 664)
unused: 6392/7192 (увеличилось на 800)
уточню, что это результаты только по основной таблице, помимо неё удаление происходит ещё в ~5 связанных таблицах.

Под утро выполняется план обслуживания БД:
1) бекап
2) индексирование
3) шринк


Забыл сказать причину расчистки: приложение которое работает с базой начало жутко виснуть, выдавать ошибки, профайлером посмотрели запросы, нашли запросы, которые БД исполняет очень долго, а программа ждёт ответ в течение 30 секунд и потом выдаёт ошибку(timeout).
Вот прямо сейчас вижу запрос, который исполняется 44 секунды, а программа через 30 секунд ожидания выдала ошибку и всё.

Вопросы:
1) Надо ли ещё что-нибудь делать в нашем случае?
2) Не совсем понял момент по значению data - оно не уменьшилось после удаления записей, а наоборот выросло, так и должно быть?
3) Вечером перезагружаем сервер, после полного запуска SQL съедает 15-25% ОЗУ, утром приходим(ночью отработал скрипт расчистки, потом бекап, потом индексация, потом шринк) и съедено 70-90% ОЗУ, в течение дня доходит до ~97%. Так и должно быть?
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646611
iiyama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,
re>database_size: 65530 MB

Это "пятничный" юмор такой?
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646614
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну может это sql2000 на офисной машинке с дохлым цпу и маленькими дисками?
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646616
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня скоро передергивать от слова шринк будет, в особености после перестроения индексов.
Шринкуй, перезагружай, доминируй!
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646721
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58Вопросы:
1) Надо ли ещё что-нибудь делать в нашем случае?
2) Не совсем понял момент по значению data - оно не уменьшилось после удаления записей, а наоборот выросло, так и должно быть?
3) Вечером перезагружаем сервер, после полного запуска SQL съедает 15-25% ОЗУ, утром приходим(ночью отработал скрипт расчистки, потом бекап, потом индексация, потом шринк) и съедено 70-90% ОЗУ, в течение дня доходит до ~97%. Так и должно быть?1.а Шринк срочно уберите, он раз за разом замедляет работу базы.
1.б Пытайтесь оптимизировать работу приложения, например, модифицируйте его, если возможно, или попытайтесь построить недостающие индексы.
2. Вообще должно уменьшаться, раз удаляете.
3. Нормально. Если на сервере запущены ещё какие то приложения, кроме MSSQL, то можете ограничить ему память. Он забирает столько памяти, сколько дадут.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646731
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

если у вас переиндексация - регулярная операция, запаситесь дисковым пространством. Ничего шринкать не надо. Оно для другого предназначено.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646761
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

65 гигов, это "ни о чем" по современным меркам. поэтому надо доделать главную работу:
"рофайлером посмотрели запросы, нашли запросы, которые БД исполняет очень долго, "
а теперь проанализировать эти запросы и понять что на самом деле причина их тормозов
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646774
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iiyama, нет) я серьёзно. Прикладываю скриншот.

Konst_One, SQL Server 2012 (x64) в стоечном сервере IBM с 32 ГБ ОЗУ.

aleksrov, ;) полагаю, мы делаем, что то не правильно, я здесь и пытаюсь разобраться. Сам я НЕ обслуживаю БД, я с ней работаю, тот кто обслуживает говорит, что планы настроил в соответствии с инструкцией которую получил от поставщика ПО.

alexeyvg,
alexeyvg1.а Шринк срочно уберите, он раз за разом замедляет работу базы.
Сейчас уберу. То есть оставляю только: бекап и индексацию?
И ещё момент: шринк вообще отключать на совсем? или не делать его ежедневно?
Со слов технаря он отключал шринк, но тогда лог вырастает до 200Гб.

alexeyvg1.б Пытайтесь оптимизировать работу приложения, например, модифицируйте его, если возможно, или попытайтесь построить недостающие индексы.
Приложение не наше, не доступно для изменения, и относительно часто обновляется, поэтому даже доступные для изменения хранимые процедуры, которые использует приложение не хочется трогать, т.к. в случае будущих обновлений можно что-либо упустить. И изменять структуру БД уж совсем не хочется.

alexeyvg2. Вообще должно уменьшаться, раз удаляете.
а вообще после обширного удаления данных что необходимо сделать? переиндексацию?

alexeyvg3. Нормально. Если на сервере запущены ещё какие то приложения, кроме MSSQL, то можете ограничить ему память. Он забирает столько памяти, сколько дадут.
Понял! Нет, сервер исключительно под БД, пусть забирает всю ОЗУ.


Параллельно веду переписку с разработчиком ПО, они говорят, что база огромна и надо расчищать :-\ только после расчистки надо оценить поможет или нет и смотреть дальше.
Будем расчищать, но процесс не быстрый, во время работы это не возможно делать, пользователи жалуются на тормоза.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646780
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@база 65Гб

@тормозит

@половина базы влазит в память

@разработчиком ПО, они говорят, что база огромна

что это за зверь
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646782
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно было бы посмотреть текущие настройки вашей базы:

Код: sql
1.
SELECT * FROM sys.databases WHERE name = 'ваше имя базы'
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646816
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так, сейчас ещё раз всё проверил лично по обслуживанию, оказывается включен в плане на текущий момент только бекап и за ним шринк. Индексацию выключали и не помнят когда.

Если быть точным то вот так:
1) Ежедневное (разностное) копирование - ежедневно кроме понедельника в 02:30 (проверка целостности, резервное копирование БД(разностное), очистка после обслуживания, очистка журнала)
2) Еженедельное полное копирование - по понедельникам в 02:30 (проверка целостности, резервное копирование БД(полное), очистка после обслуживания, очистка журнала)
3) шринк - каждые 6 часов начиная с 04:00 и до 23:59 (резервное копирование (журнал транзакций), сжатие бд, очистка журнала, очистка после обслуживания(удаление резервного копирования бд), очистка после обслуживания(отчёт плана обслуживания)).

Вижу план на выполнение команд:
Код: sql
1.
2.
3.
4.
use BDname;
DBCC SHRINKDATABASE(BDname)
exec sp_msforeachtable 'dbcc dbreindex(''?'')'
exec sp_msforeachtable 'update statistics ?'



но он отключен. Обслуживающий человек говорит, что данная задача просто вешала базу, работать не возможно, за ночь не успевала выполниться, поэтому и отключил.

На сколько я понимаю, по этому плану БД уходит в монопольный режим и надо ждать её выполнения, но это слишком долго.

Подскажете как быть? Мне приходит в голову идея сначала очищать базу до максимально возможного и на ночь включать пересоздание индексов. Только вот очищать базу мы будем примерно месяц.
Или сейчас, пока идёт очистка, делать обновление статистики (exec sp_msforeachtable 'update statistics ?') и дефрагментацию индексов(exec sp_msforeachtable 'dbcc INDEXDEFRAG (BDname, ''?'')' ?

Ещё вопрос: а нормально ли это, что БД весит 65Гб, из которых почти половину занимает именно index_size ?
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646817
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_Oneинтересно было бы посмотреть текущие настройки вашей базы:
Код: sql
1.
SELECT * FROM sys.databases WHERE name = 'ваше имя базы'


для удобства чтения транспонировал:
database_id 8
source_database_id NULL
owner_sid 0x01
create_date 14.10.2017 15:02
compatibility_level 110
collation_name Cyrillic_General_CI_AS
user_access 0
user_access_desc MULTI_USER
is_read_only 0
is_auto_close_on 0
is_auto_shrink_on 1
state 0
state_desc ONLINE
is_in_standby 0
is_cleanly_shutdown 0
is_supplemental_logging_enabled 0
snapshot_isolation_state 0
snapshot_isolation_state_desc OFF
is_read_committed_snapshot_on 0
recovery_model 1
recovery_model_desc FULL
page_verify_option 2
page_verify_option_desc CHECKSUM
is_auto_create_stats_on 1
is_auto_update_stats_on 1
is_auto_update_stats_async_on 0
is_ansi_null_default_on 0
is_ansi_nulls_on 0
is_ansi_padding_on 0
is_ansi_warnings_on 0
is_arithabort_on 0
is_concat_null_yields_null_on 0
is_numeric_roundabort_on 0
is_quoted_identifier_on 0
is_recursive_triggers_on 0
is_cursor_close_on_commit_on 0
is_local_cursor_default 0
is_fulltext_enabled 1
is_trustworthy_on 0
is_db_chaining_on 0
is_parameterization_forced 0
is_master_key_encrypted_by_server 0
is_published 0
is_subscribed 0
is_merge_published 0
is_distributor 0
is_sync_with_backup 0
service_broker_guid 72CB2F71-261E-4A89-A054-5F1AB23A5A24
is_broker_enabled 0
log_reuse_wait 2
log_reuse_wait_desc LOG_BACKUP
is_date_correlation_on 0
is_cdc_enabled 0
is_encrypted 0
is_honor_broker_priority_on 0
replica_id NULL
group_database_id NULL
default_language_lcid NULL
default_language_name NULL
default_fulltext_language_lcid NULL
default_fulltext_language_name NULL
is_nested_triggers_on NULL
is_transform_noise_words_on NULL
two_digit_year_cutoff NULL
containment 0
containment_desc NONE
target_recovery_time_in_seconds 0
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646821
iiyama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

recovery_model_desc FULL + единственный полный бэкап раз в сутки = пятница удалась
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646828
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

для начала сразу:
Код: sql
1.
2.
alter database <databasename>
set auto_shrink off



Из плана обслуживания нафиг уберите shrink, это довольно вредная операция.
У вас что там в базе постоянно большой объем данных прибавляется и одновременно чистится?
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646837
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм. сорян поспешил не дочитав первый пост.

Если вам базу надо почистить а объем удаляемых данных превышает объемы данных для хранения имеет смысл перелить нужные данные в новые таблицы, удалить старые, переименовать новые названиями старых таблиц. после этого разово сделать shrink для базы.

Порционно удаляя данные и делая каждую ночь shrink вы будете наблюдать картину "торможения" приложения еще очень долго.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646841
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iiyama, тот неловкий момент, но я не понял шутку) полагаю у нас не правильный бекап, с ним пока не разбирался даже.
И, кстати, у нас настроено полное зеркалирование БД на аналогичный сервер.


felix_ff,
felix_ffдля начала сразу:
Код: sql
1.
2.
alter database <databasename>
set auto_shrink off


Выполнение команд успешно завершено

felix_ffИз плана обслуживания нафиг уберите shrink, это довольно вредная операция.
в плане обслуживания шринк ОТКЛЮЧИЛ лично, появился красная стрелочка вниз у иконки.

felix_ffУ вас что там в базе постоянно большой объем данных прибавляется и одновременно чистится?
Прибавляется - да.
И вот только пару дней как я запустил свой скрипт расчистки, теперь и удаляется примерно в 2 раза больше чем добавляется.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646848
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

извиняюсь за несколько грубую аналогию, но ваша ситуация с базой напоминает старый анекдот про козла, который " сильно задрочен, но жить будет "(с).
Вам бы нужно "остричь" вашего "козла", "помыть" и "причесать", а вы его - доить пытаетесь...

Теперь несколько мыслей по существу:

1) Бэкапы. В общем случае принято делать не только полный бэкап базы, но и периодические бэкапы транзакт-лога (между полными бэкапами). Периодичность выбирать исходя из интенсивности изменения данных и желаемого размера транзакт-лога. В этом случае размер лога не будет выходить "за рамки приличия". А его шринки станут невостребованной операцией.

2) Статистика. У MS SQL Server хороший и сильный оптимизатор запросов, но он основан не на "телепатии", а на "стоимости операций", для расчета которой требуется актуальная информация по таблицам, индексам и распределению данных в них. Поэтому задача по своевременному обновлению устаревших статистик - одна из важных при обслуживании базы. Необязательно это делать каждый день, для всех таблиц и полным сканированием. Но делать это надо.

3) Индексы. Их отсутствие может приводить к печальным результатам в производительности. Но наличие "неподходящих" или плохо обслуживаемых "деградировавших" индексов - не намного лучше.


Начните с малого: список проблемных запросов вам известен. Посмотрите их планы; обновите статистику по таблицам, участвующим в этих запросах; убедитесь, что схема индексирования таблиц удовлетворяет условиям фильтрации и соединения данных в запросах.
Сриптов по поиску и обновлению устаревшей статистики, поиску отсутствующих индексов, поиску сильно фрагментированных индексов- в интернете пруд-пруди.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646856
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

Судя по приведенным параметрам - автообновление статистики у вас включено. Возможно, таблицы растут не настолько быстро, чтобы успел сработать автосбор, но достаточно быстро, чтобы планы успели "поехать".
Меня "сейчас, должно быть, будут убивать"(с) но считаю, что на вашей версии сервера вполне себе целесообразно активировать trace flag 2371, и, возможно, перевести параметр is_auto_update_stats_async_on в true
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646865
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

Если честно очень сложно обьяснить как должно быть когда человек полный 0 (это не камень в ваш огород, просто факт). Правда, почитайте про то что такое шринк, виды резервного копирования, модели восстановление и по многому озарение придет само.
У меня везде включены флаги 1117, 1118, 2371.
Выгоняйте нахрен вашего технаря который говорит что если не шринковать лог то будет капец.
Почему НЕ НАДО делать шринк, здесь
https://www.brentozar.com/archive/2009/08/stop-shrinking-your-database-files-seriously-now/
https://www.sqlskills.com/blogs/paul/why-you-should-not-shrink-your-data-files/
Про шринк лога
https://stackoverflow.com/questions/56628/how-do-you-clear-the-sql-server-transaction-log
У вас 50% базы в оперативе, вы счастливый человек. Дело не в кол-во данных, а в корявых запросах, ищите и оптимизируйте.

Анна - "Периодичность выбирать исходя из интенсивности изменения данных и желаемого размера транзакт-лога". Периодичность выбирают исходя из RPO а не из интенсивности изменения данных.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646867
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

кстати да Щукина Анна правильно подметила.
У вас сейчас модель восстановления базы FULL, соответственно вам необходимо настроить периодически что бы делались бэкапы лога транзакций, иначе он неизбежно будет расти.

на счет чистки как я уже сказал вам надо оценить объемы работы по удалению.
Если у вас на выхлопе вы допустим с таблицы в миллиард строк хотите видите что данные которые необходимо оставить составляют к примеру 20 миллионов, а остальная часть таблицы идет под удаление. то выгодней будет перелить нужные данные в новую таблицу, старую дропнуть и потом переименовать.

При этом если по каким то сакральным причинам вам необходимо отдать освободившееся место системе (к примеру размер файла БД подходит к границам диска а добавлять место вам по политическим наставлениям запрещает Папа Римский)
То ваши действия должны быть такими

1) переливаем нужные данные в новую таблицу (желательно что бы новая таблица размещалась в другой файловой группе)
2) делаем drop table или truncate старых таблиц
3) делаем shrinkfile файлов данных объем которых необходимо уменьшить
4) переименовываем новые таблицы в старые
5) настраиваем правильное обслуживание статистики и индексов


ну а если у вас ситуация такова что процентное соотношение удаляемых к сохраняемым данным приблизительно равно, тогда вот вам неплохая статья касательно порционного удаления данных.

https://sqlperformance.com/2013/03/io-subsystem/chunk-deletes
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646868
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksrovПериодичность выбирают исходя из RPO а не из интенсивности изменения данных.те же "яйца", только в профиль....
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646901
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58Параллельно веду переписку с разработчиком ПО, они говорят, что база огромна и надо расчищать :-\ только после расчистки надо оценить поможет или нет и смотреть дальше.К сожалению большинство разработчиков ленивые и мало что понимают в оптимизации баз данных. А еще у них нет вашей копии базы. Им даже просто не хочется тратить время на выяснение почему там у пары клиентов что-то тормозит, больше денег они за это все равно не получат. На их тестовых базах в 10МБ все летает, так что да, конечно же проблема в том что база разрослась. Поэтому советы по производительности от вендоров обычно сводятся к обновлению статистики и перестроению индексов.
Так что самая реальная возможность что то исправить это смотреть на медленные запросы и планы самому, если сами не понимаете, выкладывайте планы сюда. Ну а там обычно 2 варианта: отсутсвуют индексы или нужно переписывать запрос. Если индексы, то просто создаете их, вряд ли разрабы накатывают апдейты путем пересоздания таблиц. Ну или можете попробовать пропихнуть это в их обновления. Разницы особой нет. Если же нужно переписывать запрос/процедуру, тогда придется долго и упорно вести переписку с разрабами о том почему их код кривой и как можно все исправить, может они согласятся и включат ваши фиксы в следующие обновления.
Serg58rows: 22931608/22877252 (удалил 54356 записей)Это работа скрипта за ночь? Меньше 1% строк? У вас наверное новые данные быстрее добавляются. Возможно ваш скрипт неопимизирован. Удаляет по одной строке и индексов на внешних ключах вообще нет?
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646904
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,
Начните с недостающих индексов. Запустите вот этот скрипт на вашей базе.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
DECLARE @lastDays INT
SET @lastDays = 3

SELECT
  table_name = OBJECT_SCHEMA_NAME(mid.object_id, mid.database_id) + '.' + OBJECT_NAME(mid.object_id, mid.database_id),
  advantage = CONVERT(decimal(15, 3), user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)), 
  mid.index_handle,
  migs.last_user_seek,
  equality_columns = ISNULL(mid.equality_columns, ''), 
  inequality_columns = ISNULL(mid.inequality_columns, ''), 
  included_columns = ISNULL(mid.included_columns, ''),
  migs.avg_user_impact,
  migs.user_seeks, 
  avg_total_user_cost = CONVERT(decimal(15, 3), migs.avg_total_user_cost), 
  migs.unique_compiles, 
  recommended_index = 
    'CREATE INDEX [' + 'IX_' + OBJECT_NAME(mid.object_id, mid.database_id) + '_' +
    replace(replace(replace(ISNULL(mid.equality_columns,'')
    + CASE WHEN mid.equality_columns IS NOT NULL AND  mid.inequality_columns IS NOT NULL THEN '_' ELSE '' END
    + ISNULL(mid.inequality_columns,''), '[', ''), ']', ''), ', ', '_')
    + ']' + CHAR(13) + CHAR(10) + 'ON '
    + mid.statement
    + '(' + ISNULL(mid.equality_columns,'')
    + case 
      when mid.equality_columns is not null and mid.inequality_columns is not null 
        then ', '
      else ''
      end
    + ISNULL(mid.inequality_columns,'') +
    + case 
      when mid.included_columns is null 
        then ')'
      else ')' + CHAR(13) + CHAR(10) + 'INCLUDE (' + ISNULL(mid.included_columns,'') + ')'
      end 
FROM sys.dm_db_missing_index_group_stats AS migs
  INNER JOIN sys.dm_db_missing_index_groups AS mig ON migs.group_handle = mig.index_group_handle
  INNER JOIN sys.dm_db_missing_index_details AS mid ON mig.index_handle = mid.index_handle
WHERE mid.database_id = DB_ID() 
AND migs.last_user_seek >= DATEADD(DAY, -@LastDays, GETDATE())
ORDER BY advantage DESC

...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646932
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58И ещё момент: шринк вообще отключать на совсем? или не делать его ежедневно?
Со слов технаря он отключал шринк, но тогда лог вырастает до 200Гб.Да, насовсем. Файл должен вырасти до некоторого размера, а потом стабилизироваться.
Скорее всего, для выполнения некоторых действий (например, реиндексации) нужен запас пространства, вот файл и растёт. после выполнения этих действий место в файле освобождается. Так зачем сокращать файл, если он потом всё равно расширится?
Шринк - это аварийная разовая операция, которая делается для устранения последствий каких либо ошибок в эксплуатации базы, делать его нужно не по расписанию, а обдуманно, и вместе с устранением этих ошибок.

Serg58а вообще после обширного удаления данных что необходимо сделать? переиндексацию?Да, можно перестроить индексы, после завершения всего процесса удаления (не очередной порции)
Serg58Приложение не наше, не доступно для изменения, и относительно часто обновляется, поэтому даже доступные для изменения хранимые процедуры, которые использует приложение не хочется трогать, т.к. в случае будущих обновлений можно что-либо упустить. И изменять структуру БД уж совсем не хочется.Да, это понятно, ну вот, на этот случай я добавил про "индексы". Проанализируйте профайлером долгие запросы, посмотрите рекомендации сервера (он их показывает при просмотре планов), и возможно либо решите проблему созданием индексов, либо обновлением статистики, либо хотя бы передадите конкретику разработчикам.
Serg58Параллельно веду переписку с разработчиком ПО, они говорят, что база огромна и надо расчищать :-\Это яркий и однозначный признак непрофессионализма разработчиков. Не должны старые данные влиять на скорость выполнения оперативных транзакций.
Serg58полагаю, мы делаем, что то не правильно, я здесь и пытаюсь разобраться. Сам я НЕ обслуживаю БД, я с ней работаю, тот кто обслуживает говорит, что планы настроил в соответствии с инструкцией которую получил от поставщика ПО.И к тем, кто обслуживает, тот же самый вопрос. Почему разбираетесь вы, а не они, почему не они задают тут вопросы, почему не они дают вам эти советы, и вообще, просто не решают проблемы, что бы вы и пользователи их даже не заметили? "Планы настроил в соответствии с инструкцией"? Он кто, секретарша-машинистка, тексты набирает по инструкции, или специалист по MSSQL?
Serg58Индексацию выключали и не помнят когда.Вообще говоря, перестроение индекса нужно, что бы устранить последствия шринка (и для других подобных случаев). Для нормального использования индексов их не нужно перестраивать.
Достаточно обновлять статистику, да и то можно не каждый день.

Serg58Мне приходит в голову идея сначала очищать базу до максимально возможного и на ночь включать пересоздание индексов. Только вот очищать базу мы будем примерно месяц.Вот через месяц всё это и сделаете.

Уберите шринк, сделаете его вручную после очистки, тогда же сделаете и переиндексацию
В ежедневных джобах оставьте бакап и статистику, последнюю можно попробовать перенести на выходные, если не будет хватать времени.

Serg583) шринк - каждые 6 часов начиная с 04:00 и до 23:59 (резервное копирование (журнал транзакций), сжатие бд, очистка журнала, очистка после обслуживания(удаление резервного копирования бд), очистка после обслуживания(отчёт плана обслуживания)).:-) В общем, напихали всё, про что прочитали :-)
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646933
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо всем за ответы!

iiyama, iiyamaSerg58,
recovery_model_desc FULL + единственный полный бэкап раз в сутки = пятница удалась
полный бекап у нас раз в неделю по понедельникам, а ежедневно - разностный.
Я уже понял, что это не правильно, с этим буду разбираться позже, сейчас разобраться с тормозами.


Щукина Анна, Щукина АннаSerg58,
извиняюсь за несколько грубую аналогию, но ваша ситуация с базой напоминает старый анекдот...
всё именно так, полностью с Вами согласен. Я работаю с базой как её пользователь, обслуживать её вообще не моя работа, не мой отдел. Но жутко надоели тормоза, технари говорят, что всё в соответствии как указано разработчиком ПО, а тех.поддержка говорит присылайте логи, очищайте базу и т.д.
Решил сам разобраться.

Щукина Анна1) Бэкапы. В общем случае принято делать не только полный бэкап базы, но и периодические бэкапы транзакт-лога (между полными бэкапами). Периодичность выбирать исходя из интенсивности изменения данных и желаемого размера транзакт-лога. В этом случае размер лога не будет выходить "за рамки приличия". А его шринки станут невостребованной операцией.
Про бекап, повторюсь, буду разбираться отдельно. Сейчас у нас полное зеркалирование БД идёт в 2 сервер.
И вот эти бекапы, о которых писал выше.


Щукина Анна2) Статистика. У MS SQL Server хороший и сильный оптимизатор запросов, но он основан не на "телепатии", а на "стоимости операций", для расчета которой требуется актуальная информация по таблицам, индексам и распределению данных в них. Поэтому задача по своевременному обновлению устаревших статистик - одна из важных при обслуживании базы. Необязательно это делать каждый день, для всех таблиц и полным сканированием. Но делать это надо.

3) Индексы. Их отсутствие может приводить к печальным результатам в производительности. Но наличие "неподходящих" или плохо обслуживаемых "деградировавших" индексов - не намного лучше.
Вооот! Сейчас у меня начинает вырисовываться то что у нас произошло: база заполнялась, не чистилась(СОВСЕМ), не обслуживалась(только бекап и шринк).
Тут мы запустили расчистку, удалилось множество данных и после этого запрос который до этого выполнялся - стал выполнятся в разы дольше.
Думается мне, что если запустить обновление статистики и дефрагментацию индексов запрос будет выполнятся в разы быстрее.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646939
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgSerg58а вообще после обширного удаления данных что необходимо сделать? переиндексацию?Да, можно перестроить индексы, после завершения всего процесса удаления (не очередной порции)
Правильно ли я понял, что после порционного удаления можно делать обновление статистики (exec sp_msforeachtable 'update statistics ?') а когда расчистим базу сильно сделать переиндексацию(exec sp_msforeachtable 'dbcc dbreindex(''?'')')
Два вопроса:
1) когда нужно использовать дефрагментацию индексов(exec sp_msforeachtable 'dbcc INDEXDEFRAG (BDname, ''?'')' ?
2) сейчас у нас стоит цель из 22млн(основной таблицы) расчистить не нужные нам данные, это где то 50-80%, и мы выйдем на ориентировочно следующий цикл: в день поступает ~30-50 тысяч новых записей, и примерно столько же будет удаляться старых(которые отлежали примерно год в базе), в таком случае какой принцип обслуживания, когда что делать?

alexeyvgПроанализируйте профайлером долгие запросы, посмотрите рекомендации сервера (он их показывает при просмотре планов), и возможно либо решите проблему созданием индексов, либо обновлением статистики, либо хотя бы передадите конкретику разработчикам.
Всё же я думаю, что для начала надо досконально разобраться с обслуживанием БД. По большому счёту когда БД только запустили и данных было мало, их никто не удалял - всё работало быстро(ну, относительно быстро). А тут запустили удаление старых данных и сразу же появились проблемы с тем, что раньше работало. Причём работает это именно с теми таблицами, которые очищаются.

alexeyvgИ к тем, кто обслуживает, тот же самый вопрос. Почему разбираетесь вы, а не они, почему не они задают тут вопросы, почему не они дают вам эти советы, и вообще, просто не решают проблемы, что бы вы и пользователи их даже не заметили? "Планы настроил в соответствии с инструкцией"? Он кто, секретарша-машинистка, тексты набирает по инструкции, или специалист по MSSQL?
Ой, это отдельная и очень сложная тема. Я ему не начальник, совершенно другой отдел, просто мне не всё равно. Вопрос этот очень обширный и совсем не по теме.

alexeyvgУберите шринк, сделаете его вручную после очистки, тогда же сделаете и переиндексацию
В ежедневных джобах оставьте бакап и статистику, последнюю можно попробовать перенести на выходные, если не будет хватать времени.
шринк уже убрал, и в планах его отключил, и командой что дали здесь выше.
Статистику и дефрагментацию индексов я сегодня вечером прогнал на более мелких базах - всё ок.
В понедельник у меня будет возможность запустить обновление статистики и на основной самой большой базе
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646943
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58Правильно ли я понял, что после порционного удаления можно делать обновление статистики (exec sp_msforeachtable 'update statistics ?') а когда расчистим базу сильно сделать переиндексацию(exec sp_msforeachtable 'dbcc dbreindex(''?'')')Да.

Serg58Два вопроса:
1) когда нужно использовать дефрагментацию индексов(exec sp_msforeachtable 'dbcc INDEXDEFRAG (BDname, ''?'')' ?
2) сейчас у нас стоит цель из 22млн(основной таблицы) расчистить не нужные нам данные, это где то 50-80%, и мы выйдем на ориентировочно следующий цикл: в день поступает ~30-50 тысяч новых записей, и примерно столько же будет удаляться старых(которые отлежали примерно год в базе), в таком случае какой принцип обслуживания, когда что делать?1. Когда индексы фрагментируются. Погуглите скрипты, они обычно оценивают уровень фрагментации, и потом делают дефрагментацию, если надо.
Но можно не связываться, а делать (редко, раз в месяц, например) перестроение индексов, или вообще никогда не делать - зависит от вашей системы.
2. Делать обновление статистики раз в неделю.
Serg58А тут запустили удаление старых данных и сразу же появились проблемы с тем, что раньше работало. Причём работает это именно с теми таблицами, которые очищаются.Это может быть из за неактуальной статистики, или от шринка.
Serg58Думается мне, что если запустить обновление статистики и дефрагментацию индексов запрос будет выполнятся в разы быстрее.Да, или статистику и дефрагментацию, или перестроить индексы (вместе и то и другое не надо - при перестроении статистика становится актуальной, и фрагментация исчезает).
Serg58Щукина Анна1) Бэкапы. В общем случае принято делать не только полный бэкап базы, но и периодические бэкапы транзакт-лога (между полными бэкапами). Периодичность выбирать исходя из интенсивности изменения данных и желаемого размера транзакт-лога. В этом случае размер лога не будет выходить "за рамки приличия". А его шринки станут невостребованной операцией.
Про бекап, повторюсь, буду разбираться отдельно. Сейчас у нас полное зеркалирование БД идёт в 2 сервер.
И вот эти бекапы, о которых писал выше.Если у вас модель полная, и нет бакапа лога, то разобраться с этим - первоочередная задача, потому что все изменения, которые вы делаете с данными (в том числе удаляемые старые данные) остаются в базе.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39646944
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MindSerg58rows: 22931608/22877252 (удалил 54356 записей)Это работа скрипта за ночь? Меньше 1% строк? У вас наверное новые данные быстрее добавляются. Возможно ваш скрипт неопимизирован. Удаляет по одной строке и индексов на внешних ключах вообще нет?
сейчас скрипт работает в режиме теста, он забирает из базы 100 тысяч записей (на это уходит от 0 до 6 секунд) и в цикле проверяет каждую строку, если она удовлетворяет условиям - вызывается хранимая процедура(которую делал не я, а разработчики ПО) и удаляет передаваемое ей значение(id записи). Удаляет процедура и в нескольких взаимосвязанных таблицах, во всех них есть столбец с этим id который я передаю ей.
Тот результат что я давал удалил из 100 тысяч - 54356 записи только в основной таблице, в смежных таблицах ещё больше, ибо несколько таблиц много записей к одной id из основной.
Работал этот скрипт 64 минуты, скрипт на питоне.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647333
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg, большое Вам спасибо за комментарии!

alexeyvgЕсли у вас модель полная, и нет бакапа лога, то разобраться с этим - первоочередная задача, потому что все изменения, которые вы делаете с данными (в том числе удаляемые старые данные) остаются в базе.
хм...у нас сейчас по понедельникам полный бекап, а каждый следующий день - разностный бекап. Этого не достаточно?


ещё я почитал несколько статей, тем и составил себе следующий план, прокомментируйте, пожалуйста, не ошибся ли я:
1.отключить шринк, совсем - сделано
2.в связи с отключением шринка посмотреть сколько будет весить журнал(лог), если он будет слишком огромный просчитать вариант перехода на 2-3 полных бекапа в неделю, вместо одного, либо вообще рассмотреть вариант отказа от разностного(дифференцированного) варианта и перейти на бекап лога (журнал транзакций).
3.завтра(в понедельник) сделать обновление статистики (exec sp_msforeachtable 'update statistics ?') и дефрагментацию индексов(exec sp_msforeachtable 'dbcc INDEXDEFRAG (BDname, ''?'')' и проверить как будет выполняться тот долгий запрос.
4.расчистить БД от ненужных данных (ориентирочно база должна уменьшится на 50-70%)
5.после окончания расчистки, сделать её ежедневной, что бы не копилось ненужное.
6.после окончания расчистки сделать переиндексацию (exec sp_msforeachtable 'dbcc dbreindex(''?'')')
7.настроить раз в неделю обновление статистики (exec sp_msforeachtable 'update statistics ?') (вопрос: её делать ПЕРЕД полным бекапом или ПОСЛЕ бекапа? )
8.воспользоваться скриптами для определения фрагментации индексов, и определиться нужно ли делать дефрагментацию индексов(exec sp_msforeachtable 'dbcc INDEXDEFRAG (BDname, ''?'')', либо просто раз в месяц поставить.

смотреть как работает БД, если проблемы с тормозами не решатся, то профайлером смотреть долгие запросы, их планы и разбираться с конкретными запросами, возможно, действительно не хватает каких-либо индексов.

вот пока всё.

ещё прочитал про очистку процедурного кэша (DBCC FREEPROCCACHE), но пока не понял, надо ли оно.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647336
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58alexeyvgЕсли у вас модель полная, и нет бакапа лога, то разобраться с этим - первоочередная задача, потому что все изменения, которые вы делаете с данными (в том числе удаляемые старые данные) остаются в базе.
хм...у нас сейчас по понедельникам полный бекап, а каждый следующий день - разностный бекап. Этого не достаточно?

2.в связи с отключением шринка посмотреть сколько будет весить журнал(лог), если он будет слишком огромный просчитать вариант перехода на 2-3 полных бекапа в неделю, вместо одного, либо вообще рассмотреть вариант отказа от разностного(дифференцированного) варианта и перейти на бекап лога (журнал транзакций).
В полной модели лог хранится вечно , он не удаляется дифф или полными бакапами, шринком и т.д.
Освободить место в файле лога можно только бакапом лога, и никак иначе.
Либо вообще ничего там не хранить, переведя базу с полной модели на простую.
Serg58ещё прочитал про очистку процедурного кэша (DBCC FREEPROCCACHE), но пока не понял, надо ли оно.Обычно это делают для тестирования, регулярно не надо.

В остальном да, ну, может мелочь какая то.

Обновлять статистику до или после бакапа - неважно.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647355
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgЛибо вообще ничего там не хранить, переведя базу с полной модели на простую.Судя по тому, как ТС притворяет рекомендации с форума в жизнь своей системы - не мешало бы уточнить, чем чревато держать базу в режиме Simple. Кроме того, ТС пару раз упоминал о зеркалировании. Непонятно, что за зеркалирование и на чем построено. Может там лог-шиппинг, несовместимый с простым режимом или ещё что-то....
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647376
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаalexeyvgЛибо вообще ничего там не хранить, переведя базу с полной модели на простую.Судя по тому, как ТС притворяет рекомендации с форума в жизнь своей системы - не мешало бы уточнить, чем чревато держать базу в режиме Simple.Просто начинающему не-сиквелисту не рассказать про весь сиквел в обычном ответе на вопрос, поэтому я не стал углубляться. Ну и бакап лога не делается, а лог они видимо очищают каким то надыбанным в инете скриптом, поэтому хуже уже не будет :-)
Наверное, их устраивает возможность восстановления на время создания дифф бакапа, ну и ладно.
Щукина АннаКроме того, ТС пару раз упоминал о зеркалировании. Непонятно, что за зеркалирование и на чем построено. Может там лог-шиппинг, несовместимый с простым режимом или ещё что-то....Да, я тоже заметил. Ну, если лог нужен для зеркалирования, сиквел про это скажет, не даст перевести в симпл.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647384
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgВ полной модели лог хранится вечно , он не удаляется дифф или полными бакапами, шринком и т.д.
Освободить место в файле лога можно только бакапом лога, и никак иначе.
Либо вообще ничего там не хранить, переведя базу с полной модели на простую.
я запутался) Теперь всё ясно. Лог мы не бекапили совсем, только база полностью + разностная.
Сегодня настроим бекап лога и посмотрим как будет очищаться. Вновь, спасибо большое за разъяснение.

Щукина АннаalexeyvgЛибо вообще ничего там не хранить, переведя базу с полной модели на простую.Судя по тому, как ТС притворяет рекомендации с форума в жизнь своей системы - не мешало бы уточнить, чем чревато держать базу в режиме Simple. Кроме того, ТС пару раз упоминал о зеркалировании. Непонятно, что за зеркалирование и на чем построено. Может там лог-шиппинг, несовместимый с простым режимом или ещё что-то....
простая модель нам не подойдёт, наш вариант зеркалирования только на полной работает. Про зеркалирование я пока вообще не скажу, но это рядом стоящий аналогичный сервер, куда зеркально копируется БД. Пару раз меняли их местами, если не ошибаюсь из-за гибели жёсткого диска, в тот момент я вообще не касался обслуживания, но ребята, на сколько я знаю просто меняют имя хоста, запускают какой-то скрипт и зеркало становится основным сервером прямо за считанные минуты.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647388
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
за выходные скрипт по очистке бд отработал (пятница/сейчас):

rows: 22868517/21984800 (удалил 883717 записей)
reserved: 11132904/11185256 (увеличилось на 52352)
data: 2455856/2466800 (увеличилось на 10944)
index_size: 8669640/8698808 (увеличилось на 29168)
unused: 7408/19648 (увеличилось на 12240)
уточню, что это результаты только по основной таблице, помимо неё удаление происходит ещё в ~5 связанных таблицах.

Не совсем понимаю результаты. Почему reserved и data увеличились? Если данные удалились?!
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647398
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58за выходные скрипт по очистке бд отработал (пятница/сейчас):

rows: 22868517/21984800 (удалил 883717 записей)
reserved: 11132904/11185256 (увеличилось на 52352)
data: 2455856/2466800 (увеличилось на 10944)
index_size: 8669640/8698808 (увеличилось на 29168)
unused: 7408/19648 (увеличилось на 12240)
уточню, что это результаты только по основной таблице, помимо неё удаление происходит ещё в ~5 связанных таблицах.

Не совсем понимаю результаты. Почему reserved и data увеличились? Если данные удалились?!Во-первых, непонятно - что и как считает Ваш скрипт. Во-вторых, никто не обещал, что освободившееся место после удаления данных будет использоваться для повторный вставок. Особенно, если у Ваших таблиц есть монотонно-растущий кластерный индекс, а процесс удаления данных - не освобождает страницы полностью, а лишь удаляет с них часть данных.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647414
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас сделали обновление статистики (exec sp_msforeachtable 'update statistics ?') выполнялся 6 минут. После этого пропала проблема с timeout в программе с тем долгим запросом.
Сейчас запустили дефрагментацию (exec sp_msforeachtable 'dbcc INDEXDEFRAG (BDname, ''?'')) уже 20 минут, ждём. Вываливает статистику, есть и pages moved, есть и pages removed. Из того что вижу сейчас, примерно 1-3% removed в большинстве результатов.


Щукина АннаВо-первых, непонятно - что и как считает Ваш скрипт.
Сначала пишет в лог данные из запроса exec sp_spaceused N'table_name'
потом удаляет выборочно данные хранимой процедурой от разработчика ПО
в завершение своей работы снова пишет значения из exec sp_spaceused N'table_name', их я и цитирую.

Щукина АннаВо-вторых, никто не обещал, что освободившееся место после удаления данных будет использоваться для повторный вставок. Особенно, если у Ваших таблиц есть монотонно-растущий кластерный индекс, а процесс удаления данных - не освобождает страницы полностью, а лишь удаляет с них часть данных.
Понял, спасибо. Тогда просто продолжаем чистить, игнорируя цифры статистики, а БД сама разберётся. За дисковым пространством мы особо не гонимся, главное что бы быстро работало.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647425
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58 За дисковым пространством мы особо не гонимся, главное что бы быстро работало.Это вы зря так.... Полупустые страницы не только ведь диск заполняют, но страничный КЭШ скульсервера. Сервер же хоть на диски, хоть в памяти - оперирует всё теми же страницами. И если на странице всего одна запись, то под её размещение в памяти будет выделенно положенных 8к. Поэтому выгоднее иметь мало сильнозаполненных страниц, чем много, но практически пустых. Плотнее запись данных на страницу --> больше данных можно закэшировать в аналогичный размер ОЗУ --> выше вероятность найти нужные данные в памяти --> потенциальное снижение логического и (что более важно) физического ввода-вывода.
Но вы в сторону перестроения/реорганизации индексов уже смотрите. Значит, проблема будет решаться при следующих итерациях обслуживания базы... :)
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647427
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаSerg58 За дисковым пространством мы особо не гонимся, главное что бы быстро работало.Это вы зря так.... Полупустые страницы не только ведь диск заполняют, но страничный КЭШ скульсервера. Сервер же хоть на диски, хоть в памяти - оперирует всё теми же страницами. И если на странице всего одна запись, то под её размещение в памяти будет выделенно положенных 8к. Поэтому выгоднее иметь мало сильнозаполненных страниц, чем много, но практически пустых. Плотнее запись данных на страницу --> больше данных можно закэшировать в аналогичный размер ОЗУ --> выше вероятность найти нужные данные в памяти --> потенциальное снижение логического и (что более важно) физического ввода-вывода.
Но вы в сторону перестроения/реорганизации индексов уже смотрите. Значит, проблема будет решаться при следующих итерациях обслуживания базы... :)

автор2) индексирование
как ещё по вашему надо "гнаться"
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647433
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна, спасибо, всё больше и больше начинаю осознавать происходящее и выстраивать путь к совершенству ;)

К сожалению, дефрагментация (exec sp_msforeachtable 'dbcc INDEXDEFRAG (BDname, ''?'')) НЕ ВЫПОЛНИЛАСЬ! Примерно 50 минут делалась и выдало:
Произошла ошибка при выполнении пакетного файла. Сообщение об ошибке: Неустранимая ошибка подключения. Состояние ошибки: 15, Токен: 54
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647438
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

"
- А разве можно съесть слона?
- Можно, если кушать его по частям!
"(с)

Зря вы мучаете базу массовыми мероприятиями...
Действуйте точечно.
Если взялись за определенный список таблиц - то с ними и работайте.
1) Выполните очистку таблиц
2) Выполните перестроение/реорганизацию только тех индексов, что принадлежат таблицам, попавшим под обслуживание.
3) Делайте все операции по-объектно: каждый индекс отправляйте в обработку отдельной командой. Если что-то будет "падать с ошибками" - будет, по крайней мере, понятно - на каком этапе, и на каком объекте упала обработка...
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647440
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

кстати, какой именно у вас SQL Server 2012 ?
Имеется ввиду его редакция - standart / enterprise?

А лучше - покажите полный вывод команды:
select @@version
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647445
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58сейчас скрипт работает в режиме теста, он забирает из базы 100 тысяч записей (на это уходит от 0 до 6 секунд) и в цикле проверяет каждую строку, если она удовлетворяет условиям - вызывается хранимая процедура(которую делал не я, а разработчики ПО) и удаляет передаваемое ей значение(id записи). Удаляет процедура и в нескольких взаимосвязанных таблицах, во всех них есть столбец с этим id который я передаю ей.
Тот результат что я давал удалил из 100 тысяч - 54356 записи только в основной таблице, в смежных таблицах ещё больше, ибо несколько таблиц много записей к одной id из основной.
Работал этот скрипт 64 минуты, скрипт на питоне.Сразу напрашивается оптимизация - выбирать в обработку только те данные, что удовлетворяют условиям обработки, а не все подряд :).
То есть, перенести условия проверки из цикла обработки - в процесс отбора записей...
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647446
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Аннаselect @@version
Microsoft SQL Server 2012 - 11.0.5058.0 (X64) May 14 2014 15:14:48 Copyright (c) Microsoft Standart Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: )
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647450
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина АннаСразу напрашивается оптимизация - выбирать в обработку только те данные, что удовлетворяют условиям обработки, а не все подряд :).
То есть, перенести условия проверки из цикла обработки - в процесс отбора записей...
Изначально так и было, наоборот переделал под тот вариант, как сейчас. По 2 причинам:
1.хочу видеть статистику сколько записей было удалено (хотя это можно реализовать и с условием в sql)
2.когда я использовал условие в where запроса, сам запрос выполнялся слиииишком долго. Если выгрузить всё подряд от 0 до 6 секунд, то с условием выходило больше минуты.

Вероятно сейчас, после обновления статистики, будет лучше и быстрее с where. Но это не первоочередная задача.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647459
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

ну, "хозяин - барин"(с)
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647464
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

в целом - прогресс в сторону увеличения производительности системы наметился?
в любом случае - рекомендую пересмотреть индексацию наиболее критических таблиц. Возможно, что индексы не оптимальны для тех запросов, что работают в системе. Не стоит забывать доступные в 2012 стандарт возможности - фильтрованные индексы (для "точечной настройки" отбельных критичных запросов) и индексы с include-полями (для охвата индексами бОльшего числа запросов с возможности полного их "покрытия" - получение ответа на запрос исключительно чтением индекса, без обращения к базовой таблице)
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647484
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина АннаSerg58,
в целом - прогресс в сторону увеличения производительности системы наметился?
ДА! В основном помогло за 5 минут обновление статистики. Тот запрос, который вообще сподвиг меня заняться всем этим выполнялся 45 секунд, а программа прикладная ждёт всего 30 секунд и потом выдаёт timeout и собственно не работает. Мы отключали этот функционал и работали без него. Вот утром сегодня обновили статистику и сейчас этот запрос выполняется просто моментально.

Потихонечку начинает рости лог базы, сегодня будем полностью переделывать план бекапа. Бекап лога не делался вообще.

Правильно я разобрался? схема следующая:
1. в ночь на понедельник делаем полное резервное копирование базы данных (Full Backup) (проверка целостности БД, обновление статистики, резервное копирование БД(полное), очистка плана обслуживания)
2. в каждый другой день делаем (проверка целостности БД, резервное копирование БД(разностное), резервное копирование БД (журнал транзакций), очистка после обслуживания)

и раз в месяц делать задачу "реогранизация индекса" (хотя с индексами будем отдельно заниматься, коллега уже изучает скрипты по анализу фрагментированности индексов).
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647489
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

теперь ещё
Код: sql
1.
exec sp_msforeachtable 'update statistics ? WITH FULLSCAN'


и скорее всего в индексы в не попадаете
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647493
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKи скорее всего в индексы в не попадаете
Вот эту фразу не совсем понял.

fullscan статистики в ночь включу.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647496
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58TaPaKи скорее всего в индексы в не попадаете
Вот эту фразу не совсем понял.это как раз о том, что индексы к запросам не подходят. возможно, вместо SEEK-ов выполняются "более затратные" SCAN-ы. Или случаются LookUp-ы там, где можно было бы обойтись индексом с нужным списком INCLUDE-полей...
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647499
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58TaPaKи скорее всего в индексы в не попадаете
Вот эту фразу не совсем понял.

fullscan статистики в ночь включу.
если не смотрите в конкретные запросы, то начните например
https://blog.sqlauthority.com/2011/01/03/sql-server-2008-missing-index-script-download/

с фильтром на ваши основные объекты
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647508
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKесли не смотрите в конкретные запросы, то начните например
https://blog.sqlauthority.com/2011/01/03/sql-server-2008-missing-index-script-download/

с фильтром на ваши основные объектынужно предупредить - что все рекомендации, выдаваемые такими скриптами, требуют тщательной проверки! Возможно, в системе уже есть подобные индексы, у которых всего лишь не хватает поля-другого в секции include. Слепо плодить индексы - не стОит, они - не бесплатные. Индексы нужно хранить, индексы нужно поддерживать в актуальном состоянии (и сейчас речь не за пользовательские манипуляции, а про "подкапотную" работу сервера, связанную с поддержанием целостности и актуальности индексов и с вязанной с ними информацией).
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647514
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаTaPaKесли не смотрите в конкретные запросы, то начните например
https://blog.sqlauthority.com/2011/01/03/sql-server-2008-missing-index-script-download/

с фильтром на ваши основные объектынужно предупредить - что все рекомендации, выдаваемые такими скриптами, требуют тщательной проверки! Возможно, в системе уже есть подобные индексы, у которых всего лишь не хватает поля-другого в секции include. Слепо плодить индексы - не стОит, они - не бесплатные. Индексы нужно хранить, индексы нужно поддерживать в актуальном состоянии (и сейчас речь не за пользовательские манипуляции, а про "подкапотную" работу сервера, связанную с поддержанием целостности и актуальности индексов и с вязанной с ними информацией).

чукча не читатель?
авторPlease note, if you should not create all the missing indexes this script suggest. This is just for guidance. You should not create more than 5-10 indexes per table. Additionally, this script sometime does not give accurate information so use your common sense.

авторИндексы нужно хранить
кхм
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647520
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

почитайте, с каким рвением и, практически, без проверок ТС пускает решения с форума в продакт (и его можно понять - база "тормозит", работа стоит, сроки срываются - тут нет времени на обдумывания и глубокое погружение во всё и сразу)...
Вам станет понятно - что это не такое уж и бесполезное замечание....
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647521
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

я к тому, что стОит делать акценты на очевидные (не для новичка), но критичные в ситуации ТС моменты...
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647522
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

охх сколько бессмысленного текста...
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647524
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

вас никто не заставляет его читать... ;)
можете просто игнорировать посты с моим авторством...
в конце концов - я же не вам помогаю ;)
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647589
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна, Щукина АннаTaPaK,
почитайте, с каким рвением и, практически, без проверок ТС пускает решения с форума в продакт (и его можно понять - база "тормозит", работа стоит, сроки срываются - тут нет времени на обдумывания и глубокое погружение во всё и сразу)...
Вам станет понятно - что это не такое уж и бесполезное замечание....

на самом деле это действительно полезно - предупредить об использовании "опасных" советов/скриптов. Поэтому, в очередной раз, спасибо.


А можно вопрос? А то запутались совсем...
- Разностное резервное копирование (Differential backup) BACKUP DATABASE WITH DIFFERENTIAL;
- Резервное копирование журнала транзакций (Transaction Log Backup) BACKUP LOG;

это взаимоисключащие вещи или нет? То есть, если мы делаем разностное копирование надо ли нам делать второе?
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647601
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

если не хотите терять данные между разностными копими, то надо.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647643
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58А можно вопрос? А то запутались совсем...
- Разностное резервное копирование (Differential backup) BACKUP DATABASE WITH DIFFERENTIAL;
- Резервное копирование журнала транзакций (Transaction Log Backup) BACKUP LOG;

это взаимоисключащие вещи или нет? То есть, если мы делаем разностное копирование надо ли нам делать второе?
[SET "Captain Obvious" = ON]

Гораздо правильнее будет сказать - "взаимодополняющие".

1) Полный бэкап, как и следует из его названия, представляет собой самодостаточную консистентную согласованную копию базы данных на определенный момент времени. В случае сбоя базы и при наличии только полного бэкапа - восстановиться можно, но лишь на состояние базы, соответствующее моменту выката бэкапа. Все изменении с момента выката копии и до краха базы - будут утеряны.

2) Разностный бэкап, как и алгебраическая "разность", представляет собой разницу между "уменьшаемым" и "вычитаемым" - то есть, по сути, это копия тех страниц, что претерпели изменения с момента последнего бэкапа. И так как это "разность", то сама по себе, без исходного состояния базы, он не представляет никакой ценности. Для восстановления с разностной копии требуется "уменьшаемое" - стартовая ПОЛНАЯ копия базы + все промежуточные "разности". Восстановление возможно лишь на момент выката любой из разностных копий. При наличии только разностной копии, без полной - восстановиться невозможно.

3) Копия транзакт-лога. Журнал, он и в африке - журнал. Содержит все ЛОГИРУЕМЫЕ операции, применяемые к базе. Сам по себе - малоинтересен и бесполезен. Но при наличии исходной полной копии и промежуточных копий журнала позволяет восстановиться на любой момент времени.

В этом плане, если и решать вопрос резервного копирования, то предпочтительнее будет делать полное копирование (обязательно) + копии журнала (обязательно) + разностные копии (по желанию). Периодичность того или иного вида копирования - выбирать исходя из требований ко времени восстановления и допустимому "объему" потерянных данных в случае краха. Потому как, восстановиться с недельной давности полной копии + накат разностных копий за неделю + накат логов с момента последнего разностного бэкапа до момента краха, скорее всего, будет быстрее, чем восстановление с полной копии + накат всех логов за неделю.

[SET "Captain Obvious" = OFF]
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647656
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина АннаГораздо правильнее будет сказать - "взаимодополняющие"...
Вооот! У вас очень просто и понятно написано, откуда вы цитируете если не секрет?
И у меня несколько уточняющих вопросов:
1.если делать только полный бекап по понедельникам и каждый следующий день недели разностный, то что будет с лог файлом? Он будет расти и расти? Надо ли его как-то чистить? Вот этот момент мне не понятен. Или вообще я не должен беспокоится о его размере, сколько он будет весить, столько и должен, а попытки его уменьшить негативно отразятся на работе БД?

2. Если делать полный бекап по понедельникам, разностный ежедневно в 02:00, а бекап транзакт-лога в полдень. То как выглядит восстановление? Сначала восстанавливаем последний полный бекап, потом последний разностный и потом последний транзакт-лог?

я думаю, надо мне проще создать тестовую бд и поиграться с различными вариантами.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647662
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

усвойте уже простую истину: в полной модели восстановления единственно возможный способ сделать так что бы журнал транзакций не рос до бесконечности это сделать его бэкап {инструкция backup log}

если вас не смущает что в какой то момент место на диске может закончится то можете бекапов лога не делать. (опять таки же на произвольный момент времени не восстановитесь не имея бекапа лога)

вся информация есть в официальной справке: https://docs.microsoft.com/ru-ru/sql/relational-databases/backup-restore/transaction-log-backups-sql-server?view=sql-server-2017

https://docs.microsoft.com/ru-ru/sql/relational-databases/backup-restore/back-up-and-restore-of-sql-server-databases?view=sql-server-2017
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647668
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

1) В общем случае, транзакт-лог - это "бесконечная лента", размер которой ограничен либо заданным на уровне базы лимитом, либо (в отсутствии лимита) - доступным размером свободного места на диске. Как вам уже отвечали ранее другие ораторы - размер лога (занятое место внутри LDF-файла) уменьшается (штатно) только механизмом его резервного копирования. Ни полный бэкап, ни разностный бэкап - размер транзакт-лога не уменьшают. Есть "нештатный" способ уменьшения лога - перевод базы в режим восстановления "simple" с последующим шринком лога. Почему "нештаный"? Потому что есть ограничения на его применения. Если в базе используются вещи, требующие режима "full" или "bulk" (к примеру, лог-шиппинг), то перевод базы в "simple" "ломает" эти вещи и требует дальнейшей их повторной настройки. Более того - сервер будет всячески сопротивляться переводу в simple в этом случае. Поэтому, сначала придется "сломать" лог-шиппинг, после - перевести базу в симпл, урезать лог, а затем - всё вернуть в исходное состояние. Поверьте - по количеству телодвижений и потенциальных мест для факапа - это сильно сложнее, чем банальный бэкап транзакт-лога.

2) Если есть набор разных вариантов бэкапа, то и варианты восстановления будут разные. Можно восстановить полный бэкап и накатить на него все доступные копии журнала транзакций, без промежуточного наката разностных копий. Можно восстановиться с полной копии, "догнаться" всеми промежуточными разностными до какой-то точки, после чего "шлифануть" всё копией журнала. Тут главное помнить - движемся от большего к меньшему. Накатили полный - (опционно) накатили разностные - накатили журнал.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647672
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58Щукина АннаГораздо правильнее будет сказать - "взаимодополняющие"...
Вооот! У вас очень просто и понятно написано, откуда вы цитируете если не секрет?
И у меня несколько уточняющих вопросов:
1.если делать только полный бекап по понедельникам и каждый следующий день недели разностный, то что будет с лог файлом? Он будет расти и расти? Надо ли его как-то чистить? Вот этот момент мне не понятен. Или вообще я не должен беспокоится о его размере, сколько он будет весить, столько и должен, а попытки его уменьшить негативно отразятся на работе БД?

2. Если делать полный бекап по понедельникам, разностный ежедневно в 02:00, а бекап транзакт-лога в полдень. То как выглядит восстановление? Сначала восстанавливаем последний полный бекап, потом последний разностный и потом последний транзакт-лог?

я думаю, надо мне проще создать тестовую бд и поиграться с различными вариантами.
для ваших объёмов вы можете спокойно делать full раз в сутки + log (15- 60 минут) и хранить эту вакаханалию на -7 дней(или как душа желает). Дифференциальный вам не ясно зачем
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647683
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58Вооот! У вас очень просто и понятно написано, откуда вы цитируете если не секрет?Это - вольный, адаптированный и упрощенный пересказ документации ;). Хотя, некоторые считают, что это всего лишь "охх сколько бессмысленного текста..." :)
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647715
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна...+ все промежуточные "разности" .... + накат разностных копий за неделю
У меня создалось впечатление, что вы путаете инкрементальные бэкапы с дифференциальными.
Инкрементальные - содержат разницу между предыдущим инкрементальным (если он был) или полным (если не было) бэкапом и текущим состоянием.
Дифференциальные всегда содержат разницу между полным бэкапом и текущим состоянием.

В SQL Server есть только дифференциальные бэкапы, поэтому использовать необходимо один разностный бэкап - самый последний перед датой, на которую вы желаете восстановиться.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647746
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Minamoto,

верное замечание... видимо, в голове "сварилась каша" из Oracle/PostgreSQL/MS SQL...
В целом, понятно, что общие стратегии и подходы - везде если не одинаковы, то схожи...
Нужно будет вспомнить СУБД-зависимые нюансы и разложить всё по полочкам... :)
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647755
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKдля ваших объёмов вы можете спокойно делать full раз в сутки + log (15- 60 минут) и хранить эту вакаханалию на -7 дней(или как душа желает). Дифференциальный вам не ясно зачем+1
Классический простой вариант, позволяет восстановить данные на любую секунду, прост в управлении.
Диффами многие заморачиваются, видимо, из за названия, а зря. Они сложнее, и неоптимальны по месту хранения.
Притом они не прощают ошибок - сделанным каким то внешним средством бакапом можно их запороть, и получить отсутствие бакапов в самый ответственный момент, причём узнать про это получится именно тогда.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647807
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgTaPaKдля ваших объёмов вы можете спокойно делать full раз в сутки + log (15- 60 минут) и хранить эту вакаханалию на -7 дней(или как душа желает). Дифференциальный вам не ясно зачем+1
Классический простой вариант, позволяет восстановить данные на любую секунду, прост в управлении.
Диффами многие заморачиваются, видимо, из за названия, а зря. Они сложнее, и неоптимальны по месту хранения.
Притом они не прощают ошибок - сделанным каким то внешним средством бакапом можно их запороть, и получить отсутствие бакапов в самый ответственный момент, причём узнать про это получится именно тогда.

Таки позволю себе немного дополнить уважаемых коллег.

Сам принцип создания индексов приводит к тому, что размер базы данных распухает - и распухает бэкап как самой базы, так и ее журнала транзакций (в общих чертах). Бэкап нужен не абы какой. А такой, чтобы можно было восстановиться на нужный момент НЕ прерывая бизнес.

Перефразирую. Есть таблица 10 Гбайт с кластерным индексом (условно). На нее можно навесить 3 некластерных индекса еще по 5 Гбайт. Итого получаем вместо базы в 10 новый размер в 25 - в 2.5 раза больше предыдущего.

Подобрали железо такое, что бэкап делается 10 минут, а восстанавливаем из него базу в случае ее повреждения - 8 минут. База обслуживает учетную систему, в которую вносятся первичные документы (ну или продажи/заказы по интернет-магазину). И главный директор говорит так - "12 минут простоя мы можем себе позволить, а свыше 12 - уже нет. Некуда будет вбивать первичные документы или факты, а на бумаге записывать и потом в базу вбивать невозможно никак".

Отсюда вывод - делать бэкап 10 минут и разворачивать 8 минут можно. Делать 15 и разворачивать 12 минут - уже на грани фола. Поэтому один некластерный индекс в 5 Гб мы можем себе позволить и использовать его - а вот три индекса таки никак нельзя. Не соответствует целям ЗАКАЗЧИКА и по факту главного владельца и распорядителя всей этой базы.

И поэтому когда разработчики говорят "а вот бы еще парочку кошерных индексов создать, чтобы 99% тяжелых отчетов ускорить раз в 10" - DBA отвечает - "стоп, извините, делайте асинхронную реплику, обвешивайте ее индексами, а на первичную реплику/базу я больше ничего не дам создать".

Надеюсь, понятно разъяснил автору темы...
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647818
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPИ поэтому когда разработчики говорят "а вот бы еще парочку кошерных индексов создать, чтобы 99% тяжелых отчетов ускорить раз в 10" - DBA отвечает - "стоп, извините, делайте асинхронную реплику, обвешивайте ее индексами, а на первичную реплику/базу я больше ничего не дам создать".Тема создания индексов только на вторичной асинхронной реплике (на основной-то DBA запрещает!) раскрыта не полностью.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647837
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичAndy_OLAPИ поэтому когда разработчики говорят "а вот бы еще парочку кошерных индексов создать, чтобы 99% тяжелых отчетов ускорить раз в 10" - DBA отвечает - "стоп, извините, делайте асинхронную реплику, обвешивайте ее индексами, а на первичную реплику/базу я больше ничего не дам создать".Тема создания индексов только на вторичной асинхронной реплике (на основной-то DBA запрещает!) раскрыта не полностью.

Тема интересная. Берешь read-only реплику, навешиваешь на нее кучу индексов, все запросы на выборку направляешь туда, а на primary оставляешь одни кучи, ну или где надо добавляем класт. индекс и парочку обычных, чтоб update всю таблицу не сканил, и все, во красота та какая! :)
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647844
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть другая практика - развернутая и проиндексированная "вчерашняя" база для формирования отчетов на втором сервере.
Дабы не мешать оперативному вводу, и не тормозить им отчетность.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647928
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем огромное спасибо за ответы, ссылки, рекомендации. Очень много почерпнул.

Вчера сделал на основную базу полное (fullscan) обновление статистики, выполнилась за 1ч40м.

Продолжаю расчищать базу данных, на это уйдёт ещё примерно 20 суток.

И на бекапы скорее всего перейдём ночью полностью, днём несколько раз бекап лога транзакций
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647972
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичAndy_OLAPИ поэтому когда разработчики говорят "а вот бы еще парочку кошерных индексов создать, чтобы 99% тяжелых отчетов ускорить раз в 10" - DBA отвечает - "стоп, извините, делайте асинхронную реплику, обвешивайте ее индексами, а на первичную реплику/базу я больше ничего не дам создать".Тема создания индексов только на вторичной асинхронной реплике (на основной-то DBA запрещает!) раскрыта не полностью.
И я таки не стану эту тему раскрывать. Хотя бы потому, что процитировал злобного DBA, который хочет запугать наивных и глуповатых разработчиков.
Разумеется, термин "асинхронная реплика" никак не связан с AlwaysOn и прочими механизмами самого MSSQL.

Но поскольку Вы, Сережа, работаете в конторе довольно успешной и имеете под рукой таких же молодых и талантливых разработчиков - я Вам лично могу хороший рецепт дать.
Берете исходники MSSQL Server, смотрите механизм накатки журнала на вторичную реплику, пишете сетевой драйвер, который перехватывает и модифицирует пакеты с нужными транзакциями - типа на первичной отыграла insert 1 строка into ненужная таблица, подменили на вторичной create нужный индекс на нужной таблице, а далее delete 1 строка from ненужная таблица на drop нужный индекс на нужной таблице.

Если драйверы под Windows будет написать сложно - поставьте 2017-й на кошерную корпоративную сборку типа RedHat. Под Linux намного проще драйверы писать, API меняется относительно небыстро для нужного направления.
А мои гвардейцы проследят, чтобы при всем стратегическом союзе между красношапочными и микромягкими индусы из Редмонда не переходили в Роли и ничего не испортили.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647985
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это он о чем вообще?
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39647994
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksrovЭто он о чем вообще?
да как всегда, "горшочек варит" на износ
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39648007
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хм....странно.

Смотрите что получается:
1. работала база несколько лет, ничего не удаляли
2.стали расчищать базу
3.сразу появились запросы которые резко стали выполняться дольше таймаута(30 секунд) программы и она выдавала ошибку
4.сделали ВЧЕРА УТРОМ обновление статистики (БЕЗ fullscan) - запросы стали выполняться моментально
5.вечером сделали обновление статистики fullscan
6.ночью очередная расчистка базы
7.сейчас те запросы о которых пишу выше стали выполняться около 10 секунд, вместо моментального исполнения вчера.

чуть позже снова сделаю обновление статистики(без fullscan) и проверю.

Полагаю, что надо утром, после того как расчистка завершится делать обновление статистики.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39648231
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
дополню:
Да, всё действительно оказалось именно так.
Сделал
Код: sql
1.
UPDATE STATISTICS <имя_таблицы>

для 3х основных таблиц, где удаляются/добавляются данные и всё снова стало моментально отрабатываться.

Ещё подкорректировал свой скрипт, что бы выдавал более подробные логи по удалению данных, из смежных в разы больше удаляется данных, чем из основной таблицы.
Вот сейчас прогнал на 1000 записях, удалил из основной 548, из смежных 1446+492+52
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39652315
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем снова здравствуйте!
Продолжаем заниматься БД, она потихонечку расчищается, мы отказались от разностных бекапов, перешли на ежедневный полный бекап+бекап лога транзакций.

Логи:
29.05 выполнилось: проверка целостности (1,5ч) / полное резеврное копирование (15м) / резервное копирование журнала транзакций (39м) / очистка после обслуживания (1с)
30.05 выполнилось: проверка целостности (1,1ч) / полное резеврное копирование (14м) / резервное копирование журнала транзакций (2м) / очистка после обслуживания (0с)

Уточню: 29.05 лог журнала транзакций делался впервые.

сейчас mdf весит 65Гб, ldf 100Гб.

Вопрос: почему не уменьшился файл лога? План настраивали через интерфейс MSSMS(не командами t-sql).
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39652318
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58Всем снова здравствуйте!
Продолжаем заниматься БД, она потихонечку расчищается, мы отказались от разностных бекапов, перешли на ежедневный полный бекап+бекап лога транзакций.

Логи:
29.05 выполнилось: проверка целостности (1,5ч) / полное резеврное копирование (15м) / резервное копирование журнала транзакций (39м) / очистка после обслуживания (1с)
30.05 выполнилось: проверка целостности (1,1ч) / полное резеврное копирование (14м) / резервное копирование журнала транзакций (2м) / очистка после обслуживания (0с)

Уточню: 29.05 лог журнала транзакций делался впервые.

сейчас mdf весит 65Гб, ldf 100Гб.

Вопрос: почему не уменьшился файл лога? План настраивали через интерфейс MSSMS(не командами t-sql).
Потому что внутри файла теперь куча свободного места, которое будет повторно использовано. А уменьшение файла - это команда shrink. Которую делать НЕ нужно, поскольку журнал будет обратно расти и отнимать место у NTFS. И прирост его может быть медленным.
А вот если ldf станет сильно расти свыше 100Гб - вот тогда пора бить тревогу и проверять, что бэкап лога транзакций уже не работает.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39652320
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

log_reuse_wait_desc в sys.databases для вашей базы что?

ну и то что наш балабол пишет, не слушайте. Лог в 100 на 65 базы это много как не крути, хотя если место есть то можно и забить
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39652334
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58,

где-то тут на форуме доводилось встречать доходчивую аналогию про шифоньер и вещи... оно как раз описывает вашу ситуацию с размером лог-файла...
если найду - ссылку скину. :)
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39652337
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKlog_reuse_wait_desc в sys.databases для вашей базы что?
log_reuse_wait: 2
log_reuse_wait_desc: LOG_BACKUP

Если он будет 100Гб (просто занял место и его использует) то всё ок, пусть будет такой. Обращу на это внимание.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39652343
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

нашлось...
Не совсем про MS SQL и транзакт-лог, но суть та же. Только у вас: комната - это ваш диск, шкаф - файл транзакт-лога, вещи - его содержимое.
Сделав бэкап, вы "увезли ненужные вещи из шкафа на дачу", а вам бы ещё и "шкаф" поменять на размером "поменьше"...


Перед очередным бэкапом лога - посмотрите, сколько реально занято места внутри ldf-файла. После бэкапа сделайте размер файла чуть больше, чем было занято. Скорее всего, вам его и хватит...
Ну или однократно уменьшите размер до минимума, который MS SQL Server согласится установить. А дальше - дайте файлу вырасти на сколько ему потребуется и больше его не трогайте, если, конечно, не будет аномально больших приростов...
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39652351
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анна, в очередной раз спасибо за такое подробнейшее разъяснение) вам учителем в школе/институте работать))))

Посмотрел ещё объём файла бекапа:
от 29 числа(который самый первый бекап лога): 32Гб
от 30 числа: 2.3Гб
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39652358
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58Посмотрел ещё объём файла бекапа:
от 29 числа(который самый первый бекап лога): 32Гб
от 30 числа: 2.3Гб
Всё логично - в первый раз вы "вывезли из шкафа весь хлам", копившийся там с момента "установки шкафа".
Во второй раз - только те "вещи", что стали ненужными с момента предыдущей (в вашем случае - так вообще первой) "ревизии содержимого шкафа".
Скорее всего, что при "монотонной" нагрузке на сервер и регулярным бэкапам лога - размер бэкапа стабилизируется и будет сравнительно небольшим.
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39652387
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58TaPaKlog_reuse_wait_desc в sys.databases для вашей базы что?
log_reuse_wait: 2
log_reuse_wait_desc: LOG_BACKUP

Если он будет 100Гб (просто занял место и его использует) то всё ок, пусть будет такой. Обращу на это внимание.
на вскидку ничего плохого, сколько initial size на лог?
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39652520
Serg58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKсколько initial size на лог?
а как это посмотреть?
по sp_Helpfile:
size:103740416 KB
maxsize: Unlimited
growth: 10%

в свойства БД - Файлы - Журнал:
Начальный размер(МБ): 101309
Автоувеличение: с шагом по 10%, без ограничений
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39652554
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg58TaPaKсколько initial size на лог?
в свойства БД - Файлы - Журнал:
Начальный размер(МБ): 101309

файл лога у вас сейчас практически пустой, т.е. будет писать в свои 100ГБ без прироста, если чего чудовищного не предпримете. Так что если 100Гб не смущает то можете и забить, или снижаёте размер
...
Рейтинг: 0 / 0
подскажите по расчистке БД и последующему обслуживанию
    #39655639
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень вовремя темка.
Выяснил, что наши "одмины" из СШП ни фига нормальный бекап не настроили на "моей" полу-продакшн базе.
Дело еще осложняется тем, что старый bkp в 200 гиг, а места на диске осталось -190 :D
Наверно есть параметр OVERWRITE или типа того, пойду курить доки.
...
Рейтинг: 0 / 0
90 сообщений из 90, показаны все 4 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / подскажите по расчистке БД и последующему обслуживанию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]