2016-06-30 8 views
1

지난 2 년 동안 대략 200 일 동안의 목록을 보려면 KDB 데이터베이스의 데이터를 가져오고 싶습니다. 200 일은 특별한 패턴이 아닙니다.처리하기에 너무 무거운 KDB +/Q 쿼리

나는 매일 09:29:00.000 to 09:31:00.000의 데이터 만 필요합니다.

내 첫 번째 방법은사이의 시간 스탬프가있는 지난 2 년 동안의 데이터를 모두 쿼리하는 것이 었습니다. 필자가 원하는 특정 200 일을 쿼리하는 방법을 찾지 못했기 때문입니다. 그러나 이것은 내 서버가 처리하기에는 너무 많은 것으로 판명되었습니다.

그런 다음 각 날짜의 2 분 데이터를 평균으로 요약하고 평균을 인쇄하려고 했으므로 이제는 출력으로 200 행의 데이터 만 갖게됩니다. 그러나 어쨌든 이것은 여전히 ​​너무 많은 것으로 밝혀졌습니다. 데이터를 올바르게 선택하지 않기 때문에 이것이 맞는지 확실하지 않습니다.

또 다른 의문점은 쿼리가 모든 데이터를 처음으로 가비로 처리하고 각 데이터의 평균을 계산한다는 것입니다. 즉, 평균화는 처리하기 쉽지 않습니다.

select maxPriceB:max(price), minPriceB:min(price), avgPriceB:avg(price), avgSizeB:avg(qty) by date from dms where date within(2015.01.01, 2016.06,10), time within(09:29:00.000, 09:31:00.000), sym = `ZF6 

리딩 데이터가 ZFU6에있는 테이블 내가 선택 후 별개의 핵심 단어를 추가하는 시도 찾고 메신저 상징이다 : 여기 내가 가지고있는 코드입니다. 어쨌든 쿼리를 분리하거나 서버가 처리 할 수 ​​있도록 쿼리를 더 가볍게 만들 것인지를 알고 싶습니다. 감사합니다.

+0

? 이것이 다른 RDBMS라면 (날짜, 시간) 튜플에 클러스터 된 인덱스를 사용했을 것입니다. – wilx

+0

@wilx 죄송합니다. KDB와 데이터베이스 전반에 대해 매우 익숙합니다. 인덱스 란 정확히 무엇입니까? – casualprogrammer

+0

대부분의 경우 "색인"(속성)이 sym 열에 있습니다. 따라서 where 절의 순서는(), sym ='ZFU6, time within() 내에 있습니다. – terrylynch

답변

1

32 비트은 kdb +를 사용하고 악명 높은 'wsfull 오류가 발생하면 다음과 같이 한 번에 하나의 일 처리를 시도 할 수 있습니다 : 인덱스가 무엇

raze{select maxPriceB:max(price), minPriceB:min(price), avgPriceB:avg(price), avgSizeB:avg(qty) 
    from dms where date=x,sym=`ZF6,time within 09:29:00.000 09:31:00.000}each 2015.01.01+1+til 2016.06.10-2015.01.01 
+0

그리고 다중 스레드가 있다면 peach도 사용할 수 있습니다. (읽기에는 경합이있을 경우 속도가 향상되지 않습니다.) –

+0

여러 스레드가 더 많은 메모리를 필요로하면 32 비트 kbd +가 더 많이 죽을 것입니다. –

+0

@IgorKorkhov 그게 효과가! 정말 고맙습니다 – casualprogrammer