데이터베이스 개발자 Tip & 강좌

SQLER의 개발자들이 만들어가는 데이터베이스 사용자 Tip & 강좌 게시판입니다. SQL서버, Oracle, MySQL 등 여러 클라우드/오픈소스 기반 데이터베이스 개발 및 운영 관련 팁과 쿼리 노하우를 이곳에서 가장 먼저 접하실 수 있습니다. 많은 도움 되시길 바랍니다.

Azure SQL 도입된 새로운 집계 함수 APPROX_COUNT_DISTINCT

 

·         Version : Azure SQL

 

다양한 서비스를 운영하다보면 서비스에 따른 중요 포인트가 조금씩 다른 경우가 있다예를들어 정확한 숫자(결과값) 중요시하는 서비스(일일 매출재고량 ) 있으며빠른 응답을  (실시간 데이터 사용량, DB 전체 데이터 ROW  등의 대시보드 중요시하는 서비스가 있다물론 응답성을 중시한다고 해서 데이터가 틀리면 안되겠지만 허용되는 오차범위에서 최대한 빠른 응답이 필요할 때가 있다 이번 포스트에서는 매우  데이터 세트 전체에 대한 집계에 대해 빠른 응답을  수있는 Azure SQL APPROX_COUNT_DISTINCT 대해서 다루어 본다.

 

Azure SQL 새로운 집계함수인 APPROX_COUNT_DISTINCT  NULL 아닌 고유한 값이 있는 그룹의 대략적인 수를 반환한다 함수는  데이터 시나리오에 사용하도록 설계되었으며 아래 조건에 최적화 되어 있다.

·         수백만행 이상의 데이터 세트에 대한 액세스

·         많은 수의 고유한 값을 가진 열의 집계

이러한 조건을 가정하면 대부분의 작업에서 정확도 오차는 2%이내가 된다또한  APPROX_COUNT_DISTINCT 정확도 오차는 COUNT DISTINCT에서 20%이상 되어서는 안된다.

 

APPROX_COUNT_DISTINCT 고유 카운트를 계산할때, COUNT DISTINCT 보다 훨씬 적은 메모리를 사용한다이러한 이유 때문에 데이터 집합에 수십억개의 행이 있더라도 디스크를 사용하지  않고 메모리에서 계산을 수행할 가능성이 훨씬 크다일반적으로 COUNT DISTINCT 경우 메모리가 부족하면 tempdb 사용하므로  성능 저하를 초래(일반적으로 디스크가 가장 느리기 때문)한다 APPROX_COUNT_DISTINCT tempdb 사용하지 않고 내부적 알고리즘을 사용하므로 결과적으로 APPROX_COUNT_DISTINCT COUNT DISTINCT보다 훨씬 빠르게 실행된다.

 

아래  그림은 일반적인 COUNT(DISTINCT ()) 사용한 것과 APPROX_COUNT_DISTINCT 사용한 경우이다.

[DISTINCT COUNT]

 


[APPROX_COUNT_DISTINCT]

 


COUNT DISTINCT 경우 정렬 연산자가 추가되어 있으므며 APPROX_COUNT_DISTINCT 경우 Hash match 대한 Stream Aggregate 대체 된다는 것을   있다또한  계획은 모두 동일한 클러스터된 인덱스 검색을 사용하며 COUNT DISTINCT 경우 검색에 95% 비용을 사용하지만, APPROX_COUNT_DISTINCT 경우99% 검색에 사용되는 것을   있다 뜻은 전통적인 COUNT DISTINCT 작업은 외부의 스캔 처리 작업이  많다는 것을 의미한다.

 

APPROX_COUNT_DISTINCT 사용할 경우 실행 계획에 아래와 같은 연산자를 확인할  있다.

<ScalarOperator ScalarString=”APPROX_COUNT_DISTINCT_CONVERT([globalagg1004])”>

 

 

[참고자료]

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/07/16/approximate-count-distinct-enters-public-preview-in-azure-sql-database/

 

 

2018-09-10 / Sungwook Kang / http://sqlmvp.kr

 

Azure SQL,  count distinct, APPROX_COUNT_DISTINCT



출처: https://sqlmvp.tistory.com/1285?category=663684 [Database Lab]
No. Subject Author Date Views
2170 SQL Server 프로토콜과 SQLCMD를 사용한 연결 jevida(강성욱) 2019.04.23 1601
2169 SQL Server Edition 다운그레이드 후 확인사항 [1] jevida(강성욱) 2019.04.23 1507
2168 AlwaysOn 구성환경에서 Server Role 체크 후 Job Agent 실행 중지하기 jevida(강성욱) 2019.04.23 895
2167 SSRS에서 E-mail 세팅시 SSL 사용 유무 수정하기 jevida(강성욱) 2019.03.26 864
2166 SQL Linux Instance Name 변경 jevida(강성욱) 2019.03.26 742
2165 SQL Linux 업그레이드 jevida(강성욱) 2019.03.26 990
2164 Azure SQL Managed Instance 에서 SQL Agent의 Job history 기록 보관하기 jevida(강성욱) 2019.03.26 850
2163 Azure VM에서 SQL Server에 대한 저장소 구성 지침 jevida(강성욱) 2019.03.26 861
» Azure SQL에 도입된 새로운 집계 함수 APPROX_COUNT_DISTINCT jevida(강성욱) 2019.03.26 647
2161 Azure SQL의 데이터베이스 소유권 체인 jevida(강성욱) 2019.03.26 763
2160 Azure SQL의 내부 디스크 할당 방법 및 저장 가능 용량 확인 jevida(강성욱) 2019.03.26 786
2159 Azure SQL에서 이메일 보내기 jevida(강성욱) 2019.03.26 651
2158 Azure SQL에서 읽기 전용 복제본에 대한 접속 및 링크 서버 생성 jevida(강성욱) 2019.03.26 772
2157 Azure SQL에서 네트워크를 구성하는 방법 jevida(강성욱) 2019.03.26 498
2156 인덱스 재구성과 통계 업데이트시 발생하는 SQL Server Block jevida(강성욱) 2019.03.26 744
2155 SQL Server Scala UDF Inline 기능을 사용한 쿼리 성능 향상 jevida(강성욱) 2019.03.26 626
2154 SQL Server 가용성 그룹에 데이터베이스 자동으로 추가하기 jevida(강성욱) 2019.03.26 611
2153 SQL Server MySQL PostgreSQL 비교 jevida(강성욱) 2019.03.26 1051
2152 SQL Server 복잡한 쿼리가 옵티마이저에 미치는 영향과 옵티마이저 timeout jevida(강성욱) 2019.03.26 626
2151 SQL Server 2019 에서 문자열 잘림에 대한 향상된 에러 메시지 반환 jevida(강성욱) 2019.03.26 437





XE Login