Стиснення баз даних 1с підприємство в ms sql server
Тема стиснення баз даних 1С зараз досить часто обговорюється. Переваги стиснення відомі - зменшення розміру бази даних, зменшення навантаження на дискову підсистему і деяке прискорення виконання важких операцій читання / запису. З недоліків - невелике збільшення навантаження на процесори сервера СУБД за рахунок витрати ресурсів на компресію / декомпресію даних. Але при використанні в якості MSSQL і DB2 (за Oracle і PostgreSQL не скажу, тому що не знаю) є один «підводний камінь» - при виконанні реструктуризації відбувається декомпресія нових таблиць і індексів. Відбуватиметься це може як при виконанні оновлення конфігурації зі зміною структури метаданих, так і при виконанні тестування і виправлення ІБ (реіндексація перестворює тільки індекси, а реструктуризація - і таблиці, і індекси). «Проблема» криється в тому, що ознака стиснення встановлюється індивідуально для кожної таблиці і індексу.
Рішення проблеми для MS SQL Server.
Створення DDL-тригера для операції створення таблиці:
CREATE TRIGGER [data_compression]
ON ALL SERVER
AFTER CREATE_TABLE
AS
--текст тригера
Створення DDL-тригера для операції створення індексу:
CREATE TRIGGER [index_compression]
ON ALL SERVER
AFTER CREATE_INDEX
AS
--текст тригера
Для установки ознаки стиснення сторінок для таблиці необхідно виконати код:
ALTER TABLE [ім'я бази]. [Ім'я схеми]. [Ім'я таблиці] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
Для установки ознаки стиснення сторінок для індексу необхідно виконати код:
ALTER INDEX [ім'я індексу] ON [ім'я бази]. [Ім'я схеми]. [Ім'я таблиці] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)
В общем-то, вже цього досить, щоб створити працездатний механізм, який не дозволить платформі 1С створити нову таблицю або індекс без стиснення, але мені захотілося більшої гнучкості в настройках :).
Нижче приведу рішення в тому вигляді, як воно використовується у нас. Це дозволило автоматично застосувати стиснення для всіх баз даних на сервері.
Створена службова база CompressionSetting з двома таблицями:
1) Databases - для зберігання списку баз, які стискати НЕ потрібно.
CREATE TABLE [dbo]. [Databases] (
[Name] [nvarchar] (100) NULL,
[Active] [int] NULL
) ON [PRIMARY]
200 баз на сервері я вніс в цю таблицю тільки одну - tempdb:
2) Trace - для моніторингу роботи DDL-тригерів
CREATE TABLE [dbo]. [Trace] (
[Text] [nvarchar] (max) NULL,
[DatabaseName] [nvarchar] (max) NULL,
[DateTime] [datetime] NULL
) ON [PRIMARY]

