2011-04-26 4 views
5

최대한 빨리 테이블의 전체 내용을 메모리로 읽으 려합니다. Nexus 데이터베이스를 사용하고 있지만 델파이의 모든 데이터베이스 유형에 적용 할 수있는 몇 가지 기술이있을 수 있습니다.Nexus 데이터베이스 테이블의 빠른 읽기

내가보고있는 테이블에는 20 개의 열이있는 60,000 개의 레코드가 있습니다. 그래서 거대한 데이터 세트는 아닙니다.

  • 직접 TnxTable 더 빠른 사용하지 않고 테이블에 액세스하거나 SQL 쿼리를 사용하여보다 느린

  • '이 SELECT * FROM tablename'

    내 프로파일에서

    , 지금까지 다음과 같은 것이 발견 실제로 데이터를 읽거나 복사하지 않고 행을 반복하는 간단한 작업이 대부분의 시간을 소비합니다. 모든 레코드를 반복

내가 얻고 성능이

  • 이 값을 읽고이를 저장, 3.5 초 모든 레코드를 반복
  • 소요, 3.7 초 (즉, 0.2 초 정도 걸립니다 내 코드의 이상)

샘플

var query:TnxQuery; 
begin 
    query.SQL.Text:='SELECT * FROM TableName'; 
    query.Active:=True; 

    while not query.Eof do 
     query.Next; 

60,000 개의 행 테이블에서 3.5 초가 소요됩니다.

이 성능이 적절한가요? 데이터를 더 빨리 읽을 수있는 다른 방법이 있습니까?

현재 동일한 컴퓨터의 서버에서 데이터를 읽지 만 궁극적으로 LAN상의 다른 서버에서 데이터를 읽는 중일 수 있습니다.

+0

그 중 하나만으로도 3.5 초가 걸리지 않습니까? 아니면 루프에 다른 지침이 있습니까? 왜냐하면 당신이 데이터를 읽는다면 아마도 그럴만 한 이유가없는 것으로 유명한 FieldByName을 가지고 있기 때문입니다. – zz1433

+0

그 자체만으로도 3.5s – awmross

답변

7
당신은 최적의 읽기 속도에 대한 TnxTable로에 BlockRead 모드를 사용한다

: 당신이하는을 구체적으로 인덱스 범위를 설정해야 순차 액세스 인덱스를 사용할 수 있는지 확인하지 않는 경우,

nxTable.BlockReadOptions := [gboBlobs, gboBookmarks]; 
//leave out gboBlobs if you want to access blobs only as needed 
//leave out gboBookmarks if no bookmark support is required 

nxTable.BlockReadSize := 1024*1024; //1MB 
// setting block read size performs an implicit First 
// while block read mode is active only calls to Next and First are allowed for navigation 
try 
    while not nxTable.Eof do begin 
    // do something.... 
    nxTable.Next; 
    end; 
finally 
    nxTable.BlockReadSize := 0; 
end; 

또한 가능한 가장 빠른 액세스.

+0

WOW가 걸립니다. 총 시간이 3.7 초에서 0.5 초로 감소되었습니다. 나쁘지 않아. – awmross

+0

인덱스 관련; 테이블은 기본적으로 기본 인덱스를 사용합니다.이 경우에는 순차 액세스 인덱스입니다. 따라서 순차 액세스 색인을 사용하기 위해 아무 것도 할 필요가 없다고 생각합니다. – awmross

+1

SAI를 기본값으로 표시하고 IndexName 속성을 비워두면, SAI가 사용됩니다. –