DB 는 SQL Server 2005 입니다.
데이터를 검색해서 결과를 시간 순서대로 정렬한 다음 100 개만 가져오면 됩니다.
Nested Loop 를 사용해서 일자별로 검색한 다음, 일자별로 내부 데이터를 정렬해서 결과집합에 추가할려고 합니다.
원래 검색 전략은 첫번째 쿼리문처럼 결과를 가져오는 것이고, 이를 단일 문자의 SQL 로 만들어놓은 것이 마지막 쿼리문입니다.
일자별로 검색하라고 쿼리문을 짜놓았더니, 이놈의 DB 가 지멋대로 변경을 하는 군요.
기간 검색을 한 다음에 결과를 스풀에 집어넣고, nested loop 를 돌 때마다 스풀에서 끄집어냅니다.
스풀에서 끄집어내지 않고, 일자별로 결과를 가져올려면 어떻게 해야 할까요? USE PLAN 으로 강제로 힌트를 줘도 실행계획이 변경되지는 않더군요.
/** 테이블 생성문입니다. */
CREATE TABLE [DateList](
[YMD] [char](8) NOT NULL,
PRIMARY KEY CLUSTERED
(
[YMD] ASC
)
) ON [PRIMARY]
CREATE TABLE [TelLog](
[IDX] [int] NOT NULL,
[YMD] [char](8) NULL,
[HMS] [char](6) NULL,
[TEL] [varchar](20) NULL,
PRIMARY KEY CLUSTERED
(
[IDX] ASC
)
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_TelLog_01] ON [TelLog]
(
[YMD] ASC,
[HMS] ASC,
[IDX] ASC
)
CREATE NONCLUSTERED INDEX [IX_TelLog_02] ON [TelLog]
(
[YMD] ASC,
[TEL] ASC
)
/** 쿼리문입니다. */
-- 커서 사용
DECLARE @date CHAR(8)
DECLARE @table TABLE ( YMD CHAR(8), HMS CHAR(6), IDX INT )
DECLARE @count INT
DECLARE c_fax CURSOR FOR
SELECT
YMD
FROM
DateList
WHERE
YMD BETWEEN '20070501' AND '20070531'
ORDER BY
YMD DESC
OPEN c_fax
SET @count = 0
WHILE 1=1
BEGIN
FETCH NEXT FROM c_fax INTO @date
IF @@FETCH_STATUS != 0
BREAK
INSERT INTO @table ( YMD, HMS, IDX )
SELECT TOP 100
YMD, HMS, IDX
FROM
TelLog WITH ( INDEX ( IX_TelLog_03, IX_TelLog_01 ) )
WHERE
YMD = @date
AND TEL LIKE '02331%'
ORDER BY
HMS DESC, IDX DESC
SET @count = @count + @@ROWCOUNT
IF @count >= 100
BREAK
END
CLOSE c_fax
DEALLOCATE c_fax
SELECT
YMD, HMS, IDX
FROM
@table
GO
-- 테이블 스풀 사용
SELECT TOP 100
B.YMD, B.HMS, B.IDX
FROM
DateList A
INNER LOOP JOIN TelLog B WITH ( INDEX ( IX_TelLog_02, IX_TelLog_01 ) ) ON A.YMD = B.YMD
WHERE
A.YMD BETWEEN '20070501' AND '20070531'
AND B.TEL LIKE '02331%'
ORDER BY
B.YMD DESC, B.HMS DESC, B.IDX DESC
OPTION ( FORCE ORDER )
GO |