설명 계획을 사용하여 쿼리를 최적화하는 방법은 무엇입니까?
저는 직장에서 몇 가지 sql 쿼리를 최적화하는 일을 맡았습니다.제가 찾은 모든 것은 설명 계획을 사용하여 문제 영역을 식별하는 것을 의미합니다.내가 정확히 어떤 설명 계획을 가지고 있는지 알 수 없는 문제가 나에게 말하고 있습니다.비용, 카디널리티 및 바이트를 얻을 수 있습니다.
이것은 무엇을 의미하며, 이를 어떻게 가이드로 사용해야 합니까?낮은 숫자가 더 나은가요?더 좋아요?어떤 의견이라도 주시면 대단히 감사하겠습니다.
아니면 질문을 최적화할 수 있는 더 나은 방법이 있다면 관심이 있을 것입니다.
나는 또한 당신이 오라클을 사용하고 있다고 생각합니다.그리고 우선 설명 계획 웹 페이지를 확인해 보는 것을 추천합니다.최적화에는 많은 것이 있지만 배울 수 있습니다.
다음은 몇 가지 팁입니다.
첫째, 최적화 작업을 수행하는 사람은 항상 궁극적인 성능보다는 허용 가능한 성능을 추구합니다.쿼리 실행 시간을 3분에서 3초로 단축할 수 있다면 요청이 있을 때까지 2초로 단축하지 마십시오.
둘째, 최적화 중인 쿼리가 논리적으로 올바른지 확인하기 위해 빠른 검사를 수행합니다.황당하게 들리지만, 느리게 실행되는 질문에 대한 조언을 요청받은 횟수를 말씀드릴 수는 없지만, 가끔 오답을 주고 있다는 것을 알게 되었습니다!결과적으로 쿼리를 디버깅하면 쿼리 속도도 향상되는 것으로 나타났습니다.
특히 설명 계획에서 "Dartesian Join" 문구를 찾습니다.만약 당신이 그곳에서 그것을 본다면, 당신이 의도하지 않은 데카르트 결합을 발견했을 가능성이 매우 높습니다.의도하지 않은 데카르트 조인의 일반적인 패턴은 FROM 절이 쉼표로 구분된 테이블을 나열하고 조인 조건은 WHERE 절에 있습니다.조인 조건 중 하나가 누락되어 Oracle이 데카르트 조인을 수행할 수밖에 없습니다.테이블이 크면 성능이 저하됩니다.
쿼리가 논리적으로 올바른 설명 계획에서 데카르트 조인을 볼 수 있지만 이를 이전 버전의 Oracle과 연결합니다.
사용되지 않은 복합 인덱스도 찾습니다.복합 인덱스의 첫 번째 열이 쿼리에 사용되지 않으면 Oracle은 인덱스를 비효율적으로 사용하거나 전혀 사용하지 않을 수 있습니다.예를 들어 보겠습니다.
쿼리는 다음과 같습니다.
select * from customers
where
State = @State
and ZipCode = @ZipCode
(DBMS는 Oracle이 아니었기 때문에 구문이 달랐고, 원래 구문을 잊어버렸습니다.
인덱스를 잠깐 살펴보니 고객의 인덱스에 해당 열(국가, 주, ZipCode)이 순서대로 표시되어 있습니다.쿼리를 읽도록 변경했습니다.
select * from customers
where Country = @Country
and State = @State
and ZipCode = @ZipCode
그리고 이제 옵티마이저가 인덱스를 유용하게 사용할 수 있었기 때문에 약 6분이 아니라 약 6초 만에 실행되었습니다.저는 애플리케이션 프로그래머들에게 왜 국가가 기준에서 빠졌는지 물었고, 이것이 그들의 대답이었습니다. 그들은 모든 주소가 '미국'과 동일한 국가를 가지고 있다는 것을 알고 있었기 때문에 그 기준을 제외함으로써 쿼리를 가속화할 수 있다고 생각했습니다!
불행히도 데이터베이스 검색을 최적화하는 것은 컴퓨팅 시간을 마이크로초 단축하는 것과 같지 않습니다.데이터베이스 설계, 특히 인덱스를 이해하고 최적화 도구가 작업을 수행하는 방법에 대한 개요를 설명합니다.
일반적으로 옵티마이저를 능가하려고 노력하는 대신 옵티마이저와 협업하는 방법을 배울 때 옵티마이저에서 더 나은 결과를 얻을 수 있습니다.
최적화 속도를 높이십시오!
당신은 당신이 무엇을 하느냐에 따라 실제로 그 이상을 얻습니다.이 설명 계획 페이지를 확인하십시오.여기서는 Oracle을 사용하고 있으며 계획 출력을 표시하기 위해 스크립트를 실행하는 방법을 알고 있다고 가정합니다.가장 중요한 것은 왼쪽에서 특정 인덱스의 사용 여부와 해당 인덱스의 사용 방법을 살펴보는 것입니다.조인을 할 때는 "(전체),"(색인 로이드 기준) 등이 표시되어야 합니다.비용은 낮은 비용이 더 나은 다음으로 고려해야 할 사항이며 인덱스를 사용하지 않는 조인을 수행할 경우 매우 큰 비용이 발생할 수 있다는 것을 알게 될 것입니다.설명 계획 열에 대한 세부 정보를 읽을 수도 있습니다.
당신은 막대사탕의 흐릿한 끝을 가지고 있습니다.
수많은 추가 정보와 경험 없이는 설명 계획을 검토하고 최적의 성능보다 낮은 결과를 초래하는 것(있는 경우)을 결정할 수 있는 방법이 전혀 없습니다.쿼리 튜닝을 10단계 프로세스로 줄일 수 있다면 자동화된 프로세스를 통해 수행됩니다.저는 이 일에 효과적이기 위해 당신이 이해해야 할 모든 것들을 나열하려고 했지만, 그것은 매우 긴 목록일 것입니다.
내가 생각할 수 있는 단 하나의 짧은 대답은...예상보다 훨씬 더 많은 바이트를 통과하는 단계를 계획에서 찾는 것입니다.그럼 그 수를 줄일 수 있는 방법을 생각해 보세요인덱스 또는 파티셔닝을 통해.
Jonathan의 비용 기반 Oracle Fundamentals에 대한 Lewis 책을 읽어 보십시오.
Tom Kyte의 오라클 데이터베이스 아키텍처에 대한 책을 가져와 몇 주 동안 숲에 있는 오두막을 빌려야 합니다.
이것은 방대한 전문 분야입니다(일명 흑인 예술)입니다.
제가 일반적으로 취하는 접근 방식은 다음과 같습니다.
- 문제의 SQL 문을 실행합니다.
- 실제 계획을 가져옵니다(dbms_xplan 조회).
- 예상 행 수(심도)와 실제 행 수를 비교합니다.큰 차이는 수정해야 할 문제(예: 인덱스, 히스토그램)를 나타냅니다.
- 일반적으로 계획이 먼저 진행되어야 한다고 생각하는 부분에서 공정의 속도를 높일 수 있는 인덱스를 생성할 수 있는지 고려해 보십시오.인덱스를 사용해 보십시오.
데이터베이스에 요청하는 내용의 맥락에서 여러 인덱스의 O() 영향을 이해해야 합니다.B-트리, 해시 테이블 등의 데이터 구조를 이해하는 데 도움이 됩니다.그런 다음 작동할 수 있는 인덱스를 만들고 프로세스를 반복합니다.
Oracle이 인덱스를 사용하지 않기로 결정한 경우 INDEX() 힌트를 적용하고 새 계획을 확인합니다.선택한 계획보다 비용이 더 많이 들 것입니다. 이것이 당신의 인덱스를 선택하지 않은 이유입니다.암시된 계획은 당신의 지수가 좋지 않은 이유에 대한 통찰력으로 이어질 수 있습니다.
언급URL : https://stackoverflow.com/questions/234622/how-to-use-explain-plan-to-optimize-queries
'IT' 카테고리의 다른 글
"변환 처리기 외부의 vuex 저장소 상태를 변환하지 않음"의 .pushends (0) | 2023.06.07 |
---|---|
TypeScript 컴파일 오류 TS5037: '--module' 플래그가 제공되지 않으면 외부 모듈을 컴파일할 수 없습니다. (0) | 2023.06.07 |
DataGrip에서 LOAD DATA 작업 디렉토리를 설정하려면 어떻게 해야 합니까? (0) | 2023.06.07 |
vuex 상태에서 메타 테마 색상 변경 (0) | 2023.06.07 |
Swift perform Selector:withObject:afterDelay:는 사용할 수 없습니다. (0) | 2023.06.02 |