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

Откуда:
Сообщений: 125
SQL Server 2008.
Как можно выяснить что какие-то индексы вообще используются в запросах а какие только место занимают?
5 мар 13, 12:58    [14013772]     Ответить | Цитировать Сообщить модератору
 Re: Нужны или индексы  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35080
Блог
ключевые слова для поиска "MS SQL DMV"
5 мар 13, 13:00    [14013786]     Ответить | Цитировать Сообщить модератору
 Re: Нужны или индексы  [new]
Glory
Member

Откуда:
Сообщений: 104751
sys.dm_db_index_usage_stats
5 мар 13, 13:02    [14013815]     Ответить | Цитировать Сообщить модератору
 Re: Нужны или индексы  [new]
andrew shalaev
Member

Откуда: Moscow
Сообщений: 610
xj,

Неиспользуемые индексы
+

-- Create required table structure only.
-- Note: this SQL must be the same as in the Database loop given in the following step.
SELECT TOP 1
        DatabaseName = DB_NAME()
        ,TableName = OBJECT_NAME(s.[object_id])
        ,IndexName = i.name
        ,user_updates    
        ,system_updates    
        -- Useful fields below:
        --, *
INTO #TempUnusedIndexes
FROM   sys.dm_db_index_usage_stats s 
INNER JOIN sys.indexes i ON  s.[object_id] = i.[object_id] 
    AND s.index_id = i.index_id 
WHERE  s.database_id = DB_ID()
    AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0
    AND    user_seeks = 0
    AND user_scans = 0 
    AND user_lookups = 0
    AND s.[object_id] = -999  -- Dummy value to get table structure.
;

-- Loop around all the databases on the server.
EXEC sp_MSForEachDB    'USE [?]; 
-- Table already exists.
INSERT INTO #TempUnusedIndexes 
SELECT TOP 10    
        DatabaseName = DB_NAME()
        ,TableName = OBJECT_NAME(s.[object_id])
        ,IndexName = i.name
        ,user_updates    
        ,system_updates    
FROM   sys.dm_db_index_usage_stats s 
INNER JOIN sys.indexes i ON  s.[object_id] = i.[object_id] 
    AND s.index_id = i.index_id 
WHERE  s.database_id = DB_ID()
    AND OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0
    AND    user_seeks = 0
    AND user_scans = 0 
    AND user_lookups = 0
    AND i.name IS NOT NULL    -- Ignore HEAP indexes.
ORDER BY user_updates DESC
;
'

-- Select records.
SELECT TOP 10 * FROM #TempUnusedIndexes ORDER BY [user_updates] DESC
-- Tidy up.
DROP TABLE #TempUnusedIndexes


5 мар 13, 13:04    [14013827]     Ответить | Цитировать Сообщить модератору
 Re: Нужны или индексы  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
andrew shalaev
xj,

Неиспользуемые индексы
Из-за INNER JOIN запрос не покажет индексы к которым не было ни единого обращения.
6 мар 13, 01:52    [14017264]     Ответить | Цитировать Сообщить модератору
 Re: Нужны или индексы  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
+ Я бы предложил что-то вроде
SET LOCK_TIMEOUT 10000
SELECT 
  OBJECT_SCHEMA_NAME(i.[object_id]) + '.' + OBJECT_NAME(i.[object_id]) AS TableName,
  i.name AS IndexName,
  CAST(SizeMB AS DECIMAL(20, 2)) AS SizeMB,
  user_updates,
  system_updates
FROM sys.indexes AS i
LEFT JOIN 
    (
      SELECT object_id, index_id, SUM(used_page_count)/128. AS SizeMB
      FROM sys.dm_db_partition_stats
      GROUP BY object_id, index_id
    ) p ON p.object_id = i.object_id AND p.index_id = i.index_id
LEFT JOIN sys.dm_db_index_usage_stats AS s
  ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
  AND s.database_id = DB_ID()
WHERE OBJECTPROPERTY(i.[object_id], 'IsMsShipped') = 0
  AND i.name IS NOT NULL
  AND ISNULL(s.user_seeks + s.user_scans + s.user_lookups, 0) = 0
ORDER BY SizeMB DESC
6 мар 13, 02:06    [14017269]     Ответить | Цитировать Сообщить модератору
 Re: Нужны или индексы  [new]
xj
Member

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

результат выполнения запроса- 0 rows
6 мар 13, 10:41    [14018159]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить