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

Откуда:
Сообщений: 1
Всем привет.
Помогите пожалуйста составить конструкцию для запроса.

Задача:
Есть запрос (поиск тяжелых запросов).
Запрос может вывести несколько строк.
Необходимо проверять эти строки и при нахождении определенного запроса запускать следующее действие.


Как я это вижу:
1) SELECT * FROM.....
2) результат: N1, Nx
3) Анализ на условие
4) Если строка Nx соответствует критерию, запустить alter index....


Спасибо.
19 июн 18, 20:24    [21504493]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста составить конструкцию для запроса  [new]
Щукина Анна
Member

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

Вы решаете интересную задачу, но делаете это не с той стороны....
Поиск и оптимизация тяжелых запросов - это отдельная песня.
Обслуживание индексов и статистики - отдельная.

Я подозреваю, что у вас есть некоторые проблемы с производительностью ....
Также я думаю, что вы заметили некоторую закономерность между перестройкой индексов и улучшением производительности некоторых запросов.
На основании этого вы решили найти определенные запросы и перестроить индексы по участвующим в них таблицам.

Если всё так, то вам правильнее будет смотреть в сторону регулярного обслуживания индексов и пересчету статистик. Скриптов по поиску фрагментированных индексов и устаревших статистик - в интернете тьма. Если сами не уверены в качестве найденных решений - несите их сюда, местные гуру помогут оценить "качество" найденных скриптов :)
20 июн 18, 02:45    [21505413]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста составить конструкцию для запроса  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Возможно он хочет другого.
Запустить некий бенчмарк, после которого принять решение - стоит ли индексировать или нет.
Т.Е понять, дошла ли база до состояния, требующего индексации.
"Регулярное обслуживание" несомненно вещь нужная и полезная.
Но есть и нерегулярный ввод данных и затратность/длительность самого процесса индексации.
Поэтому он и пытается решить задачу "а стоит ли индексировать?"
Причем данный ответ может как и ускорить сроки "регулярного обслуживания", так и отменить его.
20 июн 18, 04:57    [21505434]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста составить конструкцию для запроса  [new]
Щукина Анна
Member

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

Красивая теория. Меня смущает лишь тот факт, что ALTER INDEX в неё плохо вписывается. Но это можно списать на опечатку ТС, конечно же.
20 июн 18, 05:41    [21505452]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста составить конструкцию для запроса  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Согласен. Исходил из DBREINDEX.
А alter index автоматом это уже ИИ.
20 июн 18, 05:52    [21505457]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста составить конструкцию для запроса  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1723
982183
Согласен. Исходил из DBREINDEX.
А alter index автоматом это уже ИИ.


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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста составить конструкцию для запроса  [new]
DaniilSeryi
Member

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

а... насчёт поиска долго выполняющихся запросов и заодно, блокировок - смотрим результаты
exec sp_who2
20 июн 18, 17:38    [21507570]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста составить конструкцию для запроса  [new]
Eleanor
Member

Откуда:
Сообщений: 2858
DaniilSeryi
А Вам, на самом деле, более актуальна тема поиска missing index-ов, что-то вроде...

Причем, ТС придется учесть, что в результатах sys.dm_db_missing_index* бывают:
  • индексы, которые на самом деле уже существуют
  • индексы, которые в части INCLUDE избыточно включают поле первичного ключа
  • множество очень похожих индексов с немного отличающимся набором полей
  • широкие поля, которые ТС может не захотеть включать в индекс

    Поэтому лучше начать с ручного анализа индексов и их создания. Сразу написать качественный автоматический скрипт создания индексов не получится.
  • 20 июн 18, 23:46    [21508258]     Ответить | Цитировать Сообщить модератору
     Re: Помогите пожалуйста составить конструкцию для запроса  [new]
    DaniilSeryi
    Member

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

    Ну хоть можно будет посмотреть, что имеет смысл создать.
    Другая сторона вопроса - анализ того, насколько востребованны ранее СОЗДАННЫЕ индексы, но и здесь не без нюансов, типа индекса, который используется только раз в месяц для очень тяжёлой выборки.
    21 июн 18, 09:26    [21508501]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить