|
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) да там все просто. настраиваешь сбор рабочих трасс профайлером в отдельную базу данных, потом эту базу подсовываешь адвизору этому.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |