【问题标题】:How to run stored procedure 1000 times如何运行存储过程1000次
【发布时间】:2010-12-31 21:25:56
【问题描述】:

我有一个存储过程,我用它来填充一个包含大约 60 列的表。我已经生成了 1000 条如下所示的 exec 语句:

exec PopulateCVCSTAdvancement 174, 213, 1, 0, 7365
exec PopulateCVCSTAdvancement 174, 214, 1, 0, 7365
exec PopulateCVCSTAdvancement 175, 213, 0, 0, 7365

每次存储过程将插入 1 到 3,000 条记录(通常约为 2,000 条记录)。 “服务器”在服务器操作系统上运行具有 4 GB 可用内存的桌面硬件。我遇到的问题是,在前 10-15 次执行平均 1-2 秒后,接下来的 10-15 似乎永远不会完成。我这样做正确吗?我该怎么做?

谢谢! 前 10 名服务员:

LAZYWRITER_SLEEP
SQLTRACE_INCREMENTAL_FLUSH_SLEEP
REQUEST_FOR_DEADLOCK_SEARCH
XE_TIMER_EVENT
FT_IFTS_SCHEDULER_IDLE_WAIT
CHECKPOINT_QUEUE
LOGMGR_QUEUE
SLEEP_TASK
BROKER_TO_FLUSH
BROKER_TASK_STOP

【问题讨论】:

  • 你需要找出瓶颈是什么。 waitstats DMV 说什么?
  • 该表中有超过 400 行。有什么我应该发布的具体内容吗?
  • 其中的数字是累积的,因此将快照放入临时表中,然后执行生成长时间等待的操作,然后比较两者以查看哪些等待类型增加最多。 (或者如果您没有任何依赖它的监控工具,只需使用DBCC SQLPERF("sys.dm_os_wait_stats",CLEAR); 将 DMV 中的数字重置为 0)
  • 您添加的 DMV 详细信息是非常无信息的 TBH。您可以将值设置为 0,然后发布前 10 个等待和实际数字吗?

标签: sql-server stored-procedures sql-server-2008-r2


【解决方案1】:

随意的想法:

  1. 确保您的数据库大小足够大,可以排除自动增长。默认增长为 10%,您可能正在增长数据库。这适用于 MDF 和 LDF。

  2. 除了检查 LDF 大小之外,在加载期间也将恢复模式更改为 SIMPLE

  3. 您可能有参数嗅探。能否将optimise for unknown 提示添加到存储过程中

【讨论】:

  • 好建议。发现日志设置为 10% 的自动增长。现在检查其他人。
  • 已设置为简单。我还添加了重新编译到 sp。
【解决方案2】:

将其包装在事务中 - 加载速度会显着加快

【讨论】:

  • 同意,但我不明白为什么这可以解释突然的时差(除非检查点可能已经启动?)
  • (对 mysql 而言),在包装事务时,查询已完全构建并执行(尽可能优化)。
【解决方案3】:

原来原因是我的存储过程在使用某些参数运行时出现错误。

具体来说,我有一个 cte,我将它连接回另一个表,但是,来自 cte 的一些连接条件包含空值并导致它永远持续下去。 cte 选择标准中的一个简单的isnull() 解决了这个问题。感谢所有帮助。

附:将其包装在事务中后,它需要 4 分钟才能运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2016-04-27
    相关资源
    最近更新 更多