如何查看SQL Server某个存储过程的执行历史【转】

SELECT TOP 100 db_name(d.database_id) as DBName,
    s.name as 存储名称,
    s.type_desc as 存储类型,
    d.cached_time as SP添加到缓存的时间,
    d.last_execution_time as 上次执行SP的时间,
    d.last_elapsed_time as [上次执行SP所用的时间(微妙)],
    d.total_elapsed_time as [完成此SP的执行所用的总时间(微妙)],
    d.total_elapsed_time/d.execution_count as [平均执行时间(微妙)],
    d.execution_count as 自上次编译以来所执行的次数
FROM SYS.procedures S JOIN SYS.dm_exec_procedure_stats D
    ON S.object_id=D.object_id
WHERE S.NAME='SP_Name'
ORDER BY D.total_elapsed_time/D.execution_count DESC

 

转载于:https://www.cnblogs.com/qiangshu/p/10301714.html

<think>嗯,用户现在问的是如何在SQL中定时执行存储过程。这看起来像是他们需要自动化某个数据库任务,比如每天生成报表,或者定期清理数据之类的。首先,我需要确定用户使用的数据库类型,因为不同的数据库系统有不同的定时任务机制。比如,SQL ServerSQL Server Agent,MySQL有事件调度器,PostgreSQL有pgAgent或者cron jobs,而Oracle则有DBMS_SCHEDULER。不过用户的问题里只提到了“SQL”,这可能是一个泛指,但通常情况下,如果用户没有具体说明,可能需要先默认回答主流的数据库系统,比如SQL Server和MySQL的情况,然后提醒用户根据具体数据库调整。 接下来,我需要考虑用户可能的背景。他们可能是数据库管理员,或者开发人员,需要设置定时任务来执行存储过程。如果是新手,可能需要详细的步骤说明;如果是更有经验的用户,可能只需要关键点。但无论如何,回答需要结构清晰,分步骤说明,确保用户能够按照步骤操作。 然后,我需要确保回答覆盖主要的数据库系统。比如,对于SQL Server,使用SQL Server Agent创建作业,添加步骤调用存储过程,然后设置计划。对于MySQL,需要检查事件调度器是否启用,然后创建事件。PostgreSQL可以通过pgAgent或者结合外部工具如cron,而Oracle则使用DBMS_SCHEDULER包。此外,云数据库如AWS RDS或Azure SQL可能有自己的机制,比如Azure的逻辑应用或者AWS的CloudWatch事件触发Lambda函数,再调用存储过程。 同时,还要注意权限问题。比如,在SQL Server中,执行作业需要相应的代理权限;在MySQL中,事件需要EVENT权限。用户可能遇到权限不足的问题,所以需要提醒他们检查权限设置。 另外,用户可能需要知道如何验证定时任务是否生效,比如查看作业历史记录,或者手动测试存储过程是否被正确调用。此外,错误处理也是一个重点,比如作业失败时的通知机制,或者日志记录。 还有,用户可能关心如何修改或删除已有的定时任务,所以在回答中可以简要提到如何管理已有的作业或事件,比如修改计划时间,禁用任务,或者删除不再需要的任务。 最后,需要总结不同数据库的方法,并给出选择建议,比如根据使用的数据库类型选择合适的工具,或者考虑云服务提供的解决方案。同时提醒用户注意安全性,确保存储过程本身的安全,以及定时任务不会导致性能问题。</think>在 SQL 中定时执行存储过程通常依赖数据库管理系统(DBMS)的**任务调度功能**。以下是主流数据库的实现方法及步骤: --- ### **一、SQL Server:使用 SQL Server Agent** 1. **启用 SQL Server Agent 服务** - 确保 SQL Server Agent 服务处于运行状态(Windows 服务或 SSMS 中启动)。 2. **创建作业(Job)** ```sql USE msdb; GO EXEC dbo.sp_add_job @job_name = 'Daily_Report_Job', @enabled = 1; ``` 3. **添加作业步骤(调用存储过程)** ```sql EXEC sp_add_jobstep @job_name = 'Daily_Report_Job', @step_name = 'Run_StoredProc', @subsystem = 'TSQL', @command = 'EXEC YourDatabase.dbo.YourStoredProcedure;'; ``` 4. **设置调度计划** ```sql EXEC sp_add_schedule @schedule_name = 'Daily_3AM', @freq_type = 4, -- 每天执行 @active_start_time = 030000; -- 3:00:00 AM EXEC sp_attach_schedule @job_name = 'Daily_Report_Job', @schedule_name = 'Daily_3AM'; ``` 5. **启动作业** ```sql EXEC sp_add_jobserver @job_name = 'Daily_Report_Job', @server_name = @@SERVERNAME; ``` --- ### **二、MySQL:使用事件调度器(Event Scheduler)** 1. **开启事件调度器** ```sql SET GLOBAL event_scheduler = ON; -- 临时生效 -- 永久生效需在 my.cnf 中添加 event_scheduler=ON ``` 2. **创建定时事件** ```sql CREATE EVENT Daily_Cleanup_Event ON SCHEDULE EVERY 1 DAY STARTS '2024-01-01 02:00:00' DO CALL YourStoredProcedure(); ``` 3. **验证事件状态** ```sql SHOW EVENTS FROM YourDatabase; ``` --- ### **三、PostgreSQL:使用 pgAgent 或 cron** **方法1:pgAgent(图形化工具)** - 安装 pgAdmin 并配置 pgAgent - 创建作业步骤:选择 "SQL" 类型并填写 `CALL YourStoredProcedure();` - 设置调度规则(如每天执行)。 **方法2:Linux cron 任务** ```bash # 编辑 crontab crontab -e # 添加如下行(每天3点执行) 0 3 * * * psql -U username -d dbname -c "CALL YourStoredProcedure();" ``` --- ### **四、Oracle:使用 DBMS_SCHEDULER** ```sql BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'Nightly_Job', job_type => 'STORED_PROCEDURE', job_action => 'YourSchema.YourStoredProcedure', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=DAILY; BYHOUR=2', enabled => TRUE ); END; / ``` --- ### **五、云数据库(如 AWS RDS/Azure SQL)** - **AWS RDS**:结合 AWS Lambda + CloudWatch Events 触发存储过程。 - **Azure SQL**:使用 Elastic Jobs 或 Azure Logic Apps 定时调用。 --- ### **关键注意事项** 1. **权限要求** - SQL Server:需具有 `SQLAgentUserRole` 权限。 - MySQL:需 `EVENT` 权限。 - Oracle:需 `CREATE JOB` 权限。 2. **日志与监控** - SQL Server查看 `msdb.dbo.sysjobhistory` 表。 - MySQL:检查 `information_schema.EVENTS`。 - 通用方法:记录存储过程内添加日志表写入操作。 3. **错误处理** - 在作业步骤中添加失败重试机制。 - 配置邮件/短信通知(如 SQL Server数据库邮件功能)。 --- ### **总结** - **企业级场景**:优先使用数据库原生工具(如 SQL Server Agent、Oracle Scheduler)。 - **云环境**:结合云平台的事件驱动服务(如 AWS CloudWatch)。 - **简单需求**:cron + 命令行(适合 PostgreSQL/MySQL)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值