MS SQL을 사용하고 있으며 동일한 기준으로 다른 기준으로 여러 쿼리를 실행해야합니다. 처음에는 원래 테이블에서 각 쿼리를 실행했지만 모두 일부 필터링 (예 : 날짜, 상태)을 공유합니다. 시간이 많이 걸렸습니다 (약 2 분).
데이터 행에 중복이 있으며 모든 인덱스가 비 클러스터형입니다. 내 기준으로 4 열에 만 관심이 있으며 결과는 모든 쿼리에 대해서만 카운트를 출력해야합니다.
열이 필요 : TABLE
, FIELD
, AFTER
, DATE
, 그리고 각각에 인덱스가 DATE
와가 TABLE
.
필요한 필드만으로 임시 테이블을 만든 후에는 1:40 분으로 줄어 들었지만 여전히 매우 나쁩니다.
CREATE TABLE #TEMP
(
TABLE VARCHAR(30) NULL,
FIELD VARCHAR(30) NULL,
AFTER VARCHAR(1000) NULL,
DATE DATETIME,
SORT_ID INT IDENTITY(1,1)
)
CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID)
INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE)
SELECT TABLE, FIELD, AFTER, DATE
FROM mytbl WITH (NOLOCK)
WHERE TABLE = 'OTB' AND
FIELD = 'STATUS'
Runnig this-> (216598 행 영향을 받음)
모든 검색어가 날짜 범위에 의존하는 것은 아니기 때문에 검색어에 포함시키지 않았습니다. 문제는 삽입하는 데 1 분 이상 걸리는 것 입니다. 위의 인서트는 1:19 분이 걸렸습니다.
여러 쿼리에 대해 이와 같은 것을 실행하고 싶습니다.
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
선택 항목보다 삽입에 문제가 있지만 임시 테이블은 원래 테이블보다 행 수가 적으므로 테이블을 여러 번 통과하는 것보다 낫습니다.
이것을 어떻게 최적화 할 수 있습니까?
편집하다
정렬 ID를 제거했지만 문제는 주로 선택이 아니라 삽입이라고 생각했습니다. 추측이었다.
고유 필드 또는 행이 없기 때문에 모든 인덱스에서 고유를 만들 수 없습니다.
SQL Server 2012를 사용하고 있습니다.
테이블 정보 : 힙이며 다음과 같은 공간 사용량이 있습니다.
name rows reserved data index_size unused
mytbl 24869658 9204568 KB 3017952 KB 5816232 KB 370384 KB
SELECT COUNT(*) AS COUNT FROM original_table WHERE AFTER = 'R' AND DATE >= '2014-01-01' AND DATE < '2015-01-01'
경우 각 쿼리를 개별적으로 최적화하려고하지 않습니까? 테이블에 인덱스를 추가 할 수 없습니까?
TABLE
및 FIELD
열을 제거 할 수 있습니다 #temp
(결국 모든 TABLE = 'OTB' AND FIELD = 'STATUS'
임시 테이블에 대해 모든 행이 있음 )
CREATE TABLE
문). 반대 투표는 그 질문이 명확하지 않았기 때문입니다.