我们企业的数据库已有20多年的历史,并且充满了垃圾,因此我们计划开始删除表和存储过程。问题在于我们不完全知道哪些未使用,因此我们考虑进行研究以发现它们。
我尝试了this answer's solution,但是我认为返回的查询数是系统缓存中的查询数。
我对如何执行操作有一个想法,但我不知道是否可行: -创建一个包含三列的系统表:存储过程名称,执行次数和上次调用日期 -棘手的部分:每次执行存储过程时,都要执行查询以插入/更新该表。
为避免不得不修改我们所有的存储过程(这些存储过程很容易超过600个),我想到了添加数据库触发器,但事实证明,只能将它们链接到表,而不是存储过程。
我的问题是,调用ANY存储过程时,有什么方法可以预执行查询?
编辑:我们的数据库是一个SQL Server
答案 0 :(得分:1)
我知道我是在不久前问这个问题的,但是我会把发现的内容发布出来,以便任何偶然发现它的人都可以使用它。
提出问题时,我的目标是检索所有存储过程的执行次数,以摆脱未使用的存储过程。
虽然这并不完美,因为它没有显示上次执行的日期,但是我发现了这个查询,该查询检索所有数据库上的所有存储过程,并显示自创建以来执行的次数:>
SELECT
Db_name(st.dbid) [Base de Datos],
Object_schema_name(st.objectid, dbid) [Schema],
Object_name(st.objectid, dbid) [USP],
Max(cp.usecounts) [Total Ejecuciones]
FROM
sys.dm_exec_cached_plans cp
CROSS apply sys.Dm_exec_sql_text(cp.plan_handle) st
WHERE
Db_name(st.dbid) IS NOT NULL
AND cp.objtype = 'proc'
GROUP BY
cp.plan_handle,
Db_name(st.dbid),
Object_schema_name(objectid, st.dbid),
Object_name(objectid, st.dbid)
ORDER BY
Max(cp.usecounts)
我在this webpage上找到了这个脚本(它是西班牙语)。它还具有2个有关相似主题的有用脚本。
答案 1 :(得分:0)
我使用了这个脚本(后来得到了改进)
要遍历所有对象并找到不再有效的对象。
如果您愿意,我会发布增强的版本,该版本可以修复一些问题。
然后创建一个新架构(我称为我的recycle
)并将那些无效的对象移到其中。
现在再次运行。
您可能最终将一大堆非功能对象移出