回答

收藏

顺序或并行启动存储过程

技术问答 技术问答 231 人阅读 | 0 人回复 | 2023-09-14

我们有一个每晚运行的存储过程,然后又启动了许多其他过程。从逻辑上讲,其中一些过程可以与其他一些过程并行运行。
% O( @, n0 V7 q" J: i3 L% e如何向SQL Server指示某个过程应并行还是串行运行-即:从异步启动还是阻塞启动?
8 b4 x# {$ a! g# z6 D& q1 Y2 Z并行运行它们的含义是什么,请记住,我已经确定进程将不会竞争表访问或锁定-只会竞争磁盘io和内存。在大多数情况下,他们甚至不使用相同的表。; O; ^* ~8 D" `% p
如果其中一些过程是 同一 过程,只是参数不同,这有关系吗?
: s2 }5 q/ C' l4 l. k如果我异步启动一对或过程,SQL Server中是否有一个好的系统来等待它们都完成,或者我是否需要让它们中的每个都在某个地方设置一个标志并定期使用来检查和轮询该标志WAITFOR DELAY?$ ~; z$ K; o# |; l; P" n! J
) h) v1 Q# r. m/ n- a8 n: s
目前,我们仍在使用SQL Server 2000。
8 K% Y4 y4 B9 j( }. W; l' G# d- y' h附带说明一下,这很重要,因为响应从大型机系统到服务器的数据转储完成,开始了主过程。大型机转储每个晚上大约需要2个小时,而我们对此无能为力。因此,我们一直在努力寻找减少处理时间的方法。) k9 f, i9 V+ k% S; h
               
; T% Z) |# C- V& y5 o; ~# s( `! l; N解决方案:+ }) ^' V5 R6 j% O
               
, B& f9 g0 S" j" X2 d+ n- v% i4 C2 i/ q9 E
9 ?* _- }( u; ?' G
                我最近必须对此进行研究,因此找到了这个古老的问题,希望获得更完整的答案。只是为了完全明确: TSQL确实 不 (本身)$ Z; r& q1 j6 A( {& ?
具有异步启动其他TSQL操作的能力- @& ?# O; s  P7 t* \9 U/ Y
这并不意味着您仍然没有很多选择(在其他答案中提到了其中一些):/ D8 F; a% c% b: d* s8 k
自定义应用程序 :使用异步方法,以您选择的语言编写一个简单的自定义应用程序。在每个应用程序线程上调用一个SQL存储的proc。+ c- R0 I$ ~/ R3 N0 A/ n8 W
SQL Agent作业 :创建多个SQL作业,然后使用从您的proc中异步启动它们sp_start_job。您可以xp_sqlagent_enum_jobs按照Gregory A. Larsen的这篇出色文章中的说明检查它们是否还使用了未记录的功能 。(或者让工作本身按照Chris的建议更新您自己的JOB_PROGRESS表。)您实际上必须为预期运行的每个并行进程创建单独的工作,即使它们正在运行具有不同参数的相同存储过程。8 ?, j! r; ~4 J6 B+ r7 H
OLE自动化 :使用sp_oacreate并sp_oamethod推出一个新的进程调用其他存储过程中的说明本文由格雷戈里A.拉尔森也。* p) j- k" b% {% L# v" g; X
DTS包 :使用简单的分支任务流创建DTS或SSIS包。DTS将在单个spid中启动任务。 7 G* L& r. s) l4 l) b. H! |
Service Broker :如果您使用的是SQL2005 +,请考虑使用Service Broker
( M4 C1 d' u- E! J) M, lCLR并行执行 :使用CLR命令Parallel_AddSql,Parallel_Execute如Alan Kaplan在本文中所述(仅适用于SQL2005 +)。
9 Z  n# q1 l  N! a+ j  t预定的Windows任务 :出于完整性考虑列出,但我不喜欢此选项。
& I) ]) V* [7 k& l, r- x( T
9 o, Y* P+ E9 _/ a- d# q
我在Service Broker或CLR方面经验不足,因此无法评论这些选项。如果是我,可能会在较简单的场景中使用多个Job,而在较复杂的场景中使用DTS /5 c( I- `" J% Q
SSIS包。) O9 ~3 g1 ~1 m
最后一条评论" f, a+ i: ?0 g- P' a& N2 \
:SQL已经尝试在可能的情况下并行化各个操作*。这意味着不能同时运行两个任务,而不能同时运行两个任务,这不能保证它会更快地完成。仔细测试以查看它是否真的可以改善任何东西。
9 X& X2 I5 ?/ T3 h我们有一个开发人员创建了一个DTS包,以同时运行8个任务。不幸的是,它只是一个4-CPU服务器
: o" {1 _, C# k( K7 q$ V- E5 E1 A*假设为默认设置。可以通过更改服务器的“最大并行度”或“相似性掩码”或使用MAXDOP查询提示来修改此属性。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则