Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите доработать запрос MSSQL  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36926
Трехэтажный кейс для получения максимального значения просто великолепен.

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

Откуда: Moscow
Сообщений: 36926
А, да, в sys.databases есть поле name, если что.
26 июл 19, 18:51    [21935702]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7671
Гавриленко Сергей Алексеевич,

old school :) Новое поколение выбирает values :)
26 июл 19, 20:51    [21935767]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36926
Владислав Колосов,

У меня от скобок в глазах рябит :-/
26 июл 19, 23:07    [21935816]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7671
Гавриленко Сергей Алексеевич,

В данном запросе, к счастью, всё довольно эстетично, но согласен, порой скобок много:

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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Mayro
Member

Откуда:
Сообщений: 3
Гавриленко Сергей Алексеевич,
Владислав Колосов,

Большое спасибо за помощь! Скрипт работает!
29 июл 19, 09:18    [21936584]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Mayro
Member

Откуда:
Сообщений: 3
Добрый день, Коллеги.

Что-то скрипт поработал некоторое время и перестал, показывает что в базы никто не заходил, хотя это не так.
Что это может быть? Откуда скрипт берёт информацию о последнем изменении базы?
Все базы показывают "last_user_read 1900-01-01 00:00:00.000" "last_user_update NULL"
14 ноя 19, 17:31    [22016468]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36926
Mayro,

После рестарта сервера/базы даты сбрасываются.
14 ноя 19, 17:48    [22016485]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4684
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 Ответить