У меня есть очень большая база данных с сотнями таблиц, и после многих, многих модернизаций продуктов, я уверен, что половина из них не используется больше. То, как я могу сказать, ли таблица, активно выбирается из? Я не могу только использовать Профилировщика - не, только делают я хочу смотреть в течение больше, чем нескольких дней, но также существуют тысячи хранимых процедур, и профилировщик не переведет вызовы SP в вызовы доступа таблицы.
Единственная вещь, о которой я могу думать, состоит в том, чтобы создать кластерный индекс на таблицах процентов и затем контролировать sys.dm_db_index_usage_stats
чтобы видеть, существуют ли, любой ищет или сканирует на кластерном индексе, подразумевая, что данные из таблицы были загружены. Однако добавление кластерного индекса на каждой таблице является плохой идеей (для всевозможных причин), поскольку не действительно выполнимо.
Есть ли другие опции, которые я имею? Я всегда хотел функцию как "ИЗБРАННЫЙ триггер", но существуют, вероятно, другие причины, почему SQL Server не имеет той функции также.
РЕШЕНИЕ:
Спасибо, Remus, для указания на меня в правильном направлении. Используя те столбцы, я создал следующий ВЫБОР, который делает точно, что я хочу.
WITH LastActivity (ObjectID, LastAction) AS
(
SELECT object_id AS TableName,
last_user_seek as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
UNION
SELECT object_id AS TableName,
last_user_scan as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
UNION
SELECT object_id AS TableName,
last_user_lookup as LastAction
FROM sys.dm_db_index_usage_stats u
WHERE database_id = db_id(db_name())
)
SELECT OBJECT_NAME(so.object_id) AS TableName,
MAX(la.LastAction) as LastSelect
FROM sys.objects so
LEFT
JOIN LastActivity la
on so.object_id = la.ObjectID
WHERE so.type = 'U'
AND so.object_id > 100
GROUP BY OBJECT_NAME(so.object_id)
ORDER BY OBJECT_NAME(so.object_id)
Посмотрите в sys.dm_db_index_usage_stats. В колонках last_user_xxx будет содержаться информация о том, когда к таблице в последний раз осуществлялся доступ из запросов пользователей. Эта таблица сбрасывает отслеживание после перезагрузки сервера, поэтому вы должны оставить ее запущенной на некоторое время, прежде чем полагаться на ее данные.
Сотрудниковое примечание: если ваша цель - бросить эти таблицы, вам, возможно, придется рассмотреть юридические обязательства, которые налагают его на вас, чтобы в любом случае задействовать данные в любом случае.
Re: Profiler, если вы мониторируете для SP: STMTCompleted , который будет зафиксировать все операторы, выполняемые в хранимой процедуре, так что это будет ловить доступ к таблице внутри SPROC. Если не все проходит через сохраненные процедуры, вам также может понадобиться SQL: STMTCompleted событие.
Будет большое количество событий, поэтому, вероятно, все еще не практично, чтобы проследить в течение длительного времени из-за размера следа. Однако вы можете применить фильтр - например, Где TextData содержит имя вашей таблицы, на которую вы хотите проверить. Вы можете дать список названий таблиц для фильтрации в любое время и постепенно работать через них. Таким образом, вы не должны получать никаких следовых событий, если ни один из этих таблиц не доступен.
Даже если вы чувствуете, что это не подходящий / жизнеспособный подход для вас, я думал, что стоит расширить.
Другое решение было бы сделать глобальный поиск вашего исходного кода, чтобы найти ссылки на таблицы. Вы можете запрашивать сохраненные определения процедуры, чтобы проверить на наличие совпадений для заданной таблицы, или просто создать полный сценарий базы данных и сделать находку на том, чтобы имена таблиц.
Я имел в виду поиграть с разрешениями пользователей для разных таблиц, но потом вспомнил, что вы можете включить трассировку с триггером ON LOGON, вам это может пригодиться:
CREATE OR REPLACE TRIGGER SYS.ON_LOGON_ALL
AFTER LOGON ON DATABASE
WHEN (
USER 'MAX'
)
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET SQL_TRACE TRUE';
--EXECUTE IMMEDIATE 'alter session set events ''10046 trace name context forever level 12''';
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
/
Тогда вы сможете проверять файлы трассировок.
Короче говоря: Для GUID, созданного в соответствии с опубликованными стандартами и спецификациями, просто не может произойти. GUID имеет структуру, и некоторые поля фактически имеют значение. Более того, .NET генерирует GUID версии 4, где это абсолютно невозможно. Они определяются путь, что такого GUID не будет. Подробнее см. ниже; -)
Существует от пяти до семи битов, которые являются основным препятствием здесь. Это идентификатор версии (первые четыре бита третьей части) и поле варианта , указывающее, какой это вариант GUID.
В настоящее время версия может быть любой между 1 и 5. Поэтому единственными допустимыми шестнадцатеричными цифрами, для которых мы можем получить такой GUID в данный момент, являются - очевидно - от 1 до 5.
Давайте немного рассмотрим версии :
8
, 9
, A
или B
. Это противоречит 4
для номера версии. Пока мы исключили версию 4 как невозможную, другие как крайне маловероятные. Рассмотрим поле варианта.
Поле variant указывает некоторые битовые узоры для обратной совместимости ( x
- не волнует ), а именно:
0 x x Reserved. NCS backward compatibility.
1 0 x The only pattern that currently can appear
1 1 0 Reserved, Microsoft Corporation backward compatibility
1 1 1 Reserved for future definition.
Поскольку этот образец находится в самом начале четвертой части, это означает, что для самой первой шестнадцатеричной цифры четвертой части всегда устанавливается старший бит. Это означает, что эта самая цифра никогда не может быть 1
, 2
, 3
или 5
. Конечно, не считая уже сгенерированных GUID. Но те, у кого MSB набора к 0
, бывают либо v1, либо v2. И временная метка части из них означает, что они должны быть сгенерированы несколько миллионов в будущем, чтобы это сработало.
$("#checkboxes").children("input:checked")
даст массив самих элементов. Если вам просто нужны имена:
$("#checkboxes").children("input:checked").map(function() {
return this.name;
});
-121--605840- Для SQL Server 2008 вы должны просмотреть Аудит SQL . Это позволяет выполнять аудит многих объектов, включая выбор в таблице и отчеты в файл или журнал событий.