Имя: Пароль:
1C
1С v8
v8: как узнать где нехватает индексов?
0 prog01
 
03.10.12
16:10
вопрос конкретный и серьезный )))
1 prog01
 
03.10.12
16:13
можно ещё добавть что в базе мало записи и много вывода
2 х86
 
03.10.12
16:14
(0)откуда уверенность что индексов не хватает?
3 Deon
 
03.10.12
16:14
каких таких индексов?
4 ILM
 
гуру
03.10.12
16:15
Если только, в некоторых регистрах накопления, но нужно очень-очень осторожно тюнинговать.
5 ДенисЧ
 
03.10.12
16:16
на нимостарте недавно была обработка по...
6 prog01
 
03.10.12
16:17
(2) это у меня "не делание" такое )))
7 prog01
 
03.10.12
16:19
(5)такая?
sys.dm_db_missing_index_details
8 ДенисЧ
 
03.10.12
16:20
9 ДенисЧ
 
03.10.12
16:20
(7) Ага. Через неё. Только с развёрткой по метаданным.
10 prog01
 
03.10.12
16:20
или такая:?

Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   Сообщить("Справочники");
                               
   Для Каждого Объект Из Метаданные.Справочники Цикл
       
       Для Каждого Реквизит Из Объект.Реквизиты Цикл
           
           Если Строка(Реквизит["Индексирование"]) <> "ИндексироватьСДопУпорядочиванием" Тогда
               
               Сообщить("" + Реквизит["Индексирование"] + " " + Реквизит.Тип + " " + Объект + " " + Реквизит);
               
           КонецЕсли;
                           
       КонецЦикла
               
   КонецЦикла;
   
   Сообщить("Документы");
   
   Для Каждого Объект Из Метаданные.Документы Цикл
       
       Для Каждого Реквизит Из Объект.Реквизиты Цикл
           
           Если Строка(Реквизит["Индексирование"]) <> "ИндексироватьСДопУпорядочиванием" Тогда
               
               Сообщить("" + Реквизит["Индексирование"] + " " + Реквизит.Тип + " " + Объект + " " + Реквизит);
               
           КонецЕсли;
                           
       КонецЦикла
               
   КонецЦикла;
   
   Сообщить("Журналы");
   
   Для Каждого Объект Из Метаданные.ЖурналыДокументов Цикл
       
       Для Каждого Реквизит Из Объект.Графы Цикл
           
           Если Строка(Реквизит["Индексирование"]) <> "ИндексироватьСДопУпорядочиванием" Тогда
               
               Сообщить("" + Реквизит["Индексирование"]
               //+ " " + Реквизит.Тип
               + " " + Объект + " " + Реквизит);
               
           КонецЕсли;
                           
       КонецЦикла
               
   КонецЦикла;
   
   Сообщить("Сведений");
   
   Для Каждого Объект Из Метаданные.РегистрыСведений Цикл
       
       Для Каждого Реквизит Из Объект.Реквизиты Цикл
           
           Если Строка(Реквизит["Индексирование"]) <> "Индексировать" Тогда
               
               Сообщить("" + Реквизит["Индексирование"] + " " + Реквизит.Тип + " " + Объект + " " + Реквизит);
               
           КонецЕсли;
                           
       КонецЦикла;
       
       Для Каждого Реквизит Из Объект.Измерения Цикл
           
           Если Строка(Реквизит["Индексирование"]) <> "Индексировать" Тогда
               
               Сообщить("" + Реквизит["Индексирование"] + " " + Реквизит.Тип + " " + Объект + " " + Реквизит);
               
           КонецЕсли;
                           
       КонецЦикла;
       
       Для Каждого Реквизит Из Объект.Ресурсы Цикл
           
           Если Строка(Реквизит["Индексирование"]) <> "Индексировать" Тогда
               
               Сообщить("" + Реквизит["Индексирование"] + " " + Реквизит.Тип + " " + Объект + " " + Реквизит);
               
           КонецЕсли;
                           
       КонецЦикла;
           
   КонецЦикла;
   
   Сообщить("Накопления");
   
   Для Каждого Объект Из Метаданные.РегистрыНакопления Цикл
       
       Для Каждого Реквизит Из Объект.Реквизиты Цикл
           
           Если Строка(Реквизит["Индексирование"]) <> "Индексировать" Тогда
               
               Сообщить("" + Реквизит["Индексирование"] + " " + Реквизит.Тип + " " + Объект + " " + Реквизит);
               
           КонецЕсли;
                           
       КонецЦикла;
       
       Для Каждого Реквизит Из Объект.Измерения Цикл
           
           Если Строка(Реквизит["Индексирование"]) <> "Индексировать" Тогда
               
               Сообщить("" + Реквизит["Индексирование"] + " " + Реквизит.Тип + " " + Объект + " " + Реквизит);
               
           КонецЕсли;
                           
       КонецЦикла;
       
       Для Каждого Реквизит Из Объект.Ресурсы Цикл
           
           Попытка
               
               Если Строка(Реквизит["Индексирование"]) <> "Индексировать" Тогда
                   
                   Сообщить("" + Реквизит["Индексирование"] + " " + Реквизит.Тип + " " + Объект + " " + Реквизит);
                   
               КонецЕсли;
               
           Исключение
           КонецПопытки;
                           
       КонецЦикла;
               
   КонецЦикла;
                     
КонецПроцедуры
11 IronDemon
 
03.10.12
16:22
12 ILM
 
гуру
03.10.12
18:15
Нужно всегда отталкиваться от требований клиента. Процесс оптимизации, кода, субд, запросов, индексов, raid-ов и т.д. должен когда-нибудь заканчиваться.  Можно сделать дубль базу для анализов и отчетов, а можно 15 секунд подождать в рабочей базе.
13 prog01
 
04.10.12
10:07
(12)из этих 15 секунд складывается жизнь, моя задача сделать годную базу а создать пару десятков рабочих мест
14 prog01
 
04.10.12
10:12
а  создать = а НЕ создать
15 rs_trade
 
04.10.12
10:13
воспользоваться Database Engine Tuning Advisor
16 rs_trade
 
04.10.12
10:15
(7) по моему, отсутствующие индексы и не хватает индексов несколько разные понятия.
17 prog01
 
04.10.12
10:16
(15)я его как-то потыкал но он не подключился к базе как время будет вернусь к нему
дело в том что самые важные работы проводятся как всегда урывками от основного тупняка ползовалтелей бд
18 rs_trade
 
04.10.12
10:19
(17) то что ты хочешь большое дело, комплекс мероприятий. и ни одна обработка тебе этого не покажет. самый легкий способ отбирать топ 10 тяжелых запросов и смотреть их.
19 pavig
 
04.10.12
10:23
(0) наибольший прирост производительности даст обновление аппаратной части, потом - оптимизация кода 1С
20 prog01
 
04.10.12
10:23
(18)ясен пень если бы всё было просто я бы тут не поднимал этот вопрос
21 Fragster
 
гуру
04.10.12
10:25
дык дело не в том, что индексов не хватает, а в том, что автор пишет такие запросы, что его условия туда не попадают...
22 IronDemon
 
04.10.12
10:25
(21) Инфа 100% :)
23 prog01
 
04.10.12
10:30
(18)(19)включить мозг это конечно комплекс мероприятий
что уже есть процессоры с частотой больше 3 ггерц?
(21)(22)боя нисты...
конфа овно, вот в чем дело и сабж никак не связан с творчеством другого сотрудника по другой ветке
24 rs_trade
 
04.10.12
10:52
(23) наращивать частоту процов для повышения быстродействия субд, это конечно дело безусловно важное и нужное. ничего не трогай, дождись процов по 5 ггерц, и все у тебя само залетает.
25 prog01
 
