尝试创建一个SQL查询,将所有CPU的最大值提高到100%

时间:2014-07-17 18:25:58

标签: sql sql-server sql-server-2008-r2 cpu-usage

作为压力测试的一部分,我正在努力弄清楚是否存在SQL查询(特别是SQL Server查询),它将使所有CPU使用率达到100%或足够接近。

建议任何人?

4 个答案:

答案 0 :(得分:3)

SELECT SUM(CONVERT(BIGINT, o1.object_id) + CONVERT(BIGINT, o2.object_id) + CONVERT(BIGINT, o3.object_id) + CONVERT(BIGINT, o4.object_id))
FROM sys.objects o1
CROSS JOIN sys.objects o2
CROSS JOIN sys.objects o3
CROSS JOIN sys.objects o4

这是一个并行版本:

USE master

SELECT MyInt = CONVERT(BIGINT, o1.object_id) + CONVERT(BIGINT, o2.object_id) + CONVERT(BIGINT, o3.object_id)
INTO #temp
FROM sys.objects o1
JOIN sys.objects o2 ON o1.object_id < o2.object_id
JOIN sys.objects o3 ON o1.object_id < o3.object_id

SELECT SUM(CONVERT(BIGINT, o1.MyInt) + CONVERT(BIGINT, o2.MyInt))
FROM #temp o1
JOIN #temp o2 ON o1.MyInt < o2.MyInt

由于某种原因,我无法让优化器并行化第一个查询。所以我只是实现了一些巨大的表(~400k行)并循环加入它们。

答案 1 :(得分:1)

我已经在How to analyse SQL Server performance详细讨论了为什么你的查询实际上从未“执行”:总是等待某事(IO,锁)。

要创建一个能够驱动100%CPU的工作负载,即使是在一个核心上,也不是一件容易的事。您需要确保您的查询始终执行,并且永远不会等待。永远不会阻塞IO(所有数据必须在内存中),永远不会阻塞锁(没有争用),永远不会阻塞内存(没有授权)。您应该将其视为热内存数据的扫描。实现这一目标的人为的,完全虚假的工作量可能会多次自行加入中型桌子。

现在,如果你想用现实的工作量来做这件事,包括各种操作,那么祝你好运。实现100%CPU基本上是基准的黄金标准。您需要超级高性能的IO子系统来消除所有等待,并且您需要非常精美的测试驱动程序才能足够快地提供工作负载,而不会产生争用。

答案 2 :(得分:1)

我认为保持CPU忙的更好方法是在所有编译器中使用POWER功能

DECLARE @T DATETIME, @F BIGINT;
SET @T = GETDATE();
WHILE DATEADD(SECOND,60,@T)>GETDATE()
SET @F=POWER(2,30);

您可以同时运行多个查询取决于您的CPU容量

请看下面的链接(原始文章)

https://blog.sqlauthority.com/2013/02/22/sql-server-t-sql-script-to-keep-cpu-busy

答案 3 :(得分:0)

这个想法来自usr,使它更通用一点,没有使用 SQL sever 特殊的东西,所以你可以将它用于任何类型的 DB/DM。也没有写,避免了I/O的影响。

首先需要选择一个大用途或系统表“table1”。 如果这个表有记录 N,下面的查询会产生 O(N^4) 的复杂度,优化器无法改进它。

with t1 as (select d1.f1 as i1, d2.f1 as i2, d3.f1 as i3, d3.f2 as f2
            from table1 d1
                     inner join table1 d2 on d1.f1 < d2.f1
                     inner join table1 d3 on d2.f1 < d3.f1
            order by f2
)
select avg(sin(o1.i1)) + avg(cos(o2.i1))
from t1 o1 join t1 o2 on o1.i1 < o2.i1