Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как проверить что индекс такой уже есть?  [new]
Mih00010
Member

Откуда:
Сообщений: 25
перед тем как выполнить это:

CREATE INDEX [IX__AccRgAT3502_3362] ON [НАШАБАЗА].[dbo].[_AccRgAT3502] ([_Fld469RRef], [_Value1_TYPE], [_Value1_RTRef], [_Value1_RRRef], [_Period]);

как перед этим проверить что такой индекс есть
7 авг 13, 09:55    [14673725]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
sys.sysindexes
7 авг 13, 10:05    [14673780]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Mih00010
как перед этим проверить что такой индекс есть
select * from sys.indexes
7 авг 13, 10:06    [14673782]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
перед тем как
Guest
IF  EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[_AccRgAT3502]') AND name = N'IX__AccRgAT3502_3362')
--такой индекс есть
-- ...
GO
7 авг 13, 10:07    [14673788]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Разжевали и в рот положили =)
7 авг 13, 10:08    [14673806]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Mih00010
Member

Откуда:
Сообщений: 25
это индекс некоторой таблицы некоторой базы я или не понимаю при чем тут sys.indexes или вопрос не правильно задал но там этого индекса и нет там вообще почти ничего нет а он есть
7 авг 13, 10:09    [14673810]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Хотя, по хорошему, автору бы уточнить "такой" это с таким именем, или с указанным набором полей?
7 авг 13, 10:10    [14673817]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Если вам надо узнать есть ли индекс с определенным именем на таблице, то вам в sys.indexes.

Если вам надо узнать,проиндексированы ли определенные поля, то вам в sys.index_columns.
7 авг 13, 10:13    [14673838]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Mih00010
Member

Откуда:
Сообщений: 25
перед тем как
IF  EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[_AccRgAT3502]') AND name = N'IX__AccRgAT3502_3362')
--такой индекс есть
-- ...
GO


спасибо большое но мне нужно не по имени а по набору полей т.е. чтобы вот это не плодило задвоения (по одной из таблиц это происходит) и нет времени смотреть почему
а вот само это вот это )))

--------------------------------------------------------------------------------------------

-- Создание недостающих индексов баз данных на SQL Server 2005, 2008

--

-- Скрипт анализирует статистику, собранную сервером баз данных об отсутствующих индексах в базах данных и

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

SET NOCOUNT ON

DECLARE @dbid int

IF (object_id('tempdb..##IndexAdvantage') IS NOT NULL) DROP TABLE ##IndexAdvantage

CREATE TABLE ##IndexAdvantage ([Преимущество индекса] float, [База данных] varchar(64), [Transact SQL код для создания индекса] varchar(1024), 

[Число компиляций] int, [Количество операций поиска] int, [Количество операций просмотра] int,

[Средняя стоимость ] int, [Средний процент выигрыша] int );

DECLARE DBases CURSOR FOR

SELECT database_id FROM sys.master_files -- Получаем список ID баз данных

WHERE state = 0 AND -- ONLINE

has_dbaccess(db_name(database_id)) = 1 -- Only look at databases to which we have access

GROUP BY database_id

OPEN DBases

FETCH NEXT FROM DBases

INTO @dbid

WHILE @@FETCH_STATUS = 0

BEGIN -- Выполняем для каждой базы данных --------------------------------------------------

INSERT INTO ##IndexAdvantage

SELECT [Преимущество индекса] = user_seeks * avg_total_user_cost * (avg_user_impact * 0.01),

      [База данных] = DB_NAME(mid.database_id),

      [Transact SQL код для создания индекса] = 'CREATE INDEX [IX_' + OBJECT_NAME(mid.object_id,@dbid) + '_' + 

      CAST(mid.index_handle AS nvarchar) + '] ON ' + 

      mid.statement + ' (' + ISNULL(mid.equality_columns,'') + 

      (CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ', ' 

ELSE '' END) + 

      (CASE WHEN mid.inequality_columns IS NOT NULL THEN + mid.inequality_columns ELSE '' END) + ')' + 

      (CASE WHEN mid.included_columns IS NOT NULL THEN ' INCLUDE (' + mid.included_columns + ')' 

ELSE '' END) +      ';', 

      [Число компиляций] = migs.unique_compiles,

      [Количество операций поиска] = migs.user_seeks,

      [Количество операций просмотра] = migs.user_scans,

      [Средняя стоимость ] = CAST(migs.avg_total_user_cost AS int),

      [Средний процент выигрыша] = CAST(migs.avg_user_impact AS int)

FROM  sys.dm_db_missing_index_groups mig

JOIN  sys.dm_db_missing_index_group_stats migs 

ON    migs.group_handle = mig.index_group_handle

JOIN  sys.dm_db_missing_index_details mid 

ON    mig.index_handle = mid.index_handle

AND   mid.database_id = @dbid

    FETCH NEXT FROM DBases

    INTO @dbid

END ----------------------------------------------------------------------------------------

CLOSE DBases

DEALLOCATE DBases

GO

SELECT * FROM ##IndexAdvantage ORDER BY 1 DESC

-- Значение ''Преимущество индекса'' выше 5000 в промышленных системах означает, что следует рассмотреть возможность создания этих индексов.

-- Если же значение превышает 10000, это обычно означает, что индекс может обеспечить значительное повышение производительности для операций чтения.

----------------------------------------------------------------------------------------------

---- Отправляем email с предложением создать индекс

--IF (object_id('tempdb..##IndexAdvantage2') IS NOT NULL) DROP TABLE ##IndexAdvantage2

--SELECT * INTO ##IndexAdvantage2 FROM ##IndexAdvantage WHERE [Преимущество индекса] >= 5000 ORDER BY 1 DESC

