이것은 디자인/알고리즘 질문입니다. SQL 테이블이 너무 큽니다. 페이징/세그먼트 화를 통해 데이터를 검색합니까?
- 내가 (., 말 5 백만 행) 큰 테이블이 데이터의 내가 자동차 그리고
- 난을 수행하는 응용 프로그램을 가지고 전화 할게 : 여기 내 시나리오의 개요입니다 이 자동차에
SELECT *
는 테이블은 모든 데이터를 복용하고 단일 데이터 파일로 패키징 (후 어딘가에 업로드된다.) - 내 응용 프로그램에 의해 생성 된이 데이터 파일은 테이블이 순간 속에서 스냅 샷을 나타냅니다 제 시간에.
- 테이블 그러나 자동차은 응용 프로그램이 현재 테이블에서 패키지를 생성하고 있는지 여부에 관계없이 다른 프로세스에서 산발적으로 업데이트됩니다. (현재의 동기가 없습니다.)
내 문제 :
이 테이블 자동차가에 대해 단일 SELECT *
을 할 너무 큰되고있다. 내 애플리케이션이이 모든 데이터를 한 번에 가져 오면 내 컴퓨터의 메모리 용량을 빠르게 압도합니다 (2GB라고 가정). 또한 LIMIT 또는 OFFSET을 사용하여 체인을 실행하면 동기화 조건이 실패합니다. 테이블이 자주 업데이트되고 SELECT 호출간에 데이터를 변경할 수 없습니다.
내가을 찾고 있어요 :
무한대에 접근 할 수있는 데이터 크기를 가정하면, 그 메모리 용량 데이터보다 작은 응용 프로그램으로이 테이블의 전체를 당겨하는 방법. 특히 SQL select에 대해 페이지 매김/분할 효과를 얻으려면 어떻게해야합니까? 즉, 데이터의 다음 세그먼트를 검색하기 위해 페이지 번호가있는 되풀이 호출 만들기. 이상적인 솔루션은 데이터 크기의 확장 성을 허용합니다.
(내 시나리오를 단순화하기 위해, 우리는 그 다음 다음 세그먼트를 요청하기 전에 사용되는 메모리를 확보/쓰기 데이터의 세그먼트를 부여 할 때, 응용 프로그램이 처리 할 수 있다고 가정 할 수 있습니다.)
어떤 제안 당신은 가장 도움이 될만한 것을 제공 할 수 있습니다. 감사!
편집 : 요청에 의해, 내 구현은 C# .NET 4.0 & MSSQL에게 2008 년
편집 # 2를 사용 이것은 SQL 명령 질문 없습니다. 이것은 디자인 패턴과 관련된 질문입니다. 대형 테이블에 대해 페이지 매김 된 SELECT를 수행하는 전략은 무엇입니까? (특히 테이블이 일관된 업데이트를받는 경우)
우선 : 프로덕션 환경에서 'SELECT *'를 절대 사용하지 마십시오. –
둘째 : ** 어떤 데이터베이스 **와 어떤 버전에 대해 이야기하고 있습니까? SQL은 많은 데이터베이스 시스템에서 사용되는 구조화 된 쿼리 언어 일뿐입니다. 우리가 아마도 당신을 도울 수는 없습니다. ..... 사용중인 데이터베이스 제품을 알아야합니다. –
@marc_s : 당신은 그런 단언을한다. 일반적으로 동의하지만 'select *'가 유효한 상황이 있습니다. 예를 들어 결과를 사용하기 위해 dbreader의 메타 데이터를 읽는 경우입니다. –