Как мне написать запрос для сравнения индексов в двух таблицах SQL Server? - PullRequest
4 голосов
/ 18 августа 2010

Мне нужно написать сценарий SQL, чтобы сравнить различия между индексами двух таблиц на SQL Server.Как я могу получить структуру индексов в таблице через SQL-запрос?

Ответы [ 3 ]

4 голосов
/ 10 ноября 2010

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

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

Пример такого запроса может выглядеть следующим образом (замените соответствующие базы данных на FOO и BAR и добавьте соответствующие фильтры к отдельным запросам, если вы хотите просмотреть отдельные таблицы):

select *
  from
       (select s1.name           as SchemaName
              ,t1.name           as TableName
              ,c1.name           as ColumnName
              ,i1.name           as IndexName
              ,i1.index_id
              ,c1.column_id
              ,c1.system_type_id
              ,c1.user_type_id
              ,ty1.name          as ColumnType
              ,c1.collation_name  -- Note this is nullable
              ,c1.is_nullable
              ,c1.max_length
              ,c1.[precision]
              ,c1.scale
              ,ic1.index_column_id
              ,ic1.key_ordinal
              ,ic1.partition_ordinal
              ,ic1.is_descending_key
              ,ic1.is_included_column
          from [FOO].sys.schemas s1
          join [FOO].sys.tables t1
            on t1.schema_id = s1.schema_id
          join [FOO].sys.columns c1
            on t1.object_id = c1.object_id
          join [FOO].sys.types ty1
            on ty1.system_type_id = c1.system_type_id
           and ty1.user_type_id = c1.user_type_id
          join [FOO].sys.index_columns ic1
            on ic1.object_id = c1.object_id
           and ic1.column_id = c1.column_id
          join [FOO].sys.indexes i1
            on i1.object_id = ic1.object_id
           and i1.index_id = ic1.index_id) r1
  full outer join
       (select s1.name           as SchemaName
              ,t1.name           as TableName
              ,c1.name           as ColumnName
              ,i1.name           as IndexName
              ,i1.index_id
              ,c1.column_id
              ,c1.system_type_id
              ,c1.user_type_id
              ,ty1.name          as ColumnType
              ,c1.collation_name  -- Note this is nullable
              ,c1.is_nullable
              ,c1.max_length
              ,c1.[precision]
              ,c1.scale
              ,ic1.index_column_id
              ,ic1.key_ordinal
              ,ic1.partition_ordinal
              ,ic1.is_descending_key
              ,ic1.is_included_column
          from [BAR].sys.schemas s1
          join [BAR].sys.tables t1
            on t1.schema_id = s1.schema_id
          join [BAR].sys.columns c1
            on t1.object_id = c1.object_id
          join [BAR].sys.types ty1
            on ty1.system_type_id = c1.system_type_id
           and ty1.user_type_id = c1.user_type_id
          join [BAR].sys.index_columns ic1
            on ic1.object_id = c1.object_id
           and ic1.column_id = c1.column_id
          join [BAR].sys.indexes i1
            on i1.object_id = ic1.object_id
           and i1.index_id = ic1.index_id) r2 
    on r1.SchemaName = r2.SchemaName
   and r1.TableName = r2.TableName
   and r1.ColumnName = r2.ColumnName
   and r1.IndexName = r2.IndexName
1 голос
/ 19 августа 2010

sys.indexes содержит всю информацию об индексах в данной базе данных.

0 голосов
/ 18 августа 2010

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

Затем вы можете сравнить файлы между двумя базами данных.

...