#sql-server #sql-server-2012
#sql-server #sql-server-2012
Вопрос:
Это будет звучать как вопрос хакера, но есть ли запрос, который я могу запустить в SQL Server, который будет потреблять процессорное время, чтобы другие запросы выполнялись медленнее?
Причина, по которой я спрашиваю, заключается в том, что я пытаюсь воспроизвести ошибку тайм-аута, которая возникает в процессе производства. В среде разработки SQL Server никогда не выдает такую ошибку тайм-аута, поэтому я ищу способ замедлить работу SQL Server с помощью некоторых запросов, которые ничего не делают, кроме как поглощают процессорное время.
Я попытался установить Timeout=1
в строке подключения, но исключение по-прежнему не выдается.
Комментарии:
1. вам нужно установить время ожидания в ADO.NET команда, а не строка подключения
2. @MitchWheat Тот, который указан в строке подключения, не применяется к соединению?
3. Значение в строке подключения указывает, сколько времени может пройти для установления соединения. Тайм-аут в команде указывает, как долго может выполняться команда.
4. @MitchWheat, большое вам спасибо, очень полезно.
Ответ №1:
Вы можете умножать строки и суммировать по большим последовательностям, используя функцию подсчета, и она будет привязывать процессор к 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;
Ответ №2:
Медленный запрос подходит прямо сейчас!. ответ @SteveC отличный и, безусловно, поможет. Я буквально закончил статью о коде ниже 15 минут назад, поэтому не смог удержаться. Этот запрос будет медленнее, чем слышал о толстых, старых, трехногих черепахах, пересекающих широкую улицу, сделанную из растопленного зефира. Это также приведет к взаимоблокировке внутри запроса параллелизма, что разрушает удовольствие для всех. Вам понадобится копия dbo.NGrams2B (самая быстрая функция VARCHAR (MAX) N-граммов на планете, но не сегодня.)
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);
Счастливого пути, мой друг!
Комментарии:
1. Нравится! Спасибо, Алан