Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Mayro Member Откуда: Сообщений: 3 |
Добрый день, Коллеги! Есть такой запрос (см. ниже), который показывает когда последний раз входили в базы (last_user_read), вносили изменения (last_user_update) и дату создания базы (db_create_date). Подскажите как изменить запрос чтобы он отображал только те базы, которые в названии содержат слово "accounting" и в которые не заходили более 5 дней? SELECT DB_NAME(db.database_id) DatabaseName, MAX(CASE WHEN ISNULL(s.last_user_seek, '1900-01-01') > ISNULL(s.last_user_scan, '1900-01-01') THEN CASE WHEN ISNULL(s.last_user_seek, '1900-01-01') > ISNULL(s.last_user_lookup, '1900-01-01') THEN s.last_user_seek ELSE s.last_user_lookup END ELSE CASE WHEN ISNULL(s.last_user_scan, '1900-01-01') > ISNULL(s.last_user_lookup, '1900-01-01') THEN s.last_user_scan ELSE s.last_user_lookup END END) AS last_user_read, MAX(last_user_update) AS last_user_update, db.create_date AS db_create_date FROM sys.databases db LEFT JOIN sys.dm_db_index_usage_stats AS s ON s.database_id = db.database_id GROUP BY DB_NAME(db.database_id), db.create_date ORDER BY last_user_read, last_user_update |
26 июл 19, 17:48 [21935652] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Трехэтажный кейс для получения максимального значения просто великолепен.SELECT DB_NAME(db.database_id) DatabaseName, max (last_user_read) as last_user_read, MAX(last_user_update) AS last_user_update, db.create_date AS db_create_date FROM sys.databases db LEFT JOIN sys.dm_db_index_usage_stats AS s ON s.database_id = db.database_id outer apply ( select last_user_read = max ( isnull (s.last_user_read, '19000101' ) ) from ( select s.last_user_seek union all select s.last_user_lookup union all select s.last_user_scan ) s ( last_user_read ) ) r GROUP BY DB_NAME(db.database_id), db.create_date having ( DB_NAME(db.database_id) like '%accounting%' and datediff ( dd, max (last_user_read), getdate() ) > 5 ) ORDER BY last_user_read, last_user_update |
26 июл 19, 18:50 [21935701] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
А, да, в sys.databases есть поле name, если что. |
26 июл 19, 18:51 [21935702] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8353 |
Гавриленко Сергей Алексеевич, old school :) Новое поколение выбирает values :) |
26 июл 19, 20:51 [21935767] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Владислав Колосов, У меня от скобок в глазах рябит :-/ |
26 июл 19, 23:07 [21935816] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8353 |
Гавриленко Сергей Алексеевич, В данном запросе, к счастью, всё довольно эстетично, но согласен, порой скобок много: SELECT DB_NAME(db.database_id) DatabaseName, max (last_user_read) as last_user_read, MAX(last_user_update) AS last_user_update, db.create_date AS db_create_date FROM sys.databases db LEFT JOIN sys.dm_db_index_usage_stats AS s ON s.database_id = db.database_id outer apply ( select last_user_read = max ( isnull (s.last_user_read, '19000101' ) ) from (values (s.last_user_seek), (s.last_user_lookup), (s.last_user_scan) ) s ( last_user_read ) ) r GROUP BY DB_NAME(db.database_id), db.create_date having ( /*DB_NAME(db.database_id) like '%accounting%' and*/ datediff ( dd, max (last_user_read), getdate() ) > 5 ) ORDER BY last_user_read, last_user_update |
26 июл 19, 23:19 [21935823] Ответить | Цитировать Сообщить модератору |
Mayro Member Откуда: Сообщений: 3 |
Гавриленко Сергей Алексеевич, Владислав Колосов, Большое спасибо за помощь! Скрипт работает! |
29 июл 19, 09:18 [21936584] Ответить | Цитировать Сообщить модератору |
Mayro Member Откуда: Сообщений: 3 |
Добрый день, Коллеги. Что-то скрипт поработал некоторое время и перестал, показывает что в базы никто не заходил, хотя это не так. Что это может быть? Откуда скрипт берёт информацию о последнем изменении базы? Все базы показывают "last_user_read 1900-01-01 00:00:00.000" "last_user_update NULL" |
14 ноя 19, 17:31 [22016468] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Mayro, После рестарта сервера/базы даты сбрасываются. |
14 ноя 19, 17:48 [22016485] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4805 |
Mayro, Может вот это вам полезней будет SELECT OBJECT_NAME(IX.OBJECT_ID) Table_Name ,IX.name AS Index_Name ,IX.type_desc Index_Type ,SUM(PS.[used_page_count]) * 8 IndexSizeKB ,IXUS.user_seeks AS NumOfSeeks ,IXUS.user_scans AS NumOfScans ,IXUS.user_lookups AS NumOfLookups ,IXUS.user_updates AS NumOfUpdates ,IXUS.last_user_seek AS LastSeek ,IXUS.last_user_scan AS LastScan ,IXUS.last_user_lookup AS LastLookup ,IXUS.last_user_update AS LastUpdate FROM sys.indexes IX INNER JOIN sys.dm_db_index_usage_stats IXUS ON IXUS.index_id = IX.index_id AND IXUS.OBJECT_ID = IX.OBJECT_ID INNER JOIN sys.dm_db_partition_stats PS on PS.object_id=IX.object_id WHERE OBJECTPROPERTY(IX.OBJECT_ID,'IsUserTable') = 1 GROUP BY OBJECT_NAME(IX.OBJECT_ID) ,IX.name ,IX.type_desc ,IXUS.user_seeks ,IXUS.user_scans ,IXUS.user_lookups,IXUS.user_updates ,IXUS.last_user_seek ,IXUS.last_user_scan ,IXUS.last_user_lookup ,IXUS.last_user_update |
15 ноя 19, 13:14 [22017109] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |