Created by 솔루션사업팀


데이터베이스의 크기가 커지면 쿼리가 느려집니다. 데이터베이스 쿼리에는 제거할 수 있는 반복적인 여러 절차가 포함되는 경우가 많습니다. 데이터베이스에서 특정 개인에 대한 전체 이름 레코드를 검색하기 위해 데이터베이스는 이름에 대한 모든 항목을 가져온 다음 두 번째 이름에 대한 모든 항목을 가져오고 교차를 계산하도록 쿼리합니다. 이를 위해서는 데이터베이스에 두 번 액세스해야 하며, 이는 데이터 검색 시간을 절약하기 위해 제거할 수 있는 중복입니다.

Amazon 연구원은 중복을 제거하기 위해 복잡한 SQL 쿼리를 다시 작성하는 방법을 제시합니다. 검색 후 더 많은 계산이 필요하지만 동일한 테이블에 대해 수많은 쿼리를 수행하는 것보다 효율적입니다. 3TB의 데이터로 TPC-DS 벤치마크 데이터베이스에서 테스트한 결과, 이들의 접근 방식은 기준선에 비해 전체 실행 시간을 14% 단축했습니다. 재작성 규칙에 의해 직접 변경된 쿼리로 분석을 제한했을 때 속도가 60% 향상되었으며 일부 쿼리는 6배 이상 더 빠르게 처리되었습니다.

쿼리를 향상시키려면 전체 쿼리가 수행하려고 하는 것을 이해하는 것이 중요합니다. 쿼리 계획은 이 청사진을 생성합니다. 쿼리 계획은 데이터 스캔 및 집계와 같은 쿼리를 수행하는 데 사용되는 일련의 작업입니다. 수많은 실행 가능한 가능성 중에서 가장 효율적인 쿼리 계획을 선택하는 것을 쿼리 계획 최적화라고 합니다.

Untitled

출처: https://www.amazon.science/blog/speeding-database-queries-by-rewriting-redundancies

쿼리 계획 은 SQL 쿼리를 실행 하는 데 필요한 단계입니다. 위의 그림중 왼쪽에 있는 그림은 TPC-DS 데이터 세트에서 문제가 있는 쿼리에 대한 일반적인 쿼리 전략을 보여줍니다. Amazon 연구원의 새로운 재작성 규칙으로 개발한 쿼리 계획이 오른쪽에 표시됩니다. 그들의 연구는 중복 데이터를 계산하고 원래 결과를 복구하기 위한 보상 조치(검색 후 계산)가 있는 단일 계산으로 융합하는 하위 쿼리를 식별합니다. 하위 쿼리는 구문적으로 동일하거나 동일한 결과를 제공할 필요가 없습니다.

다음 쿼리를 예로 들어 보겠습니다.

WITH cte as (...complex_subquery...)
SELECT customer_id FROM cte WHERE fname = 'John'
UNION ALL
SELECT customer_id FROM cte WHERE lname = 'Smith'

FROM 절에서 쿼리는 블록 cte를 두 번 사용하므로 특히 중복 계산에 비용이 많이 드는 경우 비효율적입니다. 그들의 방법은 그러한 패턴을 감지하고 다시 쓸 수 있습니다. 예를 들어 앞의 쿼리는

WITH cte as (...complex_subquery...)
SELECT customer_id FROM cte, (VALUES (1), (2)) T(tag)
WHERE (fname = 'John' AND tag=1)
OR (lname = 'Smith' AND tag=2)