SELECT 문의 성능 조정은 때때로 매우 시간이 많이 걸리는 작업이며 제 생각에는 파레토 원칙을 따릅니다. 20%의 노력으로 80%의 성능 향상을 얻을 수 있으며 나머지 20%의 성능 향상을 얻는 데 80%의 시간이 걸릴 수 있습니다. 지구상에서 하루가 243일인 금성에서 작업하지 않는 한, 배송 기한으로 인해 SQL 쿼리를 조정할 시간이 부족할 가능성이 높습니다.
수년간의 SQL 문 작성 및 실행 경험을 바탕으로 쿼리 성능을 향상시키려고 할 때 참고하는 체크리스트를 개발하기 시작했습니다. 나는 내가 사용하고 있는 데이터베이스에 대한 쿼리 계획을 세우고 설명서를 읽기 전에 이를 참조하는데, 이는 때때로 복잡할 수 있습니다. 내 체크리스트는 결코 포괄적이거나 과학적이지는 않으며 보수적인 계산에 가깝지만 이러한 간단한 단계를 따르면 대부분의 경우 성능이 향상된다고 말할 수 있습니다. 아래 체크리스트.
인덱스 확인
SQL 문의 WHERE 및 JOIN 부분에 사용되는 모든 필드에 인덱스를 추가해야 합니다. 3분간의 SQL 성능 테스트를 받아보세요. 학년에 관계없이 해당 결과를 정보와 함께 읽으십시오.
작업 데이터 세트의 크기를 제한하세요.
해당 SELECT 문에 사용된 테이블을 확인하여 필터링을 위해 WHERE 절을 적용할 수 있는지 알아보세요. 일반적인 예는 테이블에 행이 수천 개만 있을 때에도 잘 수행되는 쿼리입니다. 그러나 애플리케이션이 성장함에 따라 쿼리 속도가 느려졌습니다. 해결책은 이번 달의 데이터를 보기 위해 쿼리를 제한하는 것만큼 간단할 수 있습니다.
쿼리 문에 하위 쿼리가 있는 경우 외부 문이 아닌 하위 쿼리의 내부 문에 필터링을 사용하도록 주의하세요.
필요한 필드만 선택하세요.
추가 필드는 일반적으로 반환되는 데이터의 질감을 높여 SQL 클라이언트에 더 많은 데이터가 반환됩니다. 추가 정보:
• 보고 및 분석 기능이 있는 애플리케이션을 사용할 때 보고 도구가 수신한 데이터를 자세한 형식으로 집계해야 하기 때문에 보고 성능이 저하되는 경우가 있습니다.
• 경우에 따라 쿼리가 충분히 빠르게 실행될 수도 있지만 대량의 세부 데이터가 네트워크를 통해 보고 서버로 전송되므로 문제는 네트워크 관련 문제일 수 있습니다.
• 컬럼 기반 DBMS를 사용하는 경우 선택한 컬럼만 디스크에서 읽습니다. 쿼리에 포함하는 열 수가 적을수록 IO 오버헤드가 줄어듭니다.
불필요한 테이블 제거
불필요한 테이블을 제거하는 이유는 쿼리문에서 불필요한 필드를 제거하는 이유와 동일합니다.
SQL 문 작성은 일반적으로 SQL 문을 작성하고 테스트하는 수많은 반복 프로세스가 필요한 프로세스입니다. 개발 중에 쿼리에 테이블을 추가할 수 있으며 이는 SQL 코드에서 반환되는 데이터에 아무런 영향을 미치지 않을 수 있습니다. SQL이 올바르게 실행되면 많은 사람들이 스크립트를 검토하지 않고 반환된 최종 데이터에 영향을 미치지 않는 테이블을 삭제하지 않는다는 것을 알았습니다. 불필요한 테이블이 포함된 JOINS 작업을 제거하면 데이터베이스가 수행해야 하는 프로세스 수가 크게 줄어듭니다. 때로는 열을 제거하는 것처럼 축소한 데이터가 데이터베이스를 통해 다시 나오는 경우도 있습니다.
외부 조인 쿼리 제거
말하기는 쉽지만 테이블 내용 변경이 얼마나 영향을 미치는지에 따라 다릅니다. 한 가지 해결 방법은 두 테이블의 행에 자리 표시자를 배치하여 OUTER JOINS 작업을 제거하는 것입니다. OUTER JOINS를 정의하여 모든 데이터가 반환되도록 보장하는 다음 테이블이 있다고 가정합니다.
CUSTOMER_ID | CUSTOMER_NAME |
---|---|
1 | John Doe |
2 | Mary Jane |
3 | Peter Pan |
4 | Joe Soap |
CUSTOMER_ID | SALES_PERSON |
---|---|
NULL | Newbee Smith |
2 | Oldie Jones |
1 | Another Oldie |
NULL | Greenhorn |
해결책은 고객 테이블의 행에 자리 표시자를 추가하고 판매 테이블의 모든 NULL 값을 자리 표시자로 업데이트하는 것입니다.
CUSTOMER_ID | CUSTOMER_NAME |
---|---|
0 | NO CUSTOMER |
1 | John Doe |
2 | Mary Jane |
3 | Peter Pan |
4 | Joe Soap |
CUSTOMER_ID | SALES_PERSON |
---|---|
0 | Newbee Smith |
2 | Oldie Jones |
1 | Another Oldie |
0 | Greenhorn |
OUTER JOIN 연산에 대한 종속성을 제거할 뿐만 아니라 고객이 없는 영업사원이 표현되는 방식도 표준화합니다. 다른 개발자는 ISNULL(customer_id, “아직 고객이 없습니다”)와 같은 추가 문을 작성할 필요가 없습니다.
JOIN 및 WHERE 절에서 계산된 필드 제거
이것은 때로는 말처럼 쉽지만 실제로는 실행되지 않는 또 다른 요령입니다. 테이블 스키마를 변경하는지에 따라 달라집니다. 권한. 조인 문에 사용된 계산된 필드는 테이블에 새 필드로 생성될 수 있습니다. 다음 SQL 문이 있다고 가정할 때:
FROM sales a JOIN budget b ON ((YEAR(a.sale_date)* 100) + MONTH(a.sale_date)) = b.budget_year_month
판매 테이블에 연도와 월을 사용하여 열을 추가하면 성능이 향상될 수 있습니다. 업데이트된 SQL 문은 다음과 같습니다.
SELECT * FROM PRODUCTSFROM sales a JOIN budget b ON a.sale_year_month = b.budget_year_month
요약
위 제안 사항은 다음 사항으로 요약될 수 있습니다.
• 확인 인덱스
• 필요한 최소 데이터 세트에 대해 작업
• 불필요한 필드 및 테이블 제거
• JOIN 및 WHERE 절에서 계산 작업 제거
If 이러한 모든 제안은 SQL 쿼리 성능을 향상시키지 못합니다. 마지막 제안은 Venus로 이동하는 것입니다. 당신이 필요로하는 것은 SQL 문을 조정하는 데 하루뿐입니다.
위 내용은 SQL SELECT 문의 성능을 최적화하는 6가지 간단한 팁의 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!