如何运行SQL Server查询,这将使其他查询运行得更慢



这听起来像是一个黑客问题,但有没有一个查询可以在SQL Server中运行,它会占用CPU时间,使其他查询运行得更慢?

我之所以这么问,是因为我试图重现生产中发生的超时错误。在Dev环境中,SQL Server从来不会给出这样的超时错误,所以我正在寻找一种方法来降低SQL Server的速度,使用一些只会占用CPU时间的查询。

我已经尝试在连接字符串中设置Timeout=1,但仍然没有引发异常。

您可以使用tally函数在大序列之间进行行乘和汇总,它会将cpu固定在100%。如果你想让它运行更长时间,加一些零。

理货功能

CREATE FUNCTION [dbo].[fnTally]
/**********************************************************************************************************************
Jeff Moden Script on SSC: https://www.sqlservercentral.com/scripts/create-a-tally-function-fntally
**********************************************************************************************************************/
(@ZeroOrOne BIT, @MaxN BIGINT)
RETURNS TABLE WITH SCHEMABINDING AS 
RETURN WITH
H2(N) AS ( SELECT 1 
FROM (VALUES
(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
)V(N))            --16^2 or 256 rows
, H4(N) AS (SELECT 1 FROM H2 a, H2 b) --16^4 or 65,536 rows
, H8(N) AS (SELECT 1 FROM H4 a, H4 b) --16^8 or 4,294,967,296 rows
SELECT N = 0 WHERE @ZeroOrOne = 0 UNION ALL
SELECT TOP(@MaxN)
N = ROW_NUMBER() OVER (ORDER BY N)
FROM H8
;

查询

/* 4 seconds -- Standard S2 @50 DTU */
with big_cte as(
select
n1.n,
count(*) n2_count
from 
dbo.fntally(1, 10000000) n1
cross join
dbo.fntally(1, 10000000) n2
group by
n1.n)
select count(*) from big_cte;
/* 47 seconds -- Standard S2 @50 DTU */
with big_cte as(
select
n1.n,
count(*) n2_count
from 
dbo.fntally(1, 100000000) n1
cross join
dbo.fntally(1, 100000000) n2
group by
n1.n)
select count(*) from big_cte;

查询速度很慢@史蒂文的回答很好,肯定会成功的。15分钟前,我写了一篇关于下面代码的文章,所以我忍不住了。这一查询将比听说的肥胖、年老、3条腿的乌龟穿过由融化的棉花糖做成的宽阔街道要慢。它还将导致查询内并行性死锁,破坏每个人的乐趣。你需要一份dbo。NGrams2B(地球上最快的VARCHAR(MAX(N-Grams函数,但不是今天。(

DECLARE @Match VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),150000),
@Junk1 VARCHAR(MAX) = REPLICATE(CAST('Z' AS VARCHAR(MAX)),10000011),
@Junk2 VARCHAR(MAX) = REPLICATE(CAST('#' AS VARCHAR(MAX)),2000000000);
DECLARE @SearchText VARCHAR(MAX) = @Match,
@SomeString VARCHAR(MAX) = @Junk1+@Match+@Junk2;
SELECT ItemIndex = ISNULL(MAX(f.ItemIndex),0)
FROM
(
-- Returns the first position of @SearchText
SELECT TOP(1) ng.Position
FROM     dbo.ngrams(@SomeString,LEN(@SearchText)) AS ng
WHERE    ng.Token = @SearchText
ORDER BY ng.Position
) AS f(ItemIndex)
OPTION (QUERYTRACEON 8649);

祝你好运,我的朋友!

最新更新