04.10.12
11:05
(24)это (19)советует посоветовал заменить одно железо на другое такое же железное
26 pavig
 
04.10.12
11:12
(25) для начала протестируй ЦУПом и увидишь что одно железное не всегда такое же железное как другое железное
умник нашеьлся
27 rs_trade
 
04.10.12
11:25
(25) ага. он сказал железо, а проц сказал ты.
28 H A D G E H O G s
 
04.10.12
11:26
(19) Бред.
29 rs_trade
 
04.10.12
11:44
(28) нет. но до определенного момента же. у 7.7 этот порог еще ниже чем в v8.
30 artems
 
04.10.12
11:49
(23) есть такие процессоры
31 pavig
 
04.10.12
12:30
(28) почитай Гилева например
32 prog01
 
04.10.12
14:00
Для анализа работы 1С с базой SQL можно применять множество средств MS SQL Server, но для анализа индексации объектов конфигурации прощу всего и быстрее использовать простой запрос, предложенный специалистами Microsoft:

SELECT TOP 20
[Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)
, avg_user_impact
, TableName = statement
, [EqualityUsage] = equality_columns
, [InequalityUsage] = inequality_columns
, [Include Cloumns] = included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s
ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d
ON d.index_handle = g.index_handle
where statement like '%base1C%'
ORDER BY [Total Cost] DESC;

http://wondermaker.at.ua/publ/vivisekcija_indeksov_1s_predprijatija/6-1-0-420

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

(31)спасибо Гилеву за перевод мсдн, но реально рабочих инструментов у него нет
нет готовых решений
есть демонстрация силы
33 Fragster
 
гуру
04.10.12
14:23
а слабо ЛИШНИЕ индексы получить?
34 prog01
 
04.10.12
15:03
(33)индексов много не бывает
запись от этого всё равно особо не увеличивается по времени
35 МихаилМ
 
04.10.12
15:09
(34)

года полтора - два назад
на этом форуме один товарищ решил также
и добавил везде где мог признак индексировать

потом плакался здесь
36 Fragster
 
гуру
04.10.12
15:10
(34) я вот посмотрел индексы, которые ни разу не использовались - вышло на 17 гигов... надо будет грохнуть
37 Fragster
 
гуру
04.10.12
15:11
(36) а кроме таких есть еще индексы, которые используются не оптимально, хотя тут обновление статистики спасает. И вопрос о том еще, когда создал новые более оптимальные индексы - как определить те, которые больше не используются, т.е. последнее время использования индекса
38 IronDemon
 
04.10.12
15:27
(32) В куске книги есть
39 prog01
 
04.10.12
16:39
40 prog01
 
04.10.12
16:42
(35) а что палакаться? прибить нужно было да и всё или пересоздать через .dt
и вообще неудачный пример по сабжу нужно создавать а не удалять лишние
хотя если бы скрипт по удалению неиспользуемых был бы приведен бы ло бы ваще круто
41 prog01
 
05.10.12
12:20
up
42 Fragster
 
гуру
05.10.12
12:43
(41) что АП? есть как посмотреть последнее время использования индекса?
43 prog01
 
05.10.12
12:45
(42)нужен скрипт который удалит неиспользуемые и создаст недостающие индексы самому писать лениво
как определить недостающие нашел
теперь хотя бы найти как определеть неиспользуемые
44 Sammo
 
05.10.12
12:49
(43) Создаст неиспользуемые какими средствами? Скуля? Тогда слетят после очередной реструктуризации...
45 Fragster
 
гуру
05.10.12
12:52
SELECT   OBJECT_NAME(i.object_id) AS [Table Name],
        i.name AS [Not Used Index Name],
        s.last_user_update AS [Last Update Time], i.type_desc,
        s.user_updates AS [Updates], i.object_id, ix.dpages*8/1024 AS 'Size(Mb)'
