powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сжатие пользователских баз данных на уровне таблиц
7 сообщений из 32, страница 2 из 2
Сжатие пользователских баз данных на уровне таблиц
    #40103578
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
ownsmir

Ругается на Неверный синтаксис

если ругается, значит поправили не везде

еще раз: каждая кавычка должна быть экранирована


отправил в астрал читателя
...
Рейтинг: 0 / 0
Сжатие пользователских баз данных на уровне таблиц
    #40103581
ownsmir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad
ownsmir

Ругается на Неверный синтаксис

если ругается, значит поправили не везде

еще раз: каждая кавычка должна быть экранирована


Извините, наверное подбешиваю, но не получается:
exec sp_msforeachdb 'use [?]; if db_id()<5 or databasepropertyex(db_name(),"Updateability")="READ_ONLY" return;
DECLARE @Table_schema NVARCHAR(128)
DECLARE @Table_name NVARCHAR(128)
DECLARE @Index_Name NVARCHAR(128)

DECLARE @cmd VARCHAR(4000)

-- включение сжатия для таблиц
DECLARE TableNameCursor CURSOR
FOR
SELECT Table_catalog, Table_schema, Table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = "BASE TABLE"
ORDER BY Table_catalog, Table_schema, Table_name

OPEN TableNameCursor

FETCH NEXT FROM TableNameCursor INTO @Table_catalog, @Table_schema, @Table_name
WHILE @@fetch_status = 0
BEGIN

PRINT @Table_catalog + "." + @Table_schema + "." + @Table_name
SET @cmd = "ALTER TABLE [" + @Table_catalog + "].[" + @Table_schema + "].[" + @Table_name + "] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)"
EXEC (@cmd)

FETCH NEXT FROM TableNameCursor INTO @Table_catalog, @Table_schema, @Table_name
END
CLOSE TableNameCursor
DEALLOCATE TableNameCursor

-- включение сжатия для индексов
DECLARE IndexCursor CURSOR
FOR
SELECT DB_NAME(), schemas.name, tables.name, indexes.name
FROM sys.schemas as schemas inner join sys.tables as tables inner join sys.indexes as indexes on tables.object_id = indexes.object_id on schemas.schema_id = tables.schema_id
ORDER BY schemas.name, tables.name, indexes.name;

OPEN IndexCursor

FETCH NEXT FROM IndexCursor INTO @Table_catalog, @Table_schema, @Table_name, @Index_Name
WHILE @@fetch_status = 0
BEGIN

PRINT @Table_catalog + "." + @Table_schema + "." + @Table_name + ": " + @Index_Name

SET @cmd = "ALTER INDEX [" + @Index_Name + "] ON [" + @Table_catalog + "].[" + @Table_schema + "].[" + @Table_name + "] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)"
EXEC (@cmd)

FETCH NEXT FROM IndexCursor INTO @Table_catalog, @Table_schema, @Table_name, @Index_Name
END
CLOSE IndexCursor
DEALLOCATE IndexCursor

