2014-03-18 3 views
0

다소 큰 데이터베이스를보고 있습니다. 제품 레코드에 내 보낸 플래그가 있습니다.
플래그를 false로 설정 한 제품의 예상 개수를 보려면 Product.where (: exported => false) .count ..와 같은 호출을 할 수 있습니다.ruby에서 특정 활성 레코드 호출을 더티 읽기로 설정하는 것이 가능합니다.

1 백만 개의 제품 표가 기록되기 때문에 계산에 시간이 오래 걸리는 문제가 있습니다. 더 구체적으로 수출이 일어나고 있으며, 계산에 관심이있는 가치가 계속 변하고 있습니다.

그래서 나는 테이블에서 더러운 읽기를하고 싶습니다. 항상 더러운 읽기는 아닙니다. 그리고 100 %는이 연결에서 데이터베이스에 대한 모든 후속 호출이 더럽길 바라지 않습니다.
그러나이 한 통화에 대해 더러운 것은 내가 원하는 것입니다.

아 .. 루비 1.9.3 heroku와 postgresql에 대해 언급해야합니다.

지금 .. 카운트를 얻으려는 또 다른 방법을 놓친다면, 나는 그것을 시도하게되어 기쁩니다.

OH SNOT 마지막으로 ..이 예제는 인위적입니다.

+0

http://wiki.postgresql.org/wiki/Slow_Counting은 빠른 근사를 얻는 방법에 대한 제안을 제공합니다. –

답변

0

쿼리가 실행되기 시작하면 즉시 MVCC이 무엇인지에 대한 이유 때문에 고정 된 읽기 전용 상태가됩니다. 해당 스냅 샷에서 값은 변경되지 않으며 해당 상태에 대한 이후 수정시에만 변경됩니다. 쿼리가 실행하는 데 1 시간이 걸리거나, 잠긴 데이터에서 작동하는지는 중요하지 않습니다.

매우 오랜 시간이 걸릴 경우 인덱스 된 열에 대한 COUNT은 대개 매우 빠르기 때문에 exported 열 또는 색인에서 필요한 값을 입력해야합니다.

+1

PostgreSQL 9.2 이상에서만 색인 전용 검사를 사용할 수있을 때 정규화되지 않은'count'에서 색인의 이점을 얻을 수 있습니다. –

+0

그 분야는 그다지 중요하지 않았습니다. 그것은 인위적인 사례였습니다. 그러나 아마 내가 이것을하고 싶은 필드를 좁히고 인덱스를 사용할 수 있습니다. 자주 바뀌는 분야에서는 지수가 무거웠다 고 생각했습니다. – baash05

+0

@ baash05 그들은 있습니다.추가 된 쓰기로드와 읽기시 I/O 비용을 잠재적으로 향상시키는 것은 성능 간의 균형입니다. –

2

PostgreSQL은 더티 읽기를 지원하지 않습니다.

트리거를 사용하여 개수에 대한 구체화 된보기를 유지하고자 할 수 있습니다.하지만 이렇게하면 트리거를 사용하여 한 번에 하나의 트랜잭션 만 제품을 삽입 할 수 있습니다. 요약 표.

번갈아서, use system statistics to get a fast approximation.

또는 PostgreSQL 9.2 이상에서는 기본 키 (고유 인덱스)가 있는지 확인하고 진공이 규칙적으로 실행되는지 확인하십시오. 그런 다음 PostgreSQL은 기본 키에 대한 인덱스 전용 검색을 선택해야하므로 상당히 빠른 카운트를 수행 할 수 있어야합니다. 심지어 대학원 경우 지원 더러운했다

참고 행이 때때로 순차 검색에 뒤에 읽기 포인터를 를 삽입 때문에 읽기가 아직 날짜 결과까지 완벽하게 반환하지 것이다 읽습니다. 완벽하게 최신 카운트를 얻는 유일한 방법은 이며 동시 삽입을 방지하는 것입니다. : LOCK TABLE thetable IN EXCLUSIVE MODE.

+0

나는 항상 최신의 카운트를 찾고 있는게 아니 었어. 매번 사장님이 나에게 카운트를 요구할 때마다 업데이트되는 것. (얼마나 많은 데이브가 변경 되었습니까?) 더러운 쿼리로 충분했을 것입니다. – baash05

+0

글쎄, 그 경우 나는 원래의 해결책에 무엇이 잘못되었는지 보지 못한다. 적당히 최신 답변이 필요하지만 신속하게 답변해야하는 경우 정기적으로 기록 테이블에 기록하도록 예약 할 수 있으므로 요청할 때 기록 테이블을 선택할 수 있습니다. –