FROM     sys.dm_db_index_usage_stats AS s
JOIN     sys.indexes AS i
ON       i.object_id = s.object_id
AND      i.index_id = s.index_id
JOIN     sys.objects AS o
ON       o.object_id = s.object_id
JOIN    sysindexes AS ix
ON       i.name=ix.name
WHERE    s.database_id = DB_ID()
AND      (    user_scans   = 0
         AND user_seeks   = 0
         AND user_lookups = 0
         AND last_user_scan   IS NULL
         AND last_user_seek   IS NULL
         AND last_user_lookup IS NULL
        )
AND      OBJECTPROPERTY(i.[object_id],         'IsSystemTable'   ) = 0
AND      INDEXPROPERTY (i.[object_id], i.name, 'IsAutoStatistics') = 0
AND      INDEXPROPERTY (i.[object_id], i.name, 'IsHypothetical'  ) = 0
AND      INDEXPROPERTY (i.[object_id], i.name, 'IsStatistics'    ) = 0
AND      INDEXPROPERTY (i.[object_id], i.name, 'IsFulltextKey'   ) = 0
AND      (i.index_id between 2 AND 250 OR (i.index_id=1 AND OBJECTPROPERTY(i.[object_id],'IsView')=1))
AND      o.type <> 'IT'
ORDER BY OBJECT_NAME(i.object_id)


вто так смотреть то, что вообще ни разу не использовалось. а вот как посмотреть, какие стали неактуальными после создания других?
46 IronDemon
 
05.10.12
12:53
(43) Про скрипт - бред. В 1С индексы добавляешь/удаляешь.
47 prog01
 
05.10.12
12:56
(44)а что - можно средствами 1С?
48 IronDemon
 
05.10.12
12:56
Finding the most-costly unused indexes
Superfluous indexes have a detrimental effect on the performance of your SQL que-ries, because they cause SQL Server to do unnecessary work. Running the SQL script
given in the next listing will identify the top 20 most-costly unused indexes, ordered by
the number of updates that have been applied to them.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT                                                    
   DB_NAME() AS DatabaseName
   , SCHEMA_NAME(o.Schema_ID) AS SchemaName
   , OBJECT_NAME(s.[object_id]) AS TableName
   , i.name AS IndexName
   , s.user_updates
   , s.system_seeks + s.system_scans + s.system_lookups
                         AS [System usage]
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
INNER JOIN sys.objects o ON i.object_id = O.object_id    
WHERE 1=2

EXEC sp_MSForEachDB 'USE [You_Base];
INSERT INTO #TempUnusedIndexes
SELECT TOP 40
   DB_NAME() AS DatabaseName
   , SCHEMA_NAME(o.Schema_ID) AS SchemaName
   , OBJECT_NAME(s.[object_id]) AS TableName
   , i.name AS IndexName
   , s.user_updates
   , s.system_seeks + s.system_scans + s.system_lookups
                                        AS [System usage]
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
INNER JOIN sys.objects o ON i.object_id = O.object_id    
WHERE s.database_id = DB_ID()
AND OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0
AND s.user_seeks = 0
   AND s.user_scans = 0
   AND s.user_lookups = 0
AND i.name IS NOT NULL
ORDER BY s.user_updates DESC'                            

SELECT DISTINCT TOP 40 * FROM #TempUnusedIndexes ORDER BY [user_updates] DESC
DROP TABLE #TempUnusedIndexes
49 IronDemon
 
