Как запустить запрос SQL Server, который заставит другие запросы выполняться медленнее

#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. Нравится! Спасибо, Алан