2016-07-28 2 views
1

SQLite 데이터베이스가 지원하는 C++ 프로그램에서 작업하고 있습니다. 데이터베이스에는 문서, 문서 요소 및 문서 경계 (문서 경계에 놓여있는 문서 요소 세트)에 대한 테이블이 있습니다. 문서는 런타임에 작성됩니다.Where 절없이 너무 많은 행을 반환하는 고정 SQLite 뷰

이 프로그램은 원본 문서의 요소가 결합 된 새 문서를 만드는 문서를 병합하는 기본 작업과 규칙 세트에 따라 원본 문서의 경계에서 요소가 선택되는 새 경계를 지원합니다 다른 병합 유형에 따라 다릅니다. 규칙은 또한 테이블에 저장됩니다.

데이터베이스 스키마에서 작업하면서 규칙 테이블을 경계 테이블에 조인하고 각 문서를 조인 한 결과의 모든 경계 요소 목록을 생성하는 SQLite 뷰를 만들 수 있음을 깨달았습니다. 각 병합 계획에 따라 서로 다른 문서.

분명히이 뷰는 너무 많은 결과를 반환하므로 직접 실행할 수 없습니다. O(D*D*B*M)의 순서대로, D=count(Documents), B=count(Boundary elements), and M=count(MergeTypes). 그러나 다른 쿼리에서보기를 사용하여 where 절을 사용하여 결과를 2 개의 문서와 1 개의 병합 유형으로 필터링하면 SQLite는 전체보기 결과를 생성하지 않고 where 절과 관련된 결과 만 생성한다고 생각합니다.

올바른 가정입니까? 또는 잠재적으로 엄청난 결과를 가진 뷰가 존재 함으로 인해 데이터베이스에 문제가 생길 수 있습니까?

+0

두 문서가 병합되면 "what if"의 잠재적 인 결과를 보여주는 순열 뷰를 얻은 후에 재귀 CTE를 사용하면 병합의 * 트리 *의 잠재적 결과를 보여줄 수있는 뷰를 만들 수 있다는 것을 깨달았습니다. 작업. 이러한 쿼리에 대한 자연스러운 입력은 표현 트리를 설명하는 자체 참조 테이블입니다. 그러나 일단이 입력 테이블을 얻으면 원래의 질문에 제기 된 문제는 사라집니다.보기는 표현식 트리 테이블에있는 행이 "요청한"조합을 탐색하기 때문에 사라집니다. – Dennis

답변

1

결과를 읽기 전에 완전히 계산해야하는 검색어 (예 : ORDER BY를 사용하는 검색어)가 있습니다. 하지만 가능한 경우 쿼리 최적화 프로그램은 뷰를 외부 쿼리, 즉 flatten으로 병합하려고합니다.

+0

개발 중에 직접 결과를 수동으로 확인하기 쉽도록하기 위해 종종 내 의견에 따라 주문을했기 때문에 "주문"이라고 언급 한 것을 기쁘게 생각합니다. 만약 당신이 대답을 읽지 않고 우연히 그것을 개발 한 후에 그 견해를 떠났다면, 나는 문제가 있었을 것입니다! – Dennis

+0

다른 나쁜 점도 있습니다. 링크의 목록을 참조하십시오. –

관련 문제