powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Самые популярные таблицы в запросах
8 сообщений из 8, страница 1 из 1
Самые популярные таблицы в запросах
    #39964398
Earl11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Имеется таблица со столбцами id и текст запроса. Необходимо отсортировать таблицы, используемые в тексте запросов. По сути всё сводит к извлечению из запроса слов после выражения "FROM" и "JOIN", но как их извлечь - в этом, наверное, вопрос.
...
Рейтинг: 0 / 0
Самые популярные таблицы в запросах
    #39964401
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, берете, пишете парсер запросов и считаете. Осталось понять одно: нафига?
...
Рейтинг: 0 / 0
Самые популярные таблицы в запросах
    #39964457
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Earl11По сути всё сводит к извлечению из запроса слов после выражения "FROM" и "JOIN"А также in (), exists (), apply () и куча всего остального.

Проще, думаю, все-таки пойти стандартным путем, а именно воспользоваться sys.dm_db_index_usage_stats на том сервере, откуда у вас эта таблица (не из ноосферы же вы ее считали). Там все уже посчитано до вас.
...
Рейтинг: 0 / 0
Самые популярные таблицы в запросах
    #39964715
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Earl11
Здравствуйте. Имеется таблица со столбцами id и текст запроса. Необходимо отсортировать таблицы, используемые в тексте запросов. По сути всё сводит к извлечению из запроса слов после выражения "FROM" и "JOIN", но как их извлечь - в этом, наверное, вопрос.

Если речь идет о запросах, которые выполнялись на целевой системе в течение определенного времени, то, вчерне, это будет нечто вроде такого запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
;With XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
,s as (SELECT query_hash, query_plan
FROM sys.dm_exec_query_stats AS qs 
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle)
)
,[tables] as (
Select query_hash
,t.n.value('@Database', 'sysname') [database]
,t.n.value('@Schema', 'sysname') [schema]
,t.n.value('@Table', 'sysname') [table]
from s
Cross apply query_plan.nodes ('//Object') t(n)
)
Select Count(distinct query_hash), [database], [schema], [table]
from [tables] a
Where a.[database] is not null
Group by [database],[schema],[table]
Order by 1 Desc


(по смыслу - выгребаем все запросы из кэша планов, ищем в них объекты со ссылкой на бд-схему-таблицу, считаем в разрезе хэшей этих запросов).
Хотя, это так, идея, набросок для решения. Я думаю, коллеги поправят.
И, опять же, надо понимать, что речь идет о запросах, которые выполнялись на сервере с момента последнего перезапуска или DBCC FREEPROCCACHE, и не были, соответственно, вычеркнуты из кэша за период работы.

Если же речь идет о том, что у вас есть набор текстов запросов, например, в каком-нибудь хранилище кода, и вы хотите проанализировать его подобным образом, то, боюсь, чистого TSQL - не достаточно.
Нужно написать CLR процедуру примерно подобного содержания:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
private static string GetXmlPlanForQuery(string queryText)
{
    string result = null;
    using (var connection = new SqlConnection(connectionString))
    using (var command = new SqlCommand())
    {
        connection.Open();
        command.Connection = connection;

        //Enable the statistics.
        command.CommandText = "SET STATISTICS XML ON";
        command.ExecuteNonQuery();

        //Run through the query, keeping the first row first column of the last result set.
        command.CommandText = queryText;
        using (var reader = command.ExecuteReader())
        {
            object lastValue = null;
            do
            {
                if (reader.Read())
                {
                    lastValue = reader.GetValue(0);
                }
            } while (reader.NextResult());

            if (lastValue != null)
            {
                result = lastValue as string;
            }
        }
    }
    return result;
}


https://stackoverflow.com/questions/25879543/are-there-any-way-to-programmatically-execute-a-query-with-include-actual-execut
А потом, соответственно, последовательно скормить этой процедуре тексты ваших запросов, а результат в xml - проанализировать с помощью запроса выше, заменив:
Код: sql
1.
2.
FROM sys.dm_exec_query_stats AS qs 
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle)


на
Код: sql
1.
2.
FROM таблица_с_текстами_запросов AS qs 
CROSS APPLY GetXmlPlanForQuery(qs.текст_запроса_из_таблицы)
...
Рейтинг: 0 / 0
Самые популярные таблицы в запросах
    #39964968
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Earl11,

муть какая-то, Вы предполагаете, что все запросы выполняются с одинаковой вероятностью, что ли? Или поспорили с товарищем?
...
Рейтинг: 0 / 0
Самые популярные таблицы в запросах
    #39965221
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я предполагаю, что это - рефакторинг.
Пытаются определить трудозатраты на переписывание при изменении структуры хранения.
Я видел такое, слава богу - издалека.
1500+ таблиц, более 300 тыс. запросов, неявные зависимости между таблицами через триггеры и т.д., динамический sql...
...
Рейтинг: 0 / 0
Самые популярные таблицы в запросах
    #39965237
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
1500+ таблиц, более 300 тыс. запросов, неявные зависимости между таблицами через триггеры и т.д., динамический sql...

Тут, по-моему, уже никакой рефакторинг не поможет.
...
Рейтинг: 0 / 0
Самые популярные таблицы в запросах
    #39965404
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
uaggster
1500+ таблиц, более 300 тыс. запросов, неявные зависимости между таблицами через триггеры и т.д., динамический sql...

Тут, по-моему, уже никакой рефакторинг не поможет.

Ну, во-первых, главное - процесс...
... и финансирование этого процесса...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Самые популярные таблицы в запросах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]