--IF ((SELECT COUNT(*) FROM ##IndexAdvantage2) >= 1) BEGIN

--DECLARE @subject_str varchar(255),

--@message_str varchar(1024),

--@separator_str varchar(1),

--@email varchar(128)

--SET @separator_str=CHAR(9) -- Символ табуляции

--SET @email = 'email_address@webzavod.ru'

---- Подготовим текст сообщения

--SET @subject_str = 'SQL Server '+@@SERVERNAME+': Предложение создать индексы в базе данных.'

--SET @message_str = 'Сервер '+@@SERVERNAME + '. Выявлена необходимость создать индексы в базе данных!

--Во вложении - таблица с кодом предлагаемых индексов.

--Значение "Преимущество индекса" выше 5000 в промышленных системах означает, что следует рассмотреть возможность создания этих индексов.

--Если же значение превышает 10000, это обычно означает, что индекс может обеспечить значительное повышение производительности для операций чтения.

--Динамические административные представления, которые помогли нам получить информацию об отсутствующих индексах, не являются заменой помощника по настройке ядра СУБД, который также рассматривает индексированные представления и секции и обеспечивает более всесторонний анализ индексов, но они могут быть очень эффективны на начальном уровне анализа.'

---- Отправляем email

--EXEC msdb.dbo.sp_send_dbmail

--@recipients = @email,

--@query = 'SELECT * FROM ##IndexAdvantage2',

--@subject = @subject_str,

--@body = @message_str,

--@attach_query_result_as_file = 1,

--@query_result_separator = @separator_str,

--@query_result_width = 7000

--END

---- Удаляем временную таблицу

IF (object_id('tempdb..##IndexAdvantage') IS NOT NULL) DROP TABLE ##IndexAdvantage

IF (object_id('tempdb..##IndexAdvantage2') IS NOT NULL) DROP TABLE ##IndexAdvantage2


Сообщение было отредактировано: 7 авг 13, 10:50
7 авг 13, 10:13    [14673840]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Ну вот о чём и речь.

Вот, пожалуйста http://stackoverflow.com/questions/765867/list-of-all-index-index-columns-in-sql-server-db
7 авг 13, 10:14    [14673853]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Mih00010
это индекс некоторой таблицы некоторой базы я или не понимаю при чем тут sys.indexes или вопрос не правильно задал но там этого индекса и нет там вообще почти ничего нет а он есть

Такое впечатление, что кто-то по рандому по клавиатуре постучал, да и отправил сообщение.
7 авг 13, 10:17    [14673872]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Просто там
автор
и нет времени смотреть почему
.

Товарищ не понимает, что ТАК это НЕ РАБОТАЕТ.
7 авг 13, 10:32    [14673986]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Mih00010
Member

Откуда:
Сообщений: 25
Cammomile
Просто там
автор
и нет времени смотреть почему
.

Товарищ не понимает, что ТАК это НЕ РАБОТАЕТ.


CREATE INDEX [IX__AccRgAT3502_3362] ON [НАШАБАЗА].[dbo].[_AccRgAT3502] ([_Fld469RRef], [_Value1_TYPE], [_Value1_RTRef], [_Value1_RRRef], [_Period]);

работает созданный таким образом индекс. работает.
7 авг 13, 10:48    [14674138]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Mih00010
созданный таким образом индекс. работает.

И где в вашем скрипте собственно _создание_ индекса ?
7 авг 13, 10:52    [14674178]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Mih00010
Member

Откуда:
Сообщений: 25
Cammomile, спасибо но

select s.name, t.name, i.name, c.name
from sys.tables t
inner join sys.schemas s on t.schema_id = s.schema_id
inner join sys.indexes i on i.object_id = t.object_id
inner join sys.index_columns ic on ic.object_id = t.object_id
inner join sys.columns c on c.object_id = t.object_id and
ic.column_id = c.column_id

where i.index_id > 0
and i.type in (1, 2) -- clustered & nonclustered only
and i.is_primary_key = 0 -- do not include PK indexes
and i.is_unique_constraint = 0 -- do not include UQ
and i.is_disabled = 0
and i.is_hypothetical = 0
and ic.key_ordinal > 0

order by ic.key_ordinal

это не готовое решение )))
7 авг 13, 10:53    [14674191]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
duplicate indexes
Guest
пара сайтов, где приведены скрипты для вылавливания duplicate indexes.

script_from_Pinal_Dave
script_from_Kimberly_Tripp
7 авг 13, 11:08    [14674338]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
перед тем как
IF  EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[_AccRgAT3502]') AND name = N'IX__AccRgAT3502_3362')
--такой индекс есть
-- ...
GO
IF INDEXPROPERTY(OBJECT_ID(N'[dbo].[_AccRgAT3502]','U'),N'IX__AccRgAT3502_3362','IndexID') IS NULL
PRINT 'Такого индекса нет';
7 авг 13, 13:20    [14675467]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap,

А для чего это надо? Одной проверки по sys.indexes недостаточно?
7 авг 13, 14:01    [14675737]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Гость333
iap,

А для чего это надо? Одной проверки по sys.indexes недостаточно?
Просто ещё один способ.
Без явного обращения к системным представлениям.
7 авг 13, 14:10    [14675790]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap,

А, ясно, а то мне показалось, что смысл вашего сообщения — что перед проверкой по sys.indexes надо сначала проверить INDEXPROPERTY.
7 авг 13, 14:22    [14675871]     Ответить | Цитировать Сообщить модератору
 Re: как проверить что индекс такой уже есть?  [new]
Mih00010
Member

Откуда:
Сообщений: 25
всем большое спасибо а причина сабжа оказалась в том что не было у меня одинаковых индексов но были те которых разный состав включенных столбцов )))
7 авг 13, 15:52    [14676555]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить