2016-07-26 8 views
1

사이트 사용자가 입력 한 항목이있는 장고 응용 프로그램을 작성 중입니다. 이제 모든 것이 순조롭게 진행되고 예상되는 방문자 수를 얻게된다고 생각합니다 (드물지만 미래를 계획하고 있습니다). 이렇게하면 단일 PostgreSQL 데이터베이스에 수억 개의 항목이 생깁니다.매우 큰 데이터베이스에 항목 저장

많은 수의 항목을 반복하고 값을 확인하는 것은 좋은 생각이 아니므로 항목을 함께 그룹화하는 방법을 고려하고 있습니다.

항목을 그룹화하면이 많은 항목을 저장하는 데 더 좋은 아이디어라고 할 수 있습니까? 아니면 이것을 최적화 할 수있는 더 좋은 방법이 있습니까?

+2

나는 당신이 무엇을 요구하고 있는지 잘 모르겠습니다. 왜 항목을 반복할까요? 데이터베이스는 검색 할 때 훌륭합니다. –

+0

@DanielRoseman하지만 확실하게 동일한 작업을 몇 번씩하는 것은 나쁜 생각입니까? – techydesigner

+0

* 어떤 * 작업이 필요합니까? –

답변

1

절대적으로 더 이상 사용할 수 없을 때까지 한 번에 하나씩 저장하고 특정 문제를 해결할 다른 것을 디자인하십시오.

SQL은 "X와 일치하는 모든 레코드 제공"이라는 의미의 선언적 언어이므로 db 서버에 을 알려주는 방법이 없습니다.에는이 방법이 적용됩니다. 결과적으로 수억 개의 레코드가있는 경우에도 db 서버가 신속하게이 작업을 수행 할 수 있도록하는 많은 방법이 있습니다. 또한 RDBMS는 수년 간의 경험을 통해이 문제에 맞게 최적화되어 있으므로 PostgreSQL과 같은 시스템을 능가하지는 못할 것입니다.

그래서 조기 최적화는 모든 악의 근원입니다.

그래서 PostgreSQL이 결과를 얻기 위해 테이블을 통과하는 두 가지 방법을 살펴 보겠습니다.

첫 번째 스캔은 일련의 페이지를 반복하고 각 페이지에서 값을 스캔 한 다음 레코드를 사용자에게 반환합니다. 매우 작은 테이블의 경우 다른 방법보다 효과적입니다. 큰 테이블에서는 느립니다. 복잡성은 O (n)입니다. 여기서 n은 테이블의 크기이며, 레코드 수에 제한이 없습니다.

그래서 두 번째 접근법은 인덱스 스캔 일 수 있습니다. 여기에서 PostgreSQL은 b-tree 인덱스에서 일련의 페이지를 가로 질러 레코드를 찾습니다. 복잡성은 각 레코드를 찾기 위해 O (log (n))입니다.

내부적으로 PostgreSQL은 페이지를 고정 크기로 배치로 저장합니다. 이미이 문제를 해결합니다. 동일한 작업을 수행하려고하면 일괄 처리 된 레코드 일괄 처리가 수행됩니다.이 일괄 처리는 일반적으로 나쁜 작업의 처방입니다.

+0

훌륭한 답변을 친구. 매우 유익한. 매우 감사합니다! – techydesigner

+1

btw, 나는 총 10TB + 크기의 수억 개의 행을 포함하는 DB로 작업합니다. 비정규화된 저장 장치가 도움이되는 경우가 있습니다. 그러나 실제로 무언가를 물을지도 모른다는 생각을하지 않을 것이며, 미래를 위해 비정규 화하는 것은 대개 문제를 만드는 방법입니다 –