COALESCE와 ISNULL의 성능 차이는 무엇입니까?


48

많은 사람들이 ISNULL 대신 COALESCE 함수를 사용하는 것을 보았습니다. 인터넷 검색에서 COALESCE가 ANSI 표준이라는 것을 알았으므로 사용할 때 기대할 수있는 이점이 있습니다. 그러나 ISNULL은 수행중인 작업이 더 분명해 보이기 때문에 더 읽기 쉽습니다.

또한 ISNULL은 다른 데이터베이스 서버와 다른 언어에서 다르게 작동하기 때문에 까다로울 수 있습니다.

내 생각에는이 모든 것이 스타일과 표준으로 요약된다. 해당 스타일이 주관적이므로 ISNULL보다 COALESCE를 사용하거나 그 반대의 이유가 있습니까? 특히, 다른 것보다 성능상의 이점이 있습니까?


1
하위 쿼리 COALESCE 가 두 번 평가
Martin Smith

4
"ISNULL은 무엇을하고 있는지 더 명확 해 보이기 때문에 더 읽기 쉬워 보입니다." 반 직관적이지 않은 이름을 발견했습니다. 표현식이 null인지 알 수 없는지 여부를 나타내는 부울을 반환 할 것으로 기대합니다. 이름 COALESCE은 단지 직관적이지 않습니다;)
어느 날

답변:



40
  • ISNULL은 Sybase / SQL Server에 따라 다릅니다
  • COALESCE는 휴대용

그때

  • ISNULL은 2 개의 인수를 사용합니다
  • COALESCE는 1-n 개의 인수를 사용합니다

마지막으로 재미있는 비트. 결과 데이터 유형 및 길이 / 정밀도 / 스케일

이 마지막 비트는 ISNULL이 더 예측 가능하기 때문에 일반적으로 사용되는 이유 (?)이며 COALESCE는 의도하지 않은 데이터 유형 변환을 추가 할 수 있습니다. "더 느린"비트는

DECLARE @len10 varchar(10); --leave it NULL
SELECT
    ISNULL(@len10, '0123456789ABCDEF'),     -- gives 0123456789
    COALESCE(@len10, '0123456789ABCDEF');   -- gives 0123456789ABCDEF

모든 데이터 유형이 동일하므로 실질적인 차이는 없습니다 ...


22

Mark가 지적했듯이 성능 차이를 찾기가 어려울 것입니다. 다른 요소가 더 중요하다고 생각합니다. 저에게는 항상 COALESCE를 사용하며이 중 대부분은 이미 귀 하나 Mark에 의해 언급되었습니다.

  • COALESCE는 ANSI 표준입니다. 내 코드를 이식 할 것인지 걱정할 필요가 없습니다. 개인적으로 이것은 중요하지 않습니다. 왜냐하면 그러한 포트가 실제로 Celko의 교실 밖에서 발생하는 빈도를 알고 있기 때문에 일부 사람들에게는 이것이 이점입니다.
  • 가독성에 대해 말한 것과는 달리 , ISNULL이 부울 (SQL Server에는 존재하지 않음)을 반환하는 다른 언어 또는 플랫폼에서 오는 사용자의 경우 ISNULL을 읽기 가 더 어려울 수 있습니다 . 물론, COALESCE는 철자가 더 어렵지만 적어도 잘못된 가정으로 이어지지는 않습니다.
  • COALESCE (a, b, c, d)라고 말할 수 있듯이 COALESCE는 훨씬 유연합니다 .ISNULL을 사용하면 동일한 작업을 수행하기 위해 많은 중첩을 수행해야합니다.

또한 데이터 유형 / 정밀도 등이 다른 데이터 유형을 사용하는 경우 두 기능을 사용하여 데이터 유형 우선 순위를 처리하는 방법을 알고 있어야합니다.

노트

한 가지 예외가 있습니다. 이들은 현재 버전의 SQL Server에서 다르게 처리됩니다.

SELECT COALESCE((SELECT some_aggregate_query),0); 

SELECT ISNULL((SELECT some_aggregate_query),0); 

COALESCE변형 실제로 실행한다 some_aggregate_query(검사 값을 한 번, 그리고 한번 리턴 할 때 제로가 아닌) 회 동안 ISNULL한번만 서브 쿼리를 실행한다. 나는 다른 몇 가지 차이점에 대해 이야기합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.