database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 4929 게시물 읽기
No. 4929
스풀이 동작하지 않도록 할려면 어떻게 해야 할까요?
작성자
이동욱
작성일
2009-06-01 16:30
조회수
6,171

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
이 글에 대한 댓글이 총 2건 있습니다.

질문은 각 데이터베이스 게시판의 Q/A 에 해주세요.

윗글은 MS-SQL 게시판으로 이동합니다
유형목(엠브리오)님이 2009-06-01 19:12에 작성한 댓글입니다.

해결했습니다.

cross apply 를 사용해서 처리하면 되는군요.

이동욱님이 2009-06-12 14:53에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
4966필드 추가시 에러가 나는데 무엇이 문제인가요?
초보
2009-06-10
5940
4941php에서 xml 내용 가져와서 저장하기 [1]
초보
2009-06-07
5837
4936뒤에 공백까지 문자열 길이를 알수 있는 방법이 있을까요? [3]
인크레더블
2009-06-02
6878
4929스풀이 동작하지 않도록 할려면 어떻게 해야 할까요? [2]
이동욱
2009-06-01
6171
4862- mssql 2008 고수님 - [1]
최원호
2009-05-30
7103
4859커서에서 질문드립니다.
석별
2009-05-29
6103
4857select시 datediff로 시간차이를 구하고싶은데요.. [2]
클래어
2009-05-29
7432
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다