Далі створив 2 DDL-тригера:
Відразу після створення тригерів ніяких змін в розмірі баз, звичайно, не станеться. Для стиснення вже наявних баз можна скористатися такими способами:
1) Написати скрипт для почергового перебору таблиць і індексів і установки для них ознаки стиснення. Мені цей варіант не сподобався, тому що на стиск великих таблиць потрібно дуже багато часу, база при цьому роздувається, а потім дуже довго зменшується через SHRINK DATABASE.
2) Виконати повну реструктуризацію через «Тестування і виправлення». За часом швидше, але база також роздувається і її потім доведеться зменшувати через SHRINK DATABASE.
3) Найоптимальніший варіант, на мій погляд - перебудувати базу через dt-файл. При цьому готова база спочатку буде мінімального розміру, а час завантаження бази зі стисненням мало відрізняється від завантаження в звичайному режимі.
«... Можна вважати позицією то, що ми вважаємо, що використання цих можливостей має бути або заборонено або дозволено, але з адекватною підтримкою (методологічної або програмної). Варіант використання їх без належної підтримки ми вважаємо неправильним, так як він призводить до проблем в адмініструванні. »
Таким чином, не думаю, що пропонований мною підхід повинен використовуватися масово.
Адміністратор, що зважився на це, повинен чітко розуміти що він робить і які наслідки можуть бути.
В
20. Тетяна Лустіно (Silverbulleters) 126 04.09.16 23:51 Зараз в темі
думаю варто підняти тему, для тих хто прочитає цю статтю в майбутньому
насправді на даний момент існує якась суперечлива ситуація
воно і зрозуміло - конструкції ALTER TABLE, ALTER INDEX (також до речі як і CREATE INDEX) є втручанням в структуру БД (зміною схеми даних), що заборонено ліцензійною угодою.
* Однак у багатьох кінцевих компаніях при володінні MSSQL Enterprise керуються іншими документами, а саме
для ледачих, які не бажають ходити по посиланню процитую
What can you compress? Anything in the following list that meets the above criteria ...
A table with no organization ( "heap" structure);
A table organized as a clustered index;
A nonclustered index;
An indexed view (remember, these do persist on disk);
Partitioned tables and indexes (each partition can be configured differently);
Як всі пам'ятають нас цікавить
A table organized as a clustered index;
A nonclustered index;
так як це основні типи наших табличок в світі 1С.
дозволю собі ще процитувати
Data compression provides multiple benefits. It saves disk space, and it can help improve the performance of certain workloads. The benefits of data compression come at the cost of higher CPU usage for compressing and decompressing the data. Therefore, it is important to understand the workload characteristics on a table before deciding on a compression strategy. Data compression provides flexibility in terms of levels of compression (row or page) and the objects you can compress (table, index, partition). This enables fine-tuning the compression based on the characteristics of data and the workload.
Another important advantage of data compression is that it works transparently to the application, and it works well with other SQL Server features, such as TDE and backup compression.
The results shown in this white paper are based on the data and the hardware used in our tests. Your results will vary based on your own data, workload and hardware. Perform thorough testing when deciding what tables and indexes to compress.
дуже важливий пункт
Іншою важливою перевагою стиснення даних є те, що воно працює прозоро для додатка, і вона добре працює з іншими функціями SQL Server, такі як TDE і стиснення резервних копій.
тобто ризиків ніяких. здавалося б, однако.
Implementing compression is a multi-step process:
Figure out what objects you should compress
Plan to handle all of your environments (dev, QA, production)
Compress them during a low-activity window
Regularly patrol your environments checking for added objects that were not compressed
Keep your environments in sync
Зверніть увагу на рекомендації PFE інженерів від Microsoft
* Плануйте точно які об'єкти ви ПОВИННІ стискати
* Застосовуйте стиснення на всіх своїх контурах додатки, а не тільки продуктивному
* Стиснення застосовуйте в періоди найменшої активності
* Регулярно перевіряйте які об'єкти у вас не стиснуті
* Синхронізуйте оточення
для тих хто не в курсі - існує така хитра версія як SQL Server Developer Edition, ця версія повнофункціональна і призначена для перевірки розробником функціональності аж до Enterprise, на перевірочному контур (не продуктивне)
Але повернемося до протиріччя - як ми бачимо використання стиснення, вимагає наявності внутрішнього інженера по SQL сервера і певного менеджменту це самого процесу володіння SQL сервером.
І тепер стає зрозумілим чому на партнерській конференції була отримана відповідь
Варіант використання їх без належної підтримки ми вважаємо неправильним, так як він призводить до проблем в адмініструванні.
як ми бачимо вгорі він в цілому відповідає рекомендаціям компанії Microsoft - буздумно і без підтримки включати стиснення просто не відповідає Best Practics від Microsoft.
А тепер маленьке зауваження - якщо ви ВИКОРИСТОВУЄТЕ стиснення раджу ознайомитися з ще однією цікавою штукою
Грамотний DBA, стиснення і історія з tempdb дозволяє прискорити ЗУП в 4.5 рази ;-) як мінімум.
24. Антоніо Антоніо (Fragster) 702 09.12.16 12:45 Зараз в темі
повісив тригер на тестову базу, змінив текст таким чином:
CREATE TRIGGER [data_compression]
ON DATABASE
AFTER CREATE_TABLE
AS
DECLARE
@SchemaName nvarchar (150),
@ObjectName nvarchar (150),
@DatabaseName nvarchar (150),
@cmd nvarchar (500)
--Отримаємо ім'я схеми з виконуваної команди CRE ATE TABLE
SET @SchemaName = EVENTDATA (). Value ( '(/ EVENT_INSTANCE / SchemaName) [1]', 'nvarchar (150)')
--Отримаємо ім'я таблиці
SET @ObjectName = EVENTDATA (). Value ( '(/ EVENT_INSTANCE / ObjectName) [1]', 'nvarchar (150)')
--Отримаємо ім'я бази
SET @DatabaseName = EVENTDATA (). Value ( '(/ EVENT_INSTANCE / DatabaseName) [1]', 'nvarchar (150)')
--Сформуємо з отриманих даних необхідну команду на установку ознаки стиснення для таблиці
set @cmd = 'ALT ER TABLE [' + @DatabaseName + ']. [' + @SchemaName + ']. [' + @ObjectName + '] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)'
--Тепер перевіряємо настройки - якщо бази немає в таблиці CompressionSetting.dbo.Databases з ознакою Active = 1, то виконуємо команду, інакше ігноруємо
INS ERT INTO CompressionSetting.dbo.trace (text, DatabaseName, DateTime) SELE CT @cmd, @DatabaseName, GETDATE ()
отримав помилку при реструктуризації:
У процесі оновлення інформаційної бази сталася критична помилка
по причині:
Помилка СУБД:
Microsoft SQL Server Native Client 11.0: Can not find the object "dbo._Node6782NG" because it does not exist or you do not have permissions.
HRESULT = 80040E37, SQLSrvr: SQLSTATE = 42S02, state = C, Severity = 10, native = 1088, line = 1
25. Олексій Бочков (Aleksey.Bochkov) 2725 14.12.16 8:33 Зараз в темі
26. Evgeny Voropaev (user643364_voropaev.evgeny) 20.02.17 19:10 Зараз в темі
Добрий день всім!
900Mb.
Для цього використовується стандартна, описана, процедура даного перекладу: через вивантаження-завантаження файлу перенесення даних бази.
Але під час завантаження файлу перенесення в SQL, Конфігуратор1С стоп з помилкою від SQLя, Принтскрін якої я привожу.
Про всяк випадок ось:
SQL State: 23000
Native: 1505
Message: [Microsoft] [ODBC SQL Server Driver] [SQL Server] CREATE UNIQUE INDEX terminated because a duplicate key was found for index ID2. Most significant primary key is '15N'.
SQL State: 01000
Native: 3621
Message: [Microsoft] [ODBC SQL Server Driver] [SQL Server] The statement has been terminated.
Тілорух з пунктом Тестування і Виправлення бази з 1C Конфігуратора- ніяк на результат не впливає: помилка не йде.
Cам я не програміст 1С і не SQL dba. Я фахівець із мереж.
27. Олексій Олешко (retif) 12.04.17 10:44 Зараз в темі
Созданіе29.01.12 14:52
Обновленіе09.12.16 9:34
Код откритНе вказано



