쿼리가 두 번째로 실행되면 더 빨리 실행됩니다. 이를 중지하려면 어떻게 해야 합니까?
오라클 10에서 쿼리를 실행하고 있습니다.select A from B where C = D
B는 수백만 개의 기록을 가지고 있고 C에 대한 지수는 없습니다.
처음 실행할 때는 약 30초가 걸리고, 두 번째로 쿼리를 실행할 때는 약 1초가 걸립니다.
분명히 무언가를 캐싱하고 있으며, 쿼리를 실행할 때마다 처음 실행된 것처럼 30대가 소요되기를 원합니다.
- 질문을 가독성 있게 하기 위해 제가 가지고 있는 문제를 지나치게 simpl링하고 있습니다.
감사해요.
성능을 측정하기 위해 캐시를 지우는 것은 가능하지만 매우 다루기 어렵습니다.
조정 작업의 달성된 성능을 추적하는 매우 좋은 방법은 쿼리 실행 중에 읽기 블록의 수를 세는 것입니다.가장 쉬운 방법 중 하나는 다음과 같이 자동 추적과 함께 sqlplus를 사용하는 것입니다.
set autotrace traceonly
<your query>
산출물들
...
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
1 consistent gets
0 physical reads
0 redo size
363 bytes sent via SQL*Net to client
364 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
읽기 블록 수(캐시든 디스크든):consistent gets
.
다른 방법은 증가된 통계로 쿼리를 실행하는 것입니다. 즉, 힌트와 함께gather_plan_statistics
그런 다음 커서 캐시에서 쿼리 계획을 확인합니다.
auto autotrace off
set serveroutput off
<your query with hint gather_plan_statistics>
select * from table(dbms_xplan.display_cursor(null,null,'typical allstats'));
읽은 블록 수가 열로 출력됩니다.buffers
.
---------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers |
---------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | | 1 (100)| | 3 |00:00:00.01 | 3 |
| 1 | SORT AGGREGATE | | 3 | 1 | | | 3 |00:00:00.01 | 3 |
| 2 | INDEX FULL SCAN| ABCDEF | 3 | 176 | 1 (0)| 00:00:01 | 528 |00:00:00.01 | 3 |
---------------------------------------------------------------------------------------------------------------------
이 질문 보기...
데이터와 실행 계획에 대한 캐시를 클리어하는 방법을 보여주지만, 좋은 아이디어인지 아닌지에 대해서도 확장됩니다.
명백한 답은 각 테스트 케이스가 쿼리를 여러 번 실행하고 첫 번째 결과를 무시하는 것입니다.
첫 번째 쿼리 실행 조건을 완전히 복제하는 것은 쉽지 않은데, 여기에는 Oracle 캐시(커서, 버퍼 등), OS(Oracle 구성에 따라 Disk 캐시), 하드웨어(SAN, RAID, Disk) 등이 포함됩니다.
각 시도 전에 데이터베이스 서버를 재부팅하면 일관된 조건에 근접할 수 있습니다.
당신에게 도움이 될지도 모릅니다.
http://www.mssqltips.com/tip.asp?tip=1360
체크포인트;
GO DBCC Drop Clean Buffers;
가세요
언급URL : https://stackoverflow.com/questions/6611994/my-query-runs-faster-the-second-time-around-how-do-i-stop-that
'source' 카테고리의 다른 글
리눅스 Perf 리포트 출력 이해 (0) | 2023.10.14 |
---|---|
WCF 웹 서비스 요청의 XML SOAP 요청을 받으려면 어떻게 해야 합니까? (0) | 2023.10.09 |
자바스크립트에서 이진수를 나타내는 "0b" 등이 있습니까? (0) | 2023.10.09 |
검색되지 않은 예외: Ajax Process의 메모리 부족 (0) | 2023.10.09 |
파워셸에서 sqlcmd를 실행하는 방법? (0) | 2023.10.09 |