Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
gnux Member Откуда: Сообщений: 1 |
Всем привет. Помогите пожалуйста составить конструкцию для запроса. Задача: Есть запрос (поиск тяжелых запросов). Запрос может вывести несколько строк. Необходимо проверять эти строки и при нахождении определенного запроса запускать следующее действие. Как я это вижу: 1) SELECT * FROM..... 2) результат: N1, Nx 3) Анализ на условие 4) Если строка Nx соответствует критерию, запустить alter index.... Спасибо. |
19 июн 18, 20:24 [21504493] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
gnux, Вы решаете интересную задачу, но делаете это не с той стороны.... Поиск и оптимизация тяжелых запросов - это отдельная песня. Обслуживание индексов и статистики - отдельная. Я подозреваю, что у вас есть некоторые проблемы с производительностью .... Также я думаю, что вы заметили некоторую закономерность между перестройкой индексов и улучшением производительности некоторых запросов. На основании этого вы решили найти определенные запросы и перестроить индексы по участвующим в них таблицам. Если всё так, то вам правильнее будет смотреть в сторону регулярного обслуживания индексов и пересчету статистик. Скриптов по поиску фрагментированных индексов и устаревших статистик - в интернете тьма. Если сами не уверены в качестве найденных решений - несите их сюда, местные гуру помогут оценить "качество" найденных скриптов :) |
20 июн 18, 02:45 [21505413] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Возможно он хочет другого. Запустить некий бенчмарк, после которого принять решение - стоит ли индексировать или нет. Т.Е понять, дошла ли база до состояния, требующего индексации. "Регулярное обслуживание" несомненно вещь нужная и полезная. Но есть и нерегулярный ввод данных и затратность/длительность самого процесса индексации. Поэтому он и пытается решить задачу "а стоит ли индексировать?" Причем данный ответ может как и ускорить сроки "регулярного обслуживания", так и отменить его. |
20 июн 18, 04:57 [21505434] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
982183, Красивая теория. Меня смущает лишь тот факт, что ALTER INDEX в неё плохо вписывается. Но это можно списать на опечатку ТС, конечно же. |
20 июн 18, 05:41 [21505452] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Согласен. Исходил из DBREINDEX. А alter index автоматом это уже ИИ. |
20 июн 18, 05:52 [21505457] Ответить | Цитировать Сообщить модератору |
DaniilSeryi Member Откуда: Сообщений: 1758 |
Alter index / rebuild index автоматом - это не ИИ, а скрипт на пару десятков строк. где-то на просторах форума валяется. или в FAQ даже. Сами сможете переписать код так, чтобы код из столбца run_it выполнялся в курсоре? SELECT distinct QUOTENAME(s.name) + '.' + OBJECT_NAME(p.object_id) as Table_name, p.index_id AS indexid, sys.indexes.name, partition_number AS partitionnum, avg_fragmentation_in_percent AS frag, 'ALTER INDEX [' + sys.indexes.name + '] on ' + s.name + '.' + OBJECT_NAME(p.object_id) + case when avg_fragmentation_in_percent <15 then ' Reorganize' else ' Rebuild' end as 'Run_it' FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED') as p inner join sys.indexes on p.index_id=sys.indexes.index_id and p.[object_id]=sys.indexes.[object_id] inner join sys.objects AS o on p.object_id=o.object_id inner JOIN sys.schemas as s ON s.schema_id = o.schema_id WHERE avg_fragmentation_in_percent > 5.0 AND p.index_id > 0; А Вам, на самом деле, более актуальна тема поиска missing index-ов, что-то вроде select e.*, DB_NAME(database_id) as 'DB_Name', [statement], equality_columns, inequality_columns, included_columns, 'CREATE NONCLUSTERED INDEX ' + 'i' + OBJECT_NAME([OBJECT_ID]) + '_' + replace(replace(replace(ISNULL(equality_columns,''),',','_'),'[','') ,']','') + replace(replace(replace(ISNULL(inequality_columns,''),',','_'),'[','') ,']','') + ' ON ' + [statement] +' ('+ISNULL(equality_columns,'') + case when not (equality_columns is null) and not (inequality_columns is null) then ',' else '' end + ISNULL(inequality_columns,'') +') ' + case when included_columns is null then '' else ' INCLUDE( ' + included_columns + ')' end as 'Draft_for_Script' FROM (select sys.dm_db_missing_index_group_stats.*, avg_total_user_cost*avg_user_impact*(user_seeks + user_scans) as Zatraty from sys.dm_db_missing_index_group_stats ) as e inner join sys.dm_db_missing_index_groups on e.group_handle=sys.dm_db_missing_index_groups.index_group_handle inner join sys.dm_db_missing_index_details on sys.dm_db_missing_index_groups.index_handle =sys.dm_db_missing_index_details.index_handle where DB_NAME(database_id)='test' and last_user_seek>='2014-04-01' order by /*[statement],*/ avg_total_user_cost*avg_user_impact*(user_seeks + user_scans) desc |
||
20 июн 18, 17:34 [21507552] Ответить | Цитировать Сообщить модератору |
DaniilSeryi Member Откуда: Сообщений: 1758 |
gnux, а... насчёт поиска долго выполняющихся запросов и заодно, блокировок - смотрим результаты exec sp_who2 |
20 июн 18, 17:38 [21507570] Ответить | Цитировать Сообщить модератору |
Eleanor Member Откуда: Сообщений: 3204 |
Причем, ТС придется учесть, что в результатах sys.dm_db_missing_index* бывают: Поэтому лучше начать с ручного анализа индексов и их создания. Сразу написать качественный автоматический скрипт создания индексов не получится. |
||
20 июн 18, 23:46 [21508258] Ответить | Цитировать Сообщить модератору |
DaniilSeryi Member Откуда: Сообщений: 1758 |
Eleanor, Ну хоть можно будет посмотреть, что имеет смысл создать. Другая сторона вопроса - анализ того, насколько востребованны ранее СОЗДАННЫЕ индексы, но и здесь не без нюансов, типа индекса, который используется только раз в месяц для очень тяжёлой выборки. |
21 июн 18, 09:26 [21508501] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |