Получите все некластерные индексы

Обратите внимание, что при создании объекта, который может быть видоизменен после создания, значение хэш-функции должно не изменяться , если объект вставляется в набор. В сущности это означает, что значение хэш-функции должно быть зафиксировано от точки начального создания объекта. См. документация Apple относительно протокола NSObject - метод хеша для получения дополнительной информации:

, Если изменяемый объект добавляется к набору, который использует значения хэш-функции для определения object’s положения в наборе, значение, возвращенное методом хеша объекта, не должно изменяться, в то время как объект находится в наборе. Поэтому или метод хеша не должен полагаться ни на одну object’s информацию о внутреннем состоянии, или необходимо удостовериться, что object’s информация о внутреннем состоянии не изменяется, в то время как объект находится в наборе. Таким образом, например, изменяемый словарь может быть помещен в хэш-таблицу, но Вы не должны изменять его, в то время как это там. (Обратите внимание, что может быть трудно знать, является ли данный объект в наборе.)

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

6
задан John Rudy 27 October 2009 в 20:20
поделиться

2 ответа

Для всех некластеризованных индексов в конкретной базе данных:

select object_name(object_id) as tablename, * 
from sys.indexes where type_desc = 'NONCLUSTERED'

Это вернет системные и несистемные таблицы. В качестве альтернативы:

select t.name as tablename, i.* 
from sys.indexes i, sys.tables t
where i.object_id = t.object_id
  and i.type_desc = 'NONCLUSTERED'

только для некластеризованных индексов пользователя.

17
ответ дан 8 December 2019 в 13:00
поделиться

Вы можете получить все индексы для таблицы, используя

exec sp_helpindex 'tablename'

Вы можете вставить это в таблицу и удалить все строки, в которых INDEX_DESCRIPTION начинается с 'CLUSTERED'

Вот сценарий для всех индексов в базе данных

declare @EmptyString varchar(1)
select @EmptyString = ''

-- 35 is the lenght of the name field of the master.dbo.spt_values table
declare @IgnoreDuplicateKeys varchar(35),
    @Unique varchar(35),
    @IgnoreDuplicateRows varchar(35),
    @Clustered varchar(35),
    @Hypotethical varchar(35),
    @Statistics varchar(35),
    @PrimaryKey varchar(35),
    @UniqueKey varchar(35),
    @AutoCreate varchar(35),
    @StatsNoRecompute varchar(35)

select @IgnoreDuplicateKeys = name from master.dbo.spt_values 
    where type = 'I' and number = 1 --ignore duplicate keys
select @Unique = name from master.dbo.spt_values 
    where type = 'I' and number = 2 --unique
select @IgnoreDuplicateRows = name from master.dbo.spt_values 
    where type = 'I' and number = 4 --ignore duplicate rows
select @Clustered = name from master.dbo.spt_values 
    where type = 'I' and number = 16 --clustered
select @Hypotethical = name from master.dbo.spt_values 
    where type = 'I' and number = 32 --hypotethical
select @Statistics = name from master.dbo.spt_values 
    where type = 'I' and number = 64 --statistics
select @PrimaryKey = name from master.dbo.spt_values 
    where type = 'I' and number = 2048 --primary key
select @UniqueKey = name from master.dbo.spt_values 
    where type = 'I' and number = 4096 --unique key
select @AutoCreate = name from master.dbo.spt_values 
    where type = 'I' and number = 8388608 --auto create
select @StatsNoRecompute = name from master.dbo.spt_values 
    where type = 'I' and number = 16777216 --stats no recompute
select o.name,
  i.name,
  'index description' = convert(varchar(210), --bits 16 off, 1, 2, 16777216 on
      case when (i.status & 16)<>0 then @Clustered else 'non'+@Clustered end
      + case when (i.status & 1)<>0 then ', '+@IgnoreDuplicateKeys else @EmptyString end
      + case when (i.status & 2)<>0 then ', '+@Unique else @EmptyString end
      + case when (i.status & 4)<>0 then ', '+@IgnoreDuplicateRows else @EmptyString end
      + case when (i.status & 64)<>0 then ', '+@Statistics else
      case when (i.status & 32)<>0 then ', '+@Hypotethical else @EmptyString end end
      + case when (i.status & 2048)<>0 then ', '+@PrimaryKey else @EmptyString end
      + case when (i.status & 4096)<>0 then ', '+@UniqueKey else @EmptyString end
      + case when (i.status & 8388608)<>0 then ', '+@AutoCreate else @EmptyString end
      + case when (i.status & 16777216)<>0 then ', '+@StatsNoRecompute else @EmptyString end),
  'index column 1' = index_col(o.name,indid, 1),
  'index column 2' = index_col(o.name,indid, 2),
  'index column 3' = index_col(o.name,indid, 3)
from sysindexes i, sysobjects o
where i.id = o.id and
      indid > 0 and indid < 255 --all the clustered (=1), non clusterd (>1 and <251), and text or image (=255) 
      and o.type = 'U' --user table
      --ignore the indexes for the autostat
      and (i.status & 64) = 0 --index with duplicates
      and (i.status & 8388608) = 0 --auto created index
      and (i.status & 16777216)= 0 --stats no recompute
      order by o.name

Этот сценарий написан Джузеппе Димауро по адресу http://www.devx.com/vb2themax/Tip/18617

1
ответ дан 8 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: