JetIntersectIndexes 함수

적용 대상: Windows | Windows Server

JetIntersectIndexes 함수

JetIntersectIndexes 함수는 동일한 테이블에 있는 여러 보조 인덱스의 여러 인덱스 항목 집합 간의 교차를 계산합니다. 이 작업은 인덱스 범위를 사용하여 표현할 수 있는 두 개 이상의 조건과 일치하는 테이블에서 레코드 집합을 찾는 데 유용합니다.

    JET_ERR JET_API JetIntersectIndexes(
      __in          JET_SESID sesid,
      __in          JET_INDEXRANGE* rgindexrange,
      __in          unsigned long cindexrange,
      __in_out      JET_RECORDLIST* precordlist,
      __in          JET_GRBIT grbit
    );

매개 변수

sesid

이 호출에 사용할 세션입니다.

rgindexrange

JET_IndexRange 구조체의 배열에 대한 포인터입니다. 각 구조체에는 교차할 인덱스 범위 중 하나를 포함하도록 설정된 JET_TABLEID 포함됩니다. 자세한 내용은 JET_IndexRange.

cindexrange

rgindexrange 매개 변수에 포함된 배열의 JET_IndexRange 구조체 수입니다.

precordlist

JET_RECORDLIST 구조체에 대한 포인터입니다. 이 구조체는 JetIntersectIndexes의 결과로 임시 테이블을 트래버스하기에 충분한 정보로 채워집니다.

JET_RECORDLIST 구조를 수신하는 출력 버퍼입니다. 구조체에는 교차의 결과 집합에 대한 설명이 포함되어 있습니다.

grbit

다음에 사용하도록 예약됩니다.

반환 값

이 함수는 다음 반환 코드 중 하나를 사용하여 JET_ERR 데이터 형식을 반환합니다. ESE 오류에 대한 자세한 내용은 확장 가능한 스토리지 엔진 오류오류 처리 매개 변수를 참조하세요.

반환 코드

설명

JET_errSuccess

작업이 성공적으로 완료되었습니다.

JET_errClientRequestToStopJetService

JetStopService 호출로 인해 세션과 연결된 instance 모든 작업이 중단되었으므로 작업을 완료할 수 없습니다.

JET_errInstanceUnavailable

세션과 연결된 instance 해당 데이터의 무결성을 보호하기 위해 모든 데이터에 대한 액세스를 해지해야 하는 심각한 오류가 발생하여 작업을 완료할 수 없습니다.

Windows XP: 이 반환 값은 Windows XP에 도입되었습니다.

JET_errInvalidgrbit

요청된 옵션 중 하나가 잘못되었거나, 잘못 사용되었거나, 구현되지 않았습니다.

이 오류는 다음과 같은 경우 JetIntersectIndexes에서 반환됩니다 .

rgindexrange 배열의 요소가 가리키는 JET_IndexRange 구조체에 포함된 grbit은 JET_bitRecordInIndex 같지 않습니다.

JET_errInvalidParameter

제공된 매개 변수 중 하나에 예기치 않은 값 또는 다른 매개 변수의 값과 결합될 때 일치하지 않는 값이 포함됩니다.

이 오류는 다음과 같은 이유로 JetIntersectIndexes 에서 반환됩니다.

  • precordlist 매개 변수는 NULL입니다.

  • precordlist 매개 변수에 지정된 JET_RECORDLIST 구조체의 cbStruct 멤버가 JET_RECORDLIST 구조체의 크기와 같지 않습니다.

  • cindexrange 매개 변수는 0입니다.

  • cindexrange 매개 변수가 64보다 큰 경우

  • rgindexrange 매개 변수로 지정된 배열의 모든 요소에 대한 cbStruct 멤버가 JET_IndexRange 구조체의 크기와 같지 않습니다.

  • rgindexrange 배열의 요소는 서로 다른 테이블의 JET_TABLEID포함합니다.

  • rgindexrange 배열의 요소는 보조 인덱스에 배치되지 않은 JET_TABLEID 포함합니다.

  • rgindexrange 배열의 요소 중 하나 이상에는 동일한 보조 인덱스에 배치된 JET_TABLEID포함되어 있습니다.

JET_errInvalidSesid

세션 핸들이 잘못되었거나 닫힌 세션을 참조합니다.

이 오류는 모든 상황에서 반환되지 않습니다. 핸들은 최상의 노력으로만 유효성이 검사됩니다.

JET_errNotInitialized

세션과 연결된 instance 초기화되지 않았기 때문에 작업을 완료할 수 없습니다.

JET_errOutOfCursors

엔진에서 새 커서를 여는 데 필요한 리소스를 할당할 수 없어 작업이 실패했습니다. 커서 리소스는 paramid 매개 변수에 지정된 JET_paramMaxCursors사용하여 JetSetSystemParameter를 호출하여 구성됩니다.

JET_errOutOfMemory

완료할 메모리가 부족하여 작업이 실패했습니다.

호스트 프로세스의 주소 공간이 너무 조각화되면 JetIntersectIndexes는 JET_errOutOfMemory 반환할 수 있습니다. 임시 테이블 관리자는 저장할 데이터의 양에 관계없이 생성된 모든 임시 테이블에 대해 항상 1MB의 주소 공간 청크를 할당합니다. JetIntersectIndexesrgindexrange 매개 변수에 지정된 각 JET_IndexRange 대해 하나의 임시 테이블을 만들고 JET_RECORDLIST 출력에 대해 하나의 임시 테이블을 만듭니다.

JET_errRestoreInProgress

세션과 연결된 instance 복원 작업이 진행 중이므로 작업을 완료할 수 없습니다.

JET_errSessionSharingViolation

둘 이상의 스레드에서 동시에 동일한 세션을 사용하는 것은 불법입니다.

Windows XP: 이 반환 값은 Windows XP에 도입되었습니다.

JET_errTermInProgress

세션과 연결된 instance 종료 중이므로 작업을 완료할 수 없습니다.

JET_errTooManyOpenIndexes

엔진이 테이블의 인덱스를 캐시하는 데 필요한 리소스를 할당할 수 없어 작업이 실패했습니다. 스키마를 캐시할 수 있는 인덱스의 수는 paramid 매개 변수에 지정된 JET_paramMaxOpenTablesJetSetSystemParameter를 사용하여 구성됩니다.

JET_errTooManyOpenTables

엔진이 테이블의 스키마를 캐시하는 데 필요한 리소스를 할당할 수 없어 작업이 실패했습니다. 스키마를 캐시할 수 있는 테이블 수는 paramid 매개 변수에 지정된 JET_paramMaxOpenTablesJetSetSystemParameter를 사용하여 구성됩니다.

JET_errTooManySorts

엔진이 임시 테이블을 만드는 데 필요한 리소스를 할당할 수 없어 작업이 실패했습니다. 임시 테이블 리소스는 paramid 매개 변수에 지정된 JET_paramMaxTemporaryTables JetSetSystemParameter를 사용하여 구성됩니다.

성공하면 각 입력 인덱스 범위 설명이 나타내는 조건과 일치하는 레코드의 책갈피를 포함하는 새 임시 테이블이 반환됩니다.

실패 시 결과가 포함된 임시 테이블은 만들어지지 않습니다. 임시 데이터베이스의 상태가 변경될 수 있습니다. 데이터베이스 엔진에서 사용 중인 일반 데이터베이스의 상태는 변경되지 않습니다. 이 함수에 제공된 JET_TABLEID현재 위치가 변경될 수 있습니다.

설명

이러한 조건을 해당 테이블에 대한 보조 인덱스 측면에서 표현할 수 있는 경우 JetIntersectIndexes를 사용하여 테이블의 레코드를 여러 조건으로 효율적으로 필터링할 수 있습니다. 예를 들어 사용자를 포함하는 매우 큰 테이블이 있다고 생각해 보세요. 테이블에는 사용자 ID, 이름, 성 등에 대한 열이 있을 수 있습니다. 이러한 각 열이 별도로 인덱싱되고 테이블의 기본 인덱스가 사용자 ID를 초과한다고 가정합니다. 이름이 A로 시작하고 성이 G로 시작하는 모든 사용자를 찾으려면 다음 단계를 수행합니다.

  1. 테이블에서 새 커서를 열고 "이름" 열에서 인덱스를 사용하도록 해당 커서를 설정합니다. 그런 다음 "이름"이 'A'로 시작된 모든 사용자에 대해 인덱스 범위를 설정하여 이 커서가 포함된 JET_IndexRange 구조체를 빌드합니다.

  2. "성"이 'G'로 시작된 모든 사람의 "성" 인덱스에 새 커서를 사용하여 1단계를 반복합니다.

  3. 이러한 조건을 JetIntersectIndexes 에 전달하여 결과를 임시 테이블로 계산합니다.

  4. 임시 테이블을 트래버스하고 책갈피로 조건을 전달하는 각 레코드를 검색합니다.

결과 집합을 포함하는 임시 테이블은 교차를 계산하는 데 사용되는 모든 조건을 통과한 각 레코드의 책갈피를 포함하는 하나의 열이 있는 간단한 테이블입니다. 결과 집합은 기본 인덱스와 동일한 순서로 정렬되며 중복 항목이 없습니다. 애플리케이션은 임시 테이블의 행을 열거하고 JetRetrieveColumn을 사용하여 각 결과에 대한 책갈피를 검색한 다음 주 인덱스에 배치된 커서에서 해당 책 갈피가 있는 JetGotoBookmark 를 호출하여 데이터베이스의 레코드를 방문하여 교차 결과를 열거할 수 있습니다.

JetIntersectIndexes에서 반환된 임시 테이블은 정방향으로만 검사할 수 있습니다. 또한 검사가 완료되면 JetCloseTable 을 통해 닫아야 합니다. 임시 테이블 및 작동 방식에 대한 자세한 내용은 JetOpenTemporaryTable을 참조하세요.

JetIntersectIndexes 는 일반적으로 여러 인덱싱된 조건에 따라 레코드를 필터링하는 효율적이고 편리한 방법입니다. 그러나 이 기능의 유용성을 최대화하기 위해 따라야 할 몇 가지 중요한 팁이 있습니다. 조건 중 하나가 너무 제한적이어서 결과 인덱스 범위에 레코드가 거의 없다는 것을 알고 있는 경우 단순히 해당 인덱스 범위를 탐색하고 애플리케이션 수준에서 레코드를 필터링하는 것이 좋습니다. 또한 교집합의 다른 기준보다 훨씬 덜 제한적인 기준이 있다는 것을 알고 있는 경우 교차점에서 훨씬 덜 제한적인 조건을 삭제하는 것이 좋습니다. 마지막으로, 기준 중 하나가 전혀 제한적이지 않아 결과 인덱스 범위가 주 인덱스만큼 크다는 것을 알고 있는 경우 해당 인덱스 범위와 교차하면 결과 집합의 크기를 줄이면 도움이 될 가능성이 거의 없습니다. 모든 경우에 입력에서 가능한 인덱스 항목이 가장 적고 최대 성능을 위해 출력에서 가장 구체적인 책갈피 집합을 생성하는 방식으로 조건을 선택해야 합니다.

요구 사항

요구 사항

클라이언트

Windows Vista, Windows XP 또는 Windows 2000 Professional이 필요합니다.

서버

Windows Server 2008, Windows Server 2003 또는 Windows 2000 Server가 필요합니다.

머리글

Esent.h에서 선언되었습니다.

라이브러리

ESENT.lib를 사용합니다.

DLL

ESENT.dll 필요합니다.

참고 항목

JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JET_IndexRange
JET_RECORDLIST
JetGotoBookmark
JetRetrieveColumn
JetSetIndexRange