05.10.12
12:58
Вот только много *BySimpleKey_B выдает :(
50 Fragster
 
гуру
05.10.12
12:59
(49) кстати, я не нашел, что это за фигня....
51 prog01
 
05.10.12
12:59
(49)
"
Поиск наиболее дорогостоящих неиспользуемых индексов
Лишние индексы имеют пагубное влияние на производительность SQL Que-Райс, потому что они вызывают SQL Server, чтобы сделать ненужной работы. Запуск сценария SQL
приведены в следующем каталоге будет определять 20 самых дорогостоящих неиспользуемых индексов, упорядоченных по
количество обновлений, которые были применены к ним.
"

понятно
но

"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"
- это зачем?
52 Fragster
 
гуру
05.10.12
13:05
(51) чтобы блокировок не плодить
53 prog01
 
05.10.12
13:13
(48)спасибо, прикольные результаты, оказывается индексы на одних и тех же метаданных есть но не и спользуются а тех что нужно нет )))
(52)и что быдет с системой без блокировок чет я не понял?
54 prog01
 
05.10.12
13:15
точнее на таблицах регистрации изменений неиспользуемые есть
вот нафик они её проиндексировали....
куею ваще
55 Fragster
 
гуру
05.10.12
13:15
(53) ну если у тебя 100500 пользователей фигачат - то твои действия как-бы не должны им мешать... ты там типа уборщицы, а они деньги зарабатывают фирме...
56 prog01
 
05.10.12
13:17
(55)(SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED) - это шутка?
57 Fragster
 
гуру
05.10.12
13:18
вообще блокировки намного пагубнее влияют, чем отсутствующие индексы. просто индексы позволяют блокировать меньше и на меньший период
58 Sammo
 
05.10.12
13:18
Кстати, наличие неиспользуемых индексов отнюде не значит, что они не нужны.
Это может быть ошибкой проектирования, но может быть и неумением писать запросы с использованием нужных индексов...
59 Fragster
 
гуру
05.10.12
13:18
(56) ты знаешь, что такое read uncommitted? и чем отличается от других уровней изоляции?
60 Fragster
 
гуру
05.10.12
13:19
(58) прав
61 prog01
 
05.10.12
13:20
(59)да понял уже...
62 prog01
 
05.10.12
13:20
не о том подумал сначала...
63 prog01
 
05.10.12
14:08
зацените что я нарыл:

DECLARE    @Query    NVarChar(max)
SELECT    @Query    = (
SELECT    Top(1)
   'CREATE INDEX ',QuoteName('IX_' + Object_Name(M.object_id,M.database_id) + '_' + Replace(Replace(Replace(X.[Columns],'], [','_'),']',''),'[',''))
   ,' ON ',M.[statement] AS [*],' (',X.[Columns] AS [*],')'
   ,' INCLUDE (' + M.included_columns + ')'
   ,' WITH (ONLINE = ON)
'FROM    sys.dm_db_missing_index_details M CROSS APPLY (SELECT
        Coalesce(M.equality_columns + ', ' + M.inequality_columns,M.equality_columns, M.inequality_columns)
   ) X ([Columns])
FOR XML Path(''),Type).value('text()[1]','NVarChar(max)')
PRINT    @Query
BEGIN TRAN TAddIndexes;
EXEC(@Query)
ROLLBACK
64 Fragster
 
гуру
05.10.12
14:09
(63) -> (44)
65 prog01
 
05.10.12
14:12
(64)можно его в джоб ночного бэкапа присобачить )))
ну или как говорил один истероид "программист не обезьяна, должен понимать что делает"
тупо выполнять сразу после реструктуризации
66 Fragster
 
гуру
05.10.12
14:14
(65) лучше пиши запросы так, чтобы они в индексы попадали. 1с дофига индексов создает, которых в 70% достаточно. отсуствующие можно добавить самому, проанализировав недостающие и ПолучитьСтруктуруХраненияБазыДанных()
67 prog01
 
05.10.12
14:18
(66)OK! )))
а есть у кого пруфлинк на "Database Engine Tuning Advisor" на русском для чайников?
68 rs_trade
 
06.10.12
11:27
(67) да там все просто. настраиваешь сбор рабочих трасс профайлером в отдельную базу данных, потом эту базу подсовываешь адвизору этому.