multi column count(distinct) 한번만 읽고 처리하기
IF OBJECT_ID ('TBLA') IS NOT NULL
DROP TABLE DBO.TBLA;
GO
CREATE TABLE DBO.TBLA (COL1 INT, COL2 INT, COL3 INT);
GO
INSERT DBO.TBLA
SELECT TOP 100000 A.ID, B.ID, C.ID
FROM SYS.SYSOBJECTS A, SYS.SYSOBJECTS B , SYS.SYSOBJECTS C
GO
SELECT COUNT(DISTINCT COL1), COUNT(DISTINCT COL2)
FROM DBO.TBLA
GO
SELECT COUNT(C1), COUNT(C2)
FROM (
SELECT DISTINCT
CASE WHEN CP=1 THEN COL1 ELSE NULL END C1
, CASE WHEN CP=2 THEN COL2 ELSE NULL END C2
FROM DBO.TBLA
INNER LOOP JOIN (SELECT 1 'CP' UNION ALL SELECT 2) B
ON 1=1
) A
OPTION (QUERYTRACEON 8649)
우린 cpu 가 남아 돌구요 i/o 는 영 비리 비리 해서........꼭 한번만 읽어서 처리하고 싶어요...
그러나 sql server 는 멀티컬럼 count(distinct) 는 spool 없이 처리하지 못합니다. spool 이 생기면 serial 처리가 되고....
이런게 가능은 하지만 worktable 을 만들어 씀 (ssd 에 있다고 하고,,,, ㅋㅋㅋ) 혹은 ram disk?
실제 데이터가 엄청 크고, count(distinct a), count(distinct a) 의 종류가 많지 않을때는 아래 쿼리가 훨씬 유리해 보인다.
select COUNT(col1), COUNT(col2)
from (
select col1, col2
from dbo.tbla
group by grouping sets ((col1), (col2))
) a
go
그러나, 각각의 컬럼에 인덱스가 있다면, 쌈빡하게 품.....그건
SELECT COUNT(DISTINCT COL1), COUNT(DISTINCT COL2)
FROM DBO.TBLA
이거나 마찬가지