2012-12-20 3 views
1

문제점 : 사용자에게 Excel-Grid 형 클라이언트 측 응용 프로그램을 제공하고 싶습니다. 해당 클라이언트는 네트워크 연결을 통해 PostgreSQL-Server에 액세스합니다. 클라이언트는 "찾기"기능을 제공합니다. 필터링하고 일치하는 결과 만 표시하는 대신 "찾기"- 함수는 Grid에서 첫 번째로 일치하는 행으로 점프합니다. 합니다 (Excel에서 α- 함수를 "찾기"처럼)인덱스를 사용하여 첫 번째 검색 결과에 스크롤러 커서

이-선택 오프셋 대역폭 사용을 줄이고 절름발이 LIMIT을 방지/위해, 나는 분류 표를 통해 스크롤 할 수 있도록 서버 측 커서와 PostgreSQL을 사용하고 있습니다 :

결과 데이터의
BEGIN WORK; 
DECLARE mCursor SCROLL CURSOR FOR 
    SELECT * 
    FROM table 
    ORDER BY xyz 

스크롤 및 검색이 이동을 호출하여 처리/그리드 내에서 클라이언트 스크롤 할 때마다 가져 오기 :

MOVE FORWARD/BACKWARD <offset> IN mCursor; FETCH 40 FROM mCursor; 

지금 내가를 추가 할이 "찾기"를 -Functionality 마녀가 사용하는 처음으로 일치하는 결과 - 꺼짐을 찾기위한 색인 et.

SELECT t.rowNo 
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY ColumnName ASC) AS rowNo 
    FROM table 
) t 
WHERE t.ColumnName LIKE 'xyz%' 
LIMIT 1 

문제 :이 쿼리가 매우 느리다는 사용할 수 없기 때문에 나는이 기능을 통합 알고있는 유일한 방법은 반환 rowNo로 커서를 새 연결을 열고 다음 쿼리를 실행 한 후 이동하는 것입니다 색인 (~ 300k 행에 대해 2-3 초).

이 작업을보다 효율적으로 통합 할 수있는 다른 방법이 있습니까?

어쩌면 인덱스 데이터에서 직접 오프셋을 읽을 수 있습니까? 또는 커서 내에서 쿼리를 시작하면됩니까? 아니면이 기능을 허용하는 데이터베이스 시스템이 있습니까?

+0

까지 스캔 제한 할 것이다. 그것은 질의하는 클라이언트에 도움이되지 않습니다. 해결하려는 문제에 대해 더 잘 설명해 주시겠습니까? –

+0

클라이언트가 무엇입니까? 그것은 뚱뚱한 경우 다음 클라이언트에서 상태를 유지하고 클라이언트 쪽 커서를 서버 쪽이 아닌 사용할 수 있습니다. HTML 클라이언트 인 경우 커서없이 수행하십시오. –

+0

뚱뚱한 사람 (Java 응용 프로그램). 그러나 커서는 문제가 아닙니다. 질문은 전에 모든 행을 세지 않고 오프셋 위치를 찾는 방법입니다. –

답변

1

패턴이 %으로 시작된 경우에만 인덱스를 사용할 수 없습니다.

문제는 인덱스를 사용할 수 없다는 것이 아니라 모든 테이블 행을 열거하기 위해 전체 인덱스를 스캔해야한다는 것입니다. 설명을 보여주세요.

인덱스가 서버 측 커서 인 패턴 검색

SELECT min(t.rowNo) 
FROM (
    SELECT 
     ROW_NUMBER() OVER (ORDER BY ColumnName ASC) AS rowNo, 
     ColumnName 
    FROM table 
    where ColumnName <= 'xyz' || repeat('z', 100) -- Get all possible like 'xyz%' 
) t 
WHERE t.ColumnName LIKE 'xyz%' 
관련 문제