-- делаем шринк базы - возвращаем свободное место на диск
SELECT @cmd=(
SELECT "DBCC SHRINKDATABASE("""+ DB_NAME() + """)"
)
EXEC (@cmd);'


Ругается вообще на все теперь

Сообщение 137, уровень 15, состояние 2, строка 16
Необходимо объявить скалярную переменную "@Table_catalog".
Сообщение 137, уровень 15, состояние 2, строка 20
Необходимо объявить скалярную переменную "@Table_catalog".
Сообщение 137, уровень 15, состояние 2, строка 21
Необходимо объявить скалярную переменную "@Table_catalog".
Сообщение 137, уровень 15, состояние 2, строка 24
Необходимо объявить скалярную переменную "@Table_catalog".
Сообщение 137, уровень 15, состояние 2, строка 38
Необходимо объявить скалярную переменную "@Table_catalog".
Сообщение 137, уровень 15, состояние 2, строка 42
Необходимо объявить скалярную переменную "@Table_catalog".
Сообщение 137, уровень 15, состояние 2, строка 44
Необходимо объявить скалярную переменную "@Table_catalog".
Сообщение 137, уровень 15, состояние 2, строка 47
и т.д.
...
Рейтинг: 0 / 0
Сжатие пользователских баз данных на уровне таблиц
    #40103583
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ownsmir,

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

так должно сработать
Код: 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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
exec sp_msforeachdb 'use [?]; if db_id()<5 or databasepropertyex(db_name(),''Updateability'')="READ_ONLY"" return;
use [?]; if db_id()<5 or databasepropertyex(db_name(),''Updateability'')=''READ_ONLY'' return;
DECLARE @Table_catalog NVARCHAR(128) 
DECLARE @Table_schema NVARCHAR(128)
DECLARE @Table_name NVARCHAR(128)
DECLARE @Index_Name NVARCHAR(128)

DECLARE @cmd VARCHAR(4000)

-- включение сжатия для таблиц
DECLARE TableNameCursor CURSOR
FOR
SELECT Table_catalog, Table_schema, Table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE TABLE''
ORDER BY Table_catalog, Table_schema, Table_name

OPEN TableNameCursor

FETCH NEXT FROM TableNameCursor INTO @Table_catalog, @Table_schema, @Table_name
WHILE @@fetch_status = 0
BEGIN

PRINT @Table_catalog + ''.'' + @Table_schema + ''.'' + @Table_name
SET @cmd = ''ALTER TABLE ['' + @Table_catalog + ''].['' + @Table_schema + ''].['' + @Table_name + ''] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)''
EXEC (@cmd)

FETCH NEXT FROM TableNameCursor INTO @Table_catalog, @Table_schema, @Table_name
END
CLOSE TableNameCursor
DEALLOCATE TableNameCursor

-- включение сжатия для индексов
DECLARE IndexCursor CURSOR
FOR
SELECT DB_NAME(), schemas.name, tables.name, indexes.name
FROM sys.schemas as schemas inner join sys.tables as tables inner join sys.indexes as indexes on tables.object_id = indexes.object_id on schemas.schema_id = tables.schema_id
ORDER BY schemas.name, tables.name, indexes.name;

OPEN IndexCursor

FETCH NEXT FROM IndexCursor INTO @Table_catalog, @Table_schema, @Table_name, @Index_Name
WHILE @@fetch_status = 0
BEGIN

PRINT @Table_catalog + ''.'' + @Table_schema + ''.'' + @Table_name + '': '' + @Index_Name

SET @cmd = ''ALTER INDEX ['' + @Index_Name + ''] ON ['' + @Table_catalog + ''].['' + @Table_schema + ''].['' + @Table_name + ''] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)''
EXEC (@cmd)

FETCH NEXT FROM IndexCursor INTO @Table_catalog, @Table_schema, @Table_name, @Index_Name
END
CLOSE IndexCursor
DEALLOCATE IndexCursor

-- делаем шринк базы - возвращаем свободное место на диск
SELECT @cmd=''DBCC SHRINKDATABASE(''+ DB_NAME() + '')''
EXEC (@cmd);'


...
Рейтинг: 0 / 0
Сжатие пользователских баз данных на уровне таблиц
    #40103589
ownsmir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad
ownsmir,

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

так должно сработать
Код: 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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
exec sp_msforeachdb 'use [?]; if db_id()<5 or databasepropertyex(db_name(),''Updateability'')="READ_ONLY"" return;
use [?]; if db_id()<5 or databasepropertyex(db_name(),''Updateability'')=''READ_ONLY'' return;
DECLARE @Table_catalog NVARCHAR(128) 
DECLARE @Table_schema NVARCHAR(128)
DECLARE @Table_name NVARCHAR(128)
DECLARE @Index_Name NVARCHAR(128)

DECLARE @cmd VARCHAR(4000)

-- включение сжатия для таблиц
DECLARE TableNameCursor CURSOR
FOR
SELECT Table_catalog, Table_schema, Table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE TABLE''
ORDER BY Table_catalog, Table_schema, Table_name

OPEN TableNameCursor

FETCH NEXT FROM TableNameCursor INTO @Table_catalog, @Table_schema, @Table_name
WHILE @@fetch_status = 0
BEGIN

PRINT @Table_catalog + ''.'' + @Table_schema + ''.'' + @Table_name
SET @cmd = ''ALTER TABLE ['' + @Table_catalog + ''].['' + @Table_schema + ''].['' + @Table_name + ''] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)''
EXEC (@cmd)

FETCH NEXT FROM TableNameCursor INTO @Table_catalog, @Table_schema, @Table_name
END
CLOSE TableNameCursor
DEALLOCATE TableNameCursor

-- включение сжатия для индексов
DECLARE IndexCursor CURSOR
FOR
SELECT DB_NAME(), schemas.name, tables.name, indexes.name
FROM sys.schemas as schemas inner join sys.tables as tables inner join sys.indexes as indexes on tables.object_id = indexes.object_id on schemas.schema_id = tables.schema_id
ORDER BY schemas.name, tables.name, indexes.name;

OPEN IndexCursor

FETCH NEXT FROM IndexCursor INTO @Table_catalog, @Table_schema, @Table_name, @Index_Name
WHILE @@fetch_status = 0
BEGIN

PRINT @Table_catalog + ''.'' + @Table_schema + ''.'' + @Table_name + '': '' + @Index_Name

SET @cmd = ''ALTER INDEX ['' + @Index_Name + ''] ON ['' + @Table_catalog + ''].['' + @Table_schema + ''].['' + @Table_name + ''] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)''
EXEC (@cmd)

FETCH NEXT FROM IndexCursor INTO @Table_catalog, @Table_schema, @Table_name, @Index_Name
END
CLOSE IndexCursor
DEALLOCATE IndexCursor

-- делаем шринк базы - возвращаем свободное место на диск
SELECT @cmd=''DBCC SHRINKDATABASE(''+ DB_NAME() + '')''
EXEC (@cmd);'



Вроде начал работать! Спасибо Вам огромное за помощЬ!! По итогу работы ночью отпишусь.!
...
Рейтинг: 0 / 0
Сжатие пользователских баз данных на уровне таблиц
    #40103599
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ownsmir

Сообщение 137, уровень 15, состояние 2, строка 16
Необходимо объявить скалярную переменную "@Table_catalog".

это потому, что переменная была потеряна в процессе адаптации скрипта - в оригинальном скрипте она идет первым declare
...
Рейтинг: 0 / 0
Сжатие пользователских баз данных на уровне таблиц
    #40103668
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артель "напрасный труд" имени Сизифа.

А диски у вас не твердотельные (SSD) случаем?
Какая у вас версия/редакция?

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

Какой смысл сжимать все таблицы - визгу много толку мало?
...
Рейтинг: 0 / 0
Сжатие пользователских баз данных на уровне таблиц
    #40103785
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ownsmir
komrad
ownsmir,

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

так должно сработать
Код: 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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
exec sp_msforeachdb 'use [?]; if db_id()<5 or databasepropertyex(db_name(),''Updateability'')="READ_ONLY"" return;
use [?]; if db_id()<5 or databasepropertyex(db_name(),''Updateability'')=''READ_ONLY'' return;
DECLARE @Table_catalog NVARCHAR(128) 
DECLARE @Table_schema NVARCHAR(128)
DECLARE @Table_name NVARCHAR(128)
DECLARE @Index_Name NVARCHAR(128)

DECLARE @cmd VARCHAR(4000)

-- включение сжатия для таблиц
DECLARE TableNameCursor CURSOR
FOR
SELECT Table_catalog, Table_schema, Table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE TABLE''
ORDER BY Table_catalog, Table_schema, Table_name

OPEN TableNameCursor

FETCH NEXT FROM TableNameCursor INTO @Table_catalog, @Table_schema, @Table_name
WHILE @@fetch_status = 0
BEGIN

PRINT @Table_catalog + ''.'' + @Table_schema + ''.'' + @Table_name
SET @cmd = ''ALTER TABLE ['' + @Table_catalog + ''].['' + @Table_schema + ''].['' + @Table_name + ''] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)''
EXEC (@cmd)

FETCH NEXT FROM TableNameCursor INTO @Table_catalog, @Table_schema, @Table_name
END
CLOSE TableNameCursor
DEALLOCATE TableNameCursor

-- включение сжатия для индексов
DECLARE IndexCursor CURSOR
FOR
SELECT DB_NAME(), schemas.name, tables.name, indexes.name
FROM sys.schemas as schemas inner join sys.tables as tables inner join sys.indexes as indexes on tables.object_id = indexes.object_id on schemas.schema_id = tables.schema_id
ORDER BY schemas.name, tables.name, indexes.name;

OPEN IndexCursor

FETCH NEXT FROM IndexCursor INTO @Table_catalog, @Table_schema, @Table_name, @Index_Name
WHILE @@fetch_status = 0
BEGIN

PRINT @Table_catalog + ''.'' + @Table_schema + ''.'' + @Table_name + '': '' + @Index_Name

SET @cmd = ''ALTER INDEX ['' + @Index_Name + ''] ON ['' + @Table_catalog + ''].['' + @Table_schema + ''].['' + @Table_name + ''] REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)''
EXEC (@cmd)

FETCH NEXT FROM IndexCursor INTO @Table_catalog, @Table_schema, @Table_name, @Index_Name
END
CLOSE IndexCursor
DEALLOCATE IndexCursor

-- делаем шринк базы - возвращаем свободное место на диск
SELECT @cmd=''DBCC SHRINKDATABASE(''+ DB_NAME() + '')''
EXEC (@cmd);'



Вроде начал работать! Спасибо Вам огромное за помощЬ!! По итогу работы ночью отпишусь.!


не отписывается, видно прищучили
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сжатие пользователских баз данных на уровне таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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