#sql #sql-server #oracle #code-coverage
#sql #sql-server #Oracle #покрытие кода
Вопрос:
У меня есть база данных со многими таблицами, которые используются, и многими таблицами, которые больше не используются. Хотя я мог бы отсортировать каждую таблицу вручную, чтобы увидеть, используются ли они все еще, это было бы громоздкой задачей. Существует ли какое-либо программное обеспечение / скрытая функция, которую можно использовать в базе данных SQL Server / Oracle, которая возвращала бы информацию типа «Таблицы x, y, z не использовались в прошлом месяце», «Таблицы a, b, c использовались сегодня 17 раз»? Или, возможно, способ сортировки таблиц по «Дате последнего изменения / выбранной из»?
Или есть лучший способ сделать это? Спасибо
Редактировать: Я обнаружил столбец «modify_date» при выполнении команды «ВЫБРАТЬ * ИЗ sys.tables ORDER BY modify_date desc», но, похоже, это отслеживает только изменения структуры таблицы, а не ее содержимого.
Ответ №1:
замените spt_values
на имя таблицы, которое вас интересует, запрос выдаст, когда оно использовалось в последний раз и чем оно использовалось
SELECT * FROM(SELECT COALESCE(OBJECT_NAME(s2.objectid),'Ad-Hoc') AS ProcName,execution_count,
(SELECT TOP 1 SUBSTRING(s2.TEXT,statement_start_offset / 2 1 ,
( (CASE WHEN statement_end_offset = -1
THEN (LEN(CONVERT(NVARCHAR(MAX),s2.TEXT)) * 2)
ELSE statement_end_offset END) - statement_start_offset) / 2 1)) AS sql_statement,
last_execution_time
FROM sys.dm_exec_query_stats AS s1
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2 ) x
WHERE sql_statement like '%spt_values%' -- replace here
AND sql_statement NOT like 'SELECT * FROM(SELECT coalesce(object_name(s2.objectid)%'
ORDER BY execution_count DESC
Имейте в виду, что если вы перезапустите окно, это будет удалено
Комментарии:
1. Выполняется ли сброс при отсоединении / повторном подключении или перезапуске сервера?
2. Да, если вы перезапустите окно, оно будет сброшено
3. Извините, но я не уверен, что понимаю, что вы имеете в виду, перезапуская окно. Перезапуск сервера?
4. Неплохо. Я начал отвечать «нет» на это, так что это полезная информация.
5. Спасибо, это сэкономило мне несколько часов
Ответ №2:
В Oracle вы можете использовать ASH (журнал активных сеансов) для поиска информации о используемом SQL. Вы также можете выполнить тесты покрытия кода с помощью иерархического профилировщика, где вы можете определить, какие части хранимых процедур используются, а какие нет.
Если вас интересуют обновления табличных данных, вы также можете использовать DBA_TAB_MODIFICATIONS. Это показывает, сколько вставок, обновлений, удалений выполнено в таблице или табличном разделе. Как только генерируется статистика нового объекта, строка для указанной таблицы удаляется из DBA_TAB_MODIFICATIONS. Здесь вам все еще нужна помощь, поскольку вы также можете заглянуть в историю статистики таблицы. Это ничего не показывает о таблицах, к которым только запрашиваются. Если вам действительно нужно знать об этом, вы должны использовать ASH.
Обратите внимание, что как для доступа к ASH, так и для доступа к истории статистики вам нужна лицензия diagnostics или tuning pack. (обычно вы бы хотели этого в любом случае).
Ответ №3:
Если вы используете триггер, вы можете обнаружить вставку обновления или удаление в таблице.
Доступ к ним значительно сложнее.
Ответ №4:
Я использую комбинацию статического анализа в метаданных для определения таблиц / столбцов, которые не имеют зависимостей, и трассировок времени выполнения в SQL Server, чтобы увидеть, какая активность происходит.
Комментарии:
1. Можете ли вы таким образом получить точную информацию о зависимости между базами данных?
2. @JNK Нет — вы ограничены границами базы данных. То же, что и для любого «клиентского» кода. Только трассировки могут действительно сказать вам, может ли быть предпринята какая-либо попытка.
3. Для SQL Server 2008
sys.sql_expression_dependencies
есть столбцы для имен базы данных и серверов, на которые ссылаются ссылки.
Ответ №5:
Еще несколько запросов, которые могут быть вам полезны.
select * from sys.dm_db_index_usage_stats
select * from sys.dm_db_index_operational_stats(db_id(),NULL,NULL,NULL)
select * from sys.sql_expression_dependencies /*SQL Server 2008 only*/
Разница между первыми двумя отчетами DMV хорошо объяснена в этом сообщении в блоге.
Ответ №6:
Инструмент с открытым исходным кодом Эда Эллиотта, SQL Cover, является хорошим выбором и имеет встроенную поддержку популярного инструмента модульного тестирования tSQLt.