Sql Server изменяет значение коэффициента заполнения для всех индексов с помощью tsql

Мне нужно экспортировать мою БД в файл bacpac, чтобы импортировать ее в Azure. Когда я пытаюсь экспортировать, я получаю сообщение об ошибке, потому что все индексы имеют значение fillFactor.

Я нашел, как установить значение fillFactor для всех индексов, но я не могу указать 0, значение должно быть от 1 до 100. Если я изменю значение в студии управления, я могу установить его на 0.

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

Любые идеи?.

Спасибо.


person danielUrrero    schedule 14.05.2013    source источник


Ответы (6)


что-то более простое для всех таблиц в одной базе данных:

   select 'ALTER INDEX ALL ON ['
   + s.name+ '].['+ o.name+'] REBUILD WITH (FILLFACTOR = 99)' 
   from sys.objects o
   inner join sys.schemas s on o.schema_id = s.schema_id
   where type='u' and is_ms_shipped=0

генерирует операторы, которые вы можете скопировать и выполнить.

person Nick Kavadias    schedule 27.04.2017

Это не прямой способ T-SQL. Хотя он создает чистое решение T-SQL, которое вы можете применить к своей БД.

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

Также это идет с отказом от ответственности ДЕЛАТЬ НА СВОЙ СОБСТВЕННЫЙ РИСК :-)

  1. Получите базу данных, которую вы хотите перенести в проект SSDT

http://msdn.microsoft.com/en-us/library/azure/jj156163.aspx http://blogs.msdn.com/b/ssdt/archive/2012/04/19/migrating-a-database-to-sql-azure-using-ssdt.aspx

Это хороший способ перенести любую схему в Azure, несмотря ни на что... Это намного лучше, чем просто создание файла bacpac... исправление... экспорт... исправление... и т. д. Так что я рекомендую делать это в любое время. перенести БД в Azure

Для исправления FILLFACTOR я просто использовал поиск и замену, чтобы удалить все FILLFACTORS из сгенерированных файлов схемы... К счастью, в БД, которую я использовал, все они были установлены на 90, поэтому было довольно легко найти и заменить решение ( CTRL-SHIFT-F)... Если у вас разные, вы, вероятно, можете использовать функции поиска RegEx в Visual Studio, чтобы найти все факторы заполнения и просто удалить их из индексов.

Я не так хорош в RegEx, но я думаю, что это работает

WITH \((.)*FILLFACTOR(.)*\)

На этом этапе вам нужно будет исправить любые дополнительные исключения, связанные с соответствием требованиям Azure. Предоставленные ссылки описывают, как это сделать.

  1. Теперь, когда у вас есть проект SSDT, совместимый с AZURE SQL.

А вот и ЧАСТЬ ДЕЛАТЬ НА СВОЙ СОБСТВЕННЫЙ РИСК

Я использовал эти скрипты для удаления всех FK, PK и уникальных ограничений из БД.

while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE IN  ('FOREIGN KEY', 'PRIMARY KEY', 'UNIQUE')))
begin
    declare @sql nvarchar(2000)
    SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME
    + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
    FROM information_schema.table_constraints
    WHERE CONSTRAINT_TYPE IN  ('FOREIGN KEY', 'PRIMARY KEY', 'UNIQUE')
    exec (@sql)
end


declare @qry nvarchar(max);
select @qry = 
(SELECT  'DROP INDEX [' + ix.name + '] ON [' + OBJECT_NAME(ID) + ']; '
FROM  sysindexes ix
WHERE   ix.Name IS NOT null and ix.OrigFillFactor <> 0
for xml path(''));
exec sp_executesql @qry

Я делаю это, потому что, насколько мне известно, единственный способ полностью удалить параметр коэффициента заполнения — удалить и заново создать индекс. Это связано с каскадным набором проблем: - / PK с коэффициентами заполнения требуют отбрасывания FK и т. Д. Возможно, есть более разумный способ сделать это, чтобы вы не удаляли ВСЕ FK и PK, а вы смотрите на деревья зависимостей. ..

  1. Теперь вернитесь к своему проекту SSDT, совместимому с Azure, и выполните СРАВНЕНИЕ СХЕМЫ этого проекта с вашей БД... Это создаст сценарий, который воссоздает все ваши FK, PK и уникальные ограничения (без коэффициента заполнения).... В в этот момент вы можете просто нажать «обновить» или нажать кнопку справа от обновления, которая сгенерирует скрипт, который вы можете использовать ... Итак, теперь вооружитесь

    • the script above to remove FKs, Pks, and Unique.
    • Скрипт, созданный SSDT
    • Тщательное тестирование и обзор указанных сценариев, чтобы убедиться, что ничего не было упущено.

Вы должны иметь возможность обновить текущую БД до схемы, совместимой с Azure.

Дополнительные мысли:

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

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

Было бы неплохо, если бы установка их всех на FILL FACTOR 100 работала :-/

Существуют сторонние инструменты (как я слышал), которые можно использовать для миграции в Azure...

Другой вариант — использовать https://sqlazuremw.codeplex.com/.

Используйте это, чтобы создать СХЕМУ, совместимую с Azure, а затем использовать BCP для копирования всех данных.

НО, если вы хотите сделать свою текущую СХЕМУ совместимой с Azure, чтобы вы могли создать файл bacpac для загрузки в Azure, это сработало для меня один раз, когда мне пришлось это сделать.

EDIT: Azure V12 поддерживает коэффициенты заполнения.

person Shane Neuville    schedule 28.12.2014

SQL Azure явно не поддерживает FILLFACTOR:

"База данных SQL Azure не поддерживает указание FILLFACTOR с оператором CREATE INDEX. Если мы создать индексы в базе данных SQL Azure, мы обнаружим, что все значения коэффициента заполнения индекса равны 0."

Вам придется удалить все операторы FILLFACTOR из сценариев CREATE INDEX. Точно так же не поддерживаются SORT_IN_TEMPDB и DATA_COMPRESSION, а также некоторые другие параметры.

Полный список поддерживаемых ключевых слов в SQL Azure можно найти здесь. .

Обновление: SQL Azure версии 12 (представлена ​​в 2015 г.) поддерживает FILLFACTOR. См. здесь.

person SchmitzIT    schedule 10.05.2014

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

DECLARE @Database VARCHAR(255)  
DECLARE @Table VARCHAR(255)  
DECLARE @cmd NVARCHAR(500)  
DECLARE @fillfactor INT

SET @fillfactor = 90

DECLARE DatabaseCursor CURSOR FOR  
SELECT name FROM master.dbo.sysdatabases  
WHERE name NOT IN ('master','msdb','tempdb','model','distribution')  
ORDER BY 1  

OPEN DatabaseCursor  

FETCH NEXT FROM DatabaseCursor INTO @Database  
WHILE @@FETCH_STATUS = 0  
BEGIN  

   SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' +
  table_name + '']'' as tableName FROM [' + @Database + '].INFORMATION_SCHEMA.TABLES
  WHERE table_type = ''BASE TABLE'''  

   -- create table cursor  
   EXEC (@cmd)  
   OPEN TableCursor  

   FETCH NEXT FROM TableCursor INTO @Table  
   WHILE @@FETCH_STATUS = 0  
   BEGIN  

       IF (@@MICROSOFTVERSION / POWER(2, 24) >= 9)
       BEGIN
           -- SQL 2005 or higher command
           SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')'
           EXEC (@cmd)
       END
       ELSE
       BEGIN
          -- SQL 2000 command
          DBCC DBREINDEX(@Table,' ',@fillfactor)  
       END

       FETCH NEXT FROM TableCursor INTO @Table  
   END  

   CLOSE TableCursor  
   DEALLOCATE TableCursor  

   FETCH NEXT FROM DatabaseCursor INTO @Database  
END  
CLOSE DatabaseCursor  
DEALLOCATE DatabaseCursor 
person Alexander Galkin    schedule 14.05.2013
comment
Спасибо, это тот же tsql, который я использую, но проблема в том, что 0 недействителен в наборе @fillfactor=0. - person danielUrrero; 15.05.2013
comment
0 — это значение по умолчанию, означающее, что индексы заполнены на полную мощность, что равно 100 (единицы измерения Fillfactor — это проценты). Вы пытались установить его на 100, а затем экспортировать в .bacpac? - person Alexander Galkin; 15.05.2013
comment
Я думаю, что вы просто не указываете FillFactor в выражении (не устанавливайте его), и он будет создан со значением по умолчанию, равным 0. - person Seba Illingworth; 17.07.2014
comment
Я все еще не могу найти способ сделать это, и я все еще получаю сообщение об ошибке, касающееся коэффициента заполнения при развертывании в Azure, несмотря на многие утверждения, что V12 должен поддерживать коэффициент заполнения.?? - person Stuart Helwig; 30.11.2017

Кажется, вы хотите использовать коэффициент заполнения сервера по умолчанию (0), который пропускает оператор FILLFACTOR из сценариев создания. Это невозможно сделать, просто перестроив индекс, вы должны удалить и создать его заново (см. здесь ). Кажется, нет чистого способа сделать это, хотя сейчас это спорный вопрос.

person Hugh Jeffner    schedule 01.09.2016

ALTER INDEX yourindex ON table.column
REBUILD WITH (FILLFACTOR = 0); 

делает работу. 0 равно 100 (см. http://msdn.microsoft.com/en-us/library/ms177459.aspx), что означает отсутствие пробелов в индексе.

вы должны запустить это для каждого индекса. однако восстановление может занять значительное время.

person Der U    schedule 14.05.2013
comment
Если я попробую с fillfactor=0, я получу следующее сообщение: Fillfactor 0 не является допустимым процентом; fillfactor должен быть от 1 до 100. Мне нужно установить его на 0, чтобы иметь возможность экспортировать мою БД в bacpac. - person danielUrrero; 15.05.2013
comment
Установка его на 0 не работает (любое число от 1 до 100 работает) - person Rodney; 24.03.2014
comment
просто чтобы понять ваше требование: почему вы хотите установить его на 0? - person Der U; 26.03.2014
comment
Чтобы перейти на SQL Azure (у вас не может быть значения коэффициента заполнения) - person Rodney; 04.04.2014
comment
почему бы вам не использовать 100 тогда? Это дает то же самое, что и 0, что означает отсутствие пробелов в индексе. - person Der U; 07.04.2014
comment
Потому что это по-прежнему не удовлетворяет требованиям экспорта приложения уровня данных для Azure. - person David Krider; 24.07.2014