2012-06-30 3 views
20

이상하게 들리지만 나는 SQL 쿼리 속도를 늦춰야합니다. 현재 AdventureWorks 데이터베이스가있는 사내 개발 서버에서 Microsoft SQL Server 2008 R2를 사용하고 있습니다. 일부 코드를 테스트하는 중입니다. 실행중인 쿼리가 너무 빨라요.SQL 쿼리를 느리게하는 방법?

기본적으로 필자는 컷 - 오프 피쳐를 테스트 중이며 완료되기 전에 잘라낼 수있는 충분한 쿼리가 필요합니다.

불행히도 로컬 설치이므로 실제로 좋은 데이터를 제공하기 위해 AdventureWorks 데이터베이스에 단일 쿼리 또는 충분한 크기의 테이블이 없습니다. 난 그냥 일하고 있는지 확인하기 위해 테스트 할 좋은 일

WAITFOR DELAY '01:00' 

을 시도했지만, 지금은 내가 데이터가 중반을 읽기 오프 스트리밍 줄일 수 있는지 확인하기 위해 테스트해야합니다. WAITFOR 문은 서버에서 데이터를 다시 검색하는 데 필요하기 때문에 그 점에서 저를 정의하지 않습니다. 첫 번째 직관은 회귀 계산을 사용하여 속도를 줄이는 것이었지만 SQL 서버가 쿼리의 모든 수치 값을 37 배로 늘리더라도 쿼리가 밀리 초 단위로 느려졌습니다. 두 번째로 시도한 것은 WAITFOR 문을 하위 쿼리에 포함시키는 것이었지만 그렇게 할 수없는 것으로 보입니다. 마지막으로, 시도하지 않은 유일한 방법은 복수 저장 프로 시저를 실행하고 그 사이에 WAITFOR을 넣는 것입니다.하지만 필요한 것이 작동하지 않을 것이라고 생각합니다.

나는 당신이 서버에 가까이있을 때 절대적으로 끔찍한 쿼리를 작성하는 것이 얼마나 힘든지 감명 받았다.

쿼리 속도를 늦출 수있는 방법이 있습니까?

감사합니다.

+3

해시/병합을 사용해야하는 경우 LOOP JOIN을 사용하도록 정상적으로 좋은 쿼리를 강제로 끄거나 작성하십시오. –

+2

몇 가지 자체 교차 조인을 사용하면 멋지게 느려질 것입니다 ... 결과 세트가 크면 IO가 병목 현상이됩니다. – Oded

답변

26

크로스 조인 작업 만 수행하면됩니다.

SELECT T1.* 
FROM SomeTable T1, 
    SomeTable T2, 
    SomeTable T3, 
    SomeTable T4 

천천히 충분히 느려야하는 1,000 억 개의 행을 생성하는 1,000 개의 행 테이블의 경우.

+2

진실은 두 가지 해결책 (당신과 케빈)이 훌륭하게 작동했다는 것입니다. 이 하나는 I/O 병목 현상을 일으키고 프로그램에서 몇 가지 예외를 던졌습니다. 그래서 그것은 내 코드에서 몇 가지 버그를 끌어내는 데 도움이되었습니다. 그것은 하하이었던 30 초 미만의 아래에서 2,000,000의 줄에 가깝게 생성했다.당신에게 두 가지 포인트를 모두 수여 할 수 있다면이 솔루션을 사용하여 끝났으므로 수표를드립니다. –

14
DECLARE @EndTime DATETIME; 
SET @EndTime = DATEADD(s, 5, GETDATE()); -- Set your delay here 

WHILE @EndTime > GETDATE() 
    SELECT 'Test Result'; -- Add your desired query here 

편집

또 다른 옵션을 재귀 사용 :

GETDATE()에 대한 UDF 랩퍼를 작성 그래서 새로운 날짜 값은 결과의 각 행에 대해 계산됩니다 :

CREATE FUNCTION dbo.GetExactDate() 
RETURNS DATETIME  
AS 
BEGIN 
    RETURN GETDATE(); 
END 

그리고 나서 cte를 사용하십시오

DECLARE @EndTime DATETIME; 
SET @EndTime = DATEADD(s, 5, GETDATE()); -- Set your delay here 

WITH cte AS (
    SELECT dbo.GetExactDate() Value 
    UNION ALL 
    SELECT dbo.GetExactDate() 
    FROM cte 
    WHERE Value < @EndTime 
) 
SELECT Value 
FROM cte 
OPTION (MAXRECURSION 0); 

이는 첫 번째 솔루션과 같이 하나의 쿼리에서 결과를 반환하는 반면 쿼리가 결과를 계속 반환하도록 할 시간을 설정할 수 있다는 이점이 있습니다.

관련 문제