2014-10-09 2 views
0

테이블의 열에 특별히 사용하는 시퀀스가 ​​정의되어 있습니다. 1 씩 증가하고 10을 캐싱합니다. 이것은 거대한 테이블이며 열에 인덱스가 없습니다. 열의 최대 값을 알고 싶습니다. max 함수는 많은 시간이 걸릴 것이므로 보기의 last_number 열을 사용하고 있습니다. 이것이 올바른 접근 방법입니까? 특히 캐싱이 관련되어 있습니까? 따라서 표가 삽입 전용이고 삭제가없는 경우 1000이 삽입 된 최대 값인 경우 last_number이 1000으로 표시됩니까?최대 함수 대 Oracle의 all_sequences 사용

편집 : 정상적인 트래픽을 위해 데이터베이스를 사용할 수없는 경우이를 알고 싶습니다. 이걸 실행할 때 다른 연결이 없습니다.

+2

일반적으로 작동하지 않습니다. 트랜잭션이 롤백되었거나 다른 세션에서 행을 삽입했지만 아직 커밋되지 않은 경우에는 어떻게됩니까? 왜 '최대'값을 알고 싶습니까? 시퀀스의'currval'을 사용하고 싶지 않으십니까? (현재 세션의 시퀀스에서 얻은 마지막 값을 알려줍니다). –

+0

해당 열의 최대 값 또는 테이블의 행 수를 알고 싶습니까? – APC

답변

1

실제로 열의 최대 값을 알아야 할 경우 가장 빠른 방법은 해당 열에 인덱스를 추가하는 것입니다. 그런 식으로 쿼리는 인덱스에서 마지막 블록을 가져 와서 최대 값을 결정하기 만하면됩니다. 오라클의 MIN/MAX 최적화를 활용하려면 쿼리가 올바르게 작성되었는지 확인해야합니다 (예 : SELECT MAX(id) FROM mytable). 실행 계획 첫 번째)

Justin이 말했듯이 시퀀스 생성기는 롤백뿐 아니라 캐싱, 증가 및 RAC 환경에서의 동작과 같은 다른 시퀀스 기능을 통해이 목적에 유용하지 않을 가능성이 높습니다 last_number은 일반적으로 열의 실제 최대 값보다 훨씬 높을 것으로 예상됩니다.