2010-07-28 5 views
0

특정 순서로 반환해야하는 상당한 양의 데이터 (백만 행)가있는 경우이를 수행하는 한 가지 확실한 방법은 각 행에 숫자 인덱스를 놓고 해당 인덱스로 정렬하는 것입니다. 그러나 그 데이터의 중간에 새로운 행을 만들고 싶다면 두 행 사이에 인덱스에 간격이 있어야하거나 "SET SET SET"를해야 할 필요가 있습니다. position = position + 1 WHERE position> new_position "이 될 수 있습니다.데이터베이스에서 많은 양의 순서가 있지만 재정렬 가능한 데이터를 저장하기위한 전략?

이 문제를 처리하는 더 효과적인 전략이 있습니까? 나는 내 행 사이에 큰 간격을 남기고 (아마도 백그라운드 프로세스로 행을 재 배열하는) 최선의 결과를 기대한다. 연결된 목록과 동일한 데이터베이스가 있는가?

EDIT : 색인이 무엇인지, 기존의 순서가 어떻게 처리되는지 (내 첫 번째 문장 읽기) 알아 냈습니다. 정렬 된 색인 중간에 새 행을 삽입하는 데이터 구조가 있는지 궁금합니다. 여전히 끝났어. 기존의 next/prev 포인터는 단일 범위 쿼리로 이것을 수행하는데, 지금까지 내가 아는 한 작동하지 않을 것이다.

+0

어떤 데이터베이스를 사용하고 있습니까? – Oded

+0

gabs 아이디어는 데이터를 추가 할 때 공간이 충분하지 않기 때문에 서버가 데이터를 재배치하기 때문에 제 생각에는 좋은 해결책이 아닙니다. –

+0

나는이 경우 couchdb를 사용하고 있는데, Postgres와 같은 RDBM을위한 해결책이 있는지 알고 싶다. –

답변

1

데이터 중간에 터플을 만들 수 없습니다. 끝에서 추가 할 것입니다. 올바른 순서로 데이터를 반환하려면 열 단위로 정렬해야하며 인덱싱 된 경우에는 데이터 형식이 빠릅니다.

연결된 목록과 동일한 데이터베이스가 있습니까?

직접적으로 - SQL 내부에 나무를 저장하는 몇 가지 아이디어가 있습니다. 그러나이 결과는 각 튜플 (링크 대상 읽기, 다음 튜플 선택)에 대한 쿼리가됩니다. 수백만 개의 튜플을 다루는 경우 이것은 매우 느립니다.

편집 : 튜플 중간에 추가 할 수 없습니다!

당신은 정말이 작업을 수행해야하는 경우 :

  • 새 테이블을 생성 -
  • 드롭 이전 테이블은
  • 이전 테이블에 새 테이블의 이름을 변경
  • 알고 있어야 원하는 순서대로 모든 것을 추가 추가 된 각 튜플에 대해이 작업을 수행해야합니다 (데이터 끝에 추가되지 않는 한).
+0

하지 내가 원하는 대답에 새 테이블의 이름을 변경하지만 대답은 내가 할게요 : P 감사! –

0

데이터베이스는 스프레드 시트가 아니며 암시 적으로 정렬되지 않습니다.

select Col1, Col2, Col3 
from some_table 
where Col3 between value_1 and value_2 
order by Col2 asc; 

빠른 검색을 위해 색인이 사용됩니다.

관련 문제