我想伪造一个长时间运行的 SQL 语句,这样我就可以试验sys.dm_exec_requests
“假”不是描述它的最佳方式,但有人对选择自动生成的记录有什么好的建议吗?也许使用 CTE?
我想伪造一个长时间运行的 SQL 语句,这样我就可以试验sys.dm_exec_requests
“假”不是描述它的最佳方式,但有人对选择自动生成的记录有什么好的建议吗?也许使用 CTE?
这是一个长时间运行的 SQL 语句:
WAITFOR DELAY '0:05';
执行大约需要五分钟。
在一个查询窗口中,执行以下操作:
BEGIN TRANSACTION
SELECT * from TableY with (XLOCK)
然后,在另一个窗口中,执行任何尝试访问TableY
. 它会一直运行,直到您关闭第一个窗口或在其中执行ROLLBACK
or COMMIT
。
(*) 假设您没有NOLOCK
向TableY
.
就在我写“CTE”的时候……它让我思考。稍后快速搜索并在 http://smehrozalam.wordpress.com/2009/06/09/t-sql-using-common-table-expressions-cte-to-generate-sequences/上进行变体
--define start and end limits
Declare @start bigint, @end bigint
Select @start=1, @end=99999
;With NumberSequence( Number ) as
(
Select @start as Number
union all
Select Number + 1
from NumberSequence
where Number < @end
)
--select result
Select * From NumberSequence Option (MaxRecursion 0)
我真的很喜欢 Alex KeySmith 的 CTE 答案https://stackoverflow.com/a/14138219/318411,因为您可以将其应用于您自己的查询;这意味着您可以以长时间运行的形式返回有效数据。
因此,例如,如果您有一个包含几行的测试表,但您想快速了解应用程序代码在处理大型结果集时的表现,您可以执行以下操作:
declare @i int, @c int
select @i = 1, @c = 10;
with X as (
select @i as N union all select N + 1 from x where N < @c
)
select
T.*
from
X,
(
select
*
from
MySmallTestTable
) AS T
option (MaxRecursion 0)
这将重复测试数据@c
时间。
我也用它来测试查询取消代码。