Вkeyить compression уровня строк для всех таблиц и индексов

Одним из (необязательных) требований к тесту Works with SQL Server 2008 является то, что compression уровня строк вkeyено для всех таблиц и индексов. У нас есть существующая database с большим количеством таблиц и индексов, которые уже созданы. Есть ли простой способ вkeyить compression во всех этих tableх и индексах?

Вот сценарий, который я получил от рекомендации Splattne.

select 'ALTER TABLE [' + name + '] REBUILD WITH (DATA_COMPRESSION = ROW);' from sysobjects where type = 'U' -- all user tables UNION select 'ALTER INDEX [' + k.name + '] ON [' + t.name + '] REBUILD WITH (DATA_COMPRESSION = ROW);' from sysobjects k join sysobjects t on k.parent_obj = t.id where k.type = 'K' -- all keys AND t.type = 'U' -- all user tables 

5 Solutions collect form web for “Вkeyить compression уровня строк для всех таблиц и индексов”

Я только что использовал Works with SQL Server Tool для тестирования после сжатия с помощью скрипта a_hardin-splattne. Тест завершился неудачно, потому что несколько индексов не были сжаты.

В представлении «sysobjects» есть некоторые, но не все индексы. Вместо этого нам нужны «sindindexes». Благодаря анонимному плакату на aspfaq.com для ознакомления с этим индексом. Мы также хотим игнорировать userские функции.

 SELECT 'ALTER TABLE [' + name + '] REBUILD WITH (DATA_COMPRESSION = ROW);' + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10) FROM sysobjects WHERE type = 'U' -- all user tables UNION SELECT 'ALTER INDEX [' + i.name + '] ON [' + OBJECT_NAME(i.id) + '] REBUILD WITH (DATA_COMPRESSION = ROW);' + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10) FROM sysindexes i inner join sysobjects o on o.name = OBJECT_NAME(i.id) WHERE (i.indid BETWEEN 1 AND 254) AND (i.Status & 64)=0 AND OBJECTPROPERTY(i.id, 'IsMsShipped') = 0 AND NOT o.type in ('TF','FN') 

Вы можете использовать этот простой скрипт SQL, чтобы создать еще один скрипт, который должен выполнять эту работу:

  select 'ALTER TABLE ' + name + ' REBUILD WITH (DATA_COMPRESSION = ROW)' + CHAR(13) + CHAR(10) + 'GO' from sysobjects where type = 'U' -- all user tables 

(Я не тестировал это, но он должен работать.)


Вы можете find гораздо более изощренный скрипт здесь, на websiteе SQLServerBible (ищите «db_compression procs».) Прочитайте post в блоге автора «Вся database – Proc Data Compression» .

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

Я бы также упомянул, что вы должны проверить, пресекается ли table перед ее восстановлением.

В стороне, будьте осторожны, позволяя всем сжиматься. Данные сжимаются в памяти и декомпрессируются каждый раз, когда к нему обращаются. Для OLTP-системы с большим количеством изменений и резидентных данных сжатия compression не подходит, поскольку вы будете записывать больше CPU, чтобы не get выигрыш в IO. Для данных, которые иногда читаются, как хранилище данных, это гораздо более подходит, потому что вы получаете большой компромисс в уменьшенных IO против дополнительного processора. Сжатие – это function хранилища данных, а не function OLTP. Не уверен, что это относится к вам, но стоит указать на случай, и для других, читающих нить.

Еще один момент – возможно, вы не получаете значительного выигрыша от сжатия, поэтому не стоит выходить. Лучше всего проверить коэффициент сжатия, прежде чем вkeyить использование sp_estimate_data_compression_savings stored-proc.

благодаря

Я немного опаздываю на вечеринку, но вот версия, которая использует DMV, а не устаревшие системные таблицы и допускает произвольные имена схем. Он вkeyает или отkeyает compression строк или страниц во всех кучах, кластеризованных индексах и некластеризованных индексах (вkeyая все секционированные таблицы) в текущей базе данных:

 -- Enables or disables compression on all tables in the database DECLARE @Compression NVARCHAR(4) = 'PAGE' -- NONE, ROW or PAGE , @Cmd NVARCHAR(MAX) = ''; -- Clustered indexes, heaps SELECT @Cmd += ' ALTER TABLE ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ' REBUILD ' + CASE WHEN p.[partition_number] > 1 THEN 'PARTITION = ALL ' ELSE '' END + 'WITH (DATA_COMPRESSION = ' + @Compression + ');' FROM sys.schemas s INNER JOIN sys.tables t ON t.[schema_id] = s.[schema_id] INNER JOIN sys.partitions p ON p.[object_id] = t.[object_id] WHERE p.[data_compression_desc] <> @Compression AND p.index_id IN (0, 1) AND NOT EXISTS ( SELECT 1 FROM sys.partitions d WHERE d.[object_id] = p.[object_id] AND d.index_id = p.index_id AND d.[partition_number] > p.[partition_number] ); -- Nonclustered indexes SELECT @Cmd += ' ALTER INDEX ' + QUOTENAME(i.name) + ' ON ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ' REBUILD ' + CASE WHEN p.[partition_number] > 1 THEN 'PARTITION = ALL ' ELSE '' END + 'WITH (DATA_COMPRESSION = ' + @Compression + ');' FROM sys.schemas s INNER JOIN sys.tables t ON t.[schema_id] = s.[schema_id] INNER JOIN sys.partitions p ON p.[object_id] = t.[object_id] INNER JOIN sys.indexes i ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id WHERE p.[data_compression_desc] <> @Compression AND p.index_id > 1 AND NOT EXISTS ( SELECT 1 FROM sys.partitions d WHERE d.[object_id] = p.[object_id] AND d.index_id = p.index_id AND d.[partition_number] > p.[partition_number] ); -- Review commands SELECT @Cmd; -- Run commands --EXEC sp_executesql @Cmd; 
  • Sql Server Migration с 2005 по 2008 год?
  • System.Data.SqlClient.SqlException: Не удалось создать экземпляр пользователя SQL Server из-за сбоя в выдаче себя за клиента
  • Копирование баз данных SQL Server 2005
  • Должен ли я помещать свою базу данных VCenter на server с другими корпоративными базами данных
  • SQL Server 2008 R2: запуск SQL-browserа не выполнен
  • Восхитительно медленные requestы на Microsoft SQL Server 2008 R2
  • Получение SQL Server 2008 для использования Powershell 2
  • Подkeyение SQL Server 2008
  • О компании понижен или заменен SQL Server 2008
  • Рост fileов данных SQL Server
  • План обслуживания базы данных не запускается каждый раз