데이터베이스 개발자 질문과 답변 게시판
안녕하세요
isnull 과 관련해서 질문이 있습니다.^^
sum(isnull(col1, 0)) 이런 구문과
isnull(sum(col1), 0) 이런 구문이 있을 때
결과는 같지만 성능상으로 차이가 있나요?
있다면 어떤 쿼리가 더 효율적인가요.
Comment 6
-
처리짱
2014.02.04 12:18
-
흑흑
2014.02.04 13:07
앗 그렇군요 감사합니다.
제대로 생각을 안했네요 ㅎ
-
맨즈밤
2014.02.04 16:15
CREATE TABLE T1 ( COL1 INT )
INSERT T1 VALUES (1)
INSERT T1 VALUES (1)
INSERT T1 VALUES (NULL)
INSERT T1 VALUES (NULL)
INSERT T1 VALUES (1)
INSERT T1 VALUES (1)
SELECT sum(isnull(col1, 0)) FROM T1
SELECT isnull(sum(col1), 0) FROM T1결과는 4로 같습니다.
sum(isnull(col1, 0)) 의 경우 연산과정에서 나오는 NULL을 모두 0으로 바꾸고 연산에 포합시킵니다. NULL이 많을수록 비용이 커지겠군요
isnull(sum(col1), 0) 는 NULL을 제외하고 SUM 연산을 한후에 그 결과값이 NULL일경우 0으로 바꿉니다. 결과값이 하나도 없을경우 ISNULL 연산이 한번 처리되겠지요.
결과적으로 전자의 경우가 비용이 더 큽니다.
-
흑흑
2014.02.05 09:20
아 그렇군요^^ 감사합니다.
-
이스트럭(강동운)
2014.02.05 01:09
안녕하세요. ^^
당근 한번만 비교하는 후자가 좋습니다 ^^ 하지만 이건 SUM 함수에만 해당되는 경우죠~! ^^
사실 NULL은 이런 SUM, AVG, COUNT 등 연산에 포함되지 않습니다. ISNULL로 가공한다면.. 상황은 달라지죠 ^^
drop table test
go
create table test(a int)
go
insert into test values(100)
insert into test values(100)
insert into test values(100)
insert into test values(100)
insert into test values(100)
insert into test values(100)
insert into test values(100)
insert into test values(100)
insert into test values(100)
insert into test values(null)
go
select avg(isnull(a, 0)), isnull(avg(a), 0), count(*), count(a), sum(a) from test
-
흑흑
2014.02.05 09:31
답변 감사합니다.
자신이 원하는 결과에 맞게 사용해야 겠네요
avg 경우 null을 포함한 평균을 낼지 포함하지 않은 평균을 낼지..
sum(isnull(col1, 0)) 요거는 NULL처리를 하고 더하닌깐 NULL 있어도 0으로 처리해서 더하는데
isnull(sum(col1), 0) 요거는 더하는 과정에서 NULL있으면 NULL로 떨어지니 0으로 값이 나올듯하네요.