>Java >java지도 시간 >SQL 성능 최적화 및 개선 방법 소개

SQL 성능 최적화 및 개선 방법 소개

不言
不言앞으로
2019-03-07 16:55:102725검색

이 글은 SQL 성능을 최적화하고 개선하는 방법을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

Ø 단순 성능 최적화

Sql 성능 최적화는 데이터베이스 엔지니어가 실제 작업에서 직면해야 하는 중요한 주제 중 하나입니다. 일부 데이터베이스 엔지니어에게는 이것이 거의 유일한 제안입니다. 실제로 WEB 서비스처럼 빠른 응답이 필요한 애플리케이션 시나리오에서는 SQL 성능이 시스템 사용 가능 여부를 직접적으로 결정한다. 여기서는 SQL을 사용하여 더 빠르게 실행하고 더 적은 메모리를 소비하는 몇 가지 최적화 기술을 주로 소개합니다. 오늘의 기사에서는 그 중 하나만 소개하고 앞으로 다른 최적화 방법을 계속 업데이트할 예정입니다.

쿼리 성능을 엄격하게 최적화하려면 사용 중인 데이터베이스의 기능적 특성을 이해해야 합니다. 또한, 쿼리 속도가 느린 것은 SQL 문 자체 때문만이 아니라 메모리 할당 불량, 불합리한 파일 구조 및 기타 이유 때문이기도 합니다. 따라서 여기서 소개하는 SQL 최적화 방법이 모든 성능 문제를 해결하지는 못할 수도 있지만, 쿼리 성능이 저하되는 원인이 무리한 SQL 작성 방식에 있는 경우가 많은 것은 사실이다.

Ø 효율적인 쿼리 사용

SQL에서는 여러 코드가 동일한 결과를 얻을 수 있습니다. 이론적으로는 동일한 결과를 생성하는 서로 다른 코드는 동일한 성능을 가져야 하지만, 안타깝게도 쿼리 최적화 프로그램에서 생성되는 실행 계획은 코드의 외부 구조에 따라 크게 영향을 받습니다. 따라서 쿼리 성능을 최적화하려면 최적화 프로그램이 보다 효율적으로 수행되도록 코드를 작성하는 방법을 알아야 합니다.

파라미터가 서브쿼리인 경우 IN

IN 조건자 대신 EXISTS를 사용하는 것이 매우 편리하고, 코드도 이해하기 쉬워 자주 사용됩니다. 그러나 IN 술어는 편리하지만 성능 최적화에 병목 현상이 발생할 위험이 있습니다. 코드에서 많은 IN 조건자를 사용하는 경우 일반적으로 이를 최적화하는 것만으로도 성능이 크게 향상될 수 있습니다.

IN의 매개변수가 "1, 2, 3"과 같은 값의 목록인 경우 일반적으로 특별한 주의가 필요하지 않습니다. 하지만 매개변수가 하위 쿼리라면 주의가 필요합니다.

대부분의 경우 [NOT]IN과 [NOT]EXISTS가 반환하는 결과는 동일합니다. 그러나 둘 다 하위 쿼리에 사용되면 EXISTS가 더 빨라집니다.

예를 살펴보겠습니다.

Class_A 테이블에서 Class_B 테이블에도 존재하는 직원을 찾으려고 합니다. 다음 두 SQL 문은 동일한 결과를 반환하지만 EXISTS를 사용하는 SQL 문이 더 빠릅니다.

두 결과 모두 아래에 표시됩니다.

EXISTS를 사용할 때 더 빠른 이유는 두 가지입니다.

a) 연결 컬럼(id)에 인덱스가 설정되어 있으면 Class_B 쿼리 시 실제 테이블을 쿼리할 필요 없이 인덱스만 쿼리하면 됩니다.

b) EXISTS를 사용하면 데이터 행이 조건을 만족하는 한 쿼리가 종료됩니다. IN을 사용할 때처럼 테이블 전체를 스캔할 필요가 없습니다. 이 시점에서는 NOT EXISTS도 마찬가지입니다.

IN의 매개변수가 하위 쿼리인 경우 데이터베이스는 먼저 하위 쿼리를 실행한 후 결과를 임시 작업 테이블(인라인 뷰)에 저장한 다음 전체 뷰를 스캔합니다. 대부분의 경우 이 접근 방식은 리소스 집약적입니다. EXISTS를 사용하면 데이터베이스가 임시 작업 테이블을 생성하지 않습니다.

하지만 코드 가독성 측면에서는 EXISTS보다 IN이 더 좋습니다. IN을 사용하면 코드가 더 명확해지고 이해하기 쉬워집니다. 따라서 IN을 사용하여 빠르게 결과를 얻을 수 있다고 확신한다면 EXISTS로 변경할 필요가 없습니다.

게다가 최근 많은 데이터베이스에서 IN의 성능을 향상시키려고 노력하고 있습니다. 아마도 언젠가는 IN이 어떤 데이터베이스에 있든 EXISTS와 동일한 성능을 달성할 수 있을 것입니다.

매개변수가 하위 쿼리인 경우 IN 대신 연결을 사용하세요.

IN의 성능을 향상시키기 위해 EXISTS를 사용하는 것 외에 연결을 사용할 수도 있습니다. 이전 쿼리 문은 다음과 같이 "평탄화"될 수 있습니다.

이 쓰기 방법은 적어도 테이블의 "id" 열에 있는 인덱스를 사용할 수 있습니다. 또한 하위 쿼리가 없기 때문에 데이터베이스는 중간 테이블을 생성하지 않습니다. 어느 것이 EXISTS보다 낫다고 말하기는 어렵지만 인덱스가 없다면 EXISTS가 조인보다 약간 더 나을 수도 있습니다. 그리고 어떤 경우에는 EXISTS를 사용하는 것이 연결을 사용하는 것보다 더 적절하다는 것을 많은 쿼리에서 볼 수 있습니다.

위 내용은 SQL 성능 최적화 및 개선 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제