2014-11-05 3 views
0

나는 두 개의 테이블이 있습니다 동일한 구조 다음 bal1 및 bal2 :큰 테이블과 UNION 공연

CREATE TABLE bal1 
( ts timestamp without timezone, 
    bid double precision, 
    ask double precision 
    CONSTRAINT bal1_pkey PRIMARY KEY (ts) 
); 


CREATE TABLE bal2 
( ts timestamp without timezone, 
    bid double precision, 
    ask double precision 
    CONSTRAINT bal2_pkey PRIMARY KEY (ts) 
); 

'TS'열이 기본 키입니다.

NB : bal1 & bal2는 각각 15,000,000 라인을 갖는다.

타임 스탬프로 정렬 된 2 개의 테이블의 조합을 요청하고 싶습니다. 하는 코어 i7에 ~ 6기가바이트, 7,200t/m 디스크를 10 분 :

SELECT t.ts, t.bid, t.ask 
FROM 
((SELECT ts, bid, ask FROM bal1 ORDER BY ts ASC) 
union 
(SELECT ts, bid, ask FROM bal2 ORDER BY ts ASC)) t 
ORDER BY t.ts ASC 

그러나이 요청은 반환 데이터에 대한 무한한 시간이 소요 : 은 그래서 실행합니다. "ORDER BY"절을 추가하면 DB 엔진에 도움이되지만 ... 그렇지 않습니다.

질문 : 일을 더 빠르게 만드는 방법은 무엇입니까? 문제가 발생했다고 생각하십니까?

  1. UNION 선택 종류에 맞지 않는 테이블 구조입니까?
  2. SQL 요청에서?
  3. db 자체? Postgres는이 용도에 맞습니까? Oracle 또는 MySql을 사용하면 더 좋습니다.

모든 데이터를 단일 테이블에 넣고 제품 1과 제품 2를 나타내는 productid integer 열을 주저합니다. 될 수있는 것보다 은 SQL 요청 :

SELECT productid, ts, bid, ask 
FROM bal 
WHERE productid=1 or productid=2 
ORDER BY ts ASC 

이 수정은 시간이 많이 걸리는 날 내가 당신을 좋아하는 것입니다 그런 식으로 커밋하기 전에 조언한다.

마지막 일 : I 요청이 여러 UNION 블록에도 불구하고 꽤 빨리 응답 할 수 있어야하므로

+0

왜 쿼리에서 반환되는 3 천만 개의 데이터 행이 필요합니까? – mustaccio

+0

db에서 사용 가능한 전체 실행 기록 데이터에 대해 백 테스트를 실행합니다. 데이터 자체는 메모리에 동시에 완전히로드되지 않습니다. sql-return-set이 스트리밍됩니다. – norisknofun

+0

글쎄, 여기있다 : * 합리적인 디스크를 얻고, * 합리적인 RAM을 얻고, * 관계형 모델의 남용이기 때문에 연합을 제거하십시오. 노동 조합과 명령은 모든 결과를 temp db 공간으로 덤프합니다. 귀하의 하드 디스크는 죽은 천천히 흥분하고 모든 결과를 주문해야합니다. – TomTom

답변

3

order by도움이되지 않습니다 ... 더 많은 제품. (3,4,5, 등)을 추가 할 계획 SQL 엔진. 추가 작업이 추가됩니다. 또한 union은 중복을 제거해야합니다.

당신이 적절한 인덱스 훨씬 더 빨리, 훨씬 작동하는지 찾을 수 있습니다 : 물론

SELECT ts, bid, ask 
FROM bal1 
UNION ALL 
SELECT ts, bid, ask 
FROM bal2 b2 
WHERE NOT EXISTS (SELECT 1 FROM bal1 b1 WHERE b1.ts = b2.ts and b1.bid = b2.bid and b1.ask = b2.ask) 

,이 테이블 내에서 중복을 를 제거하지 않습니다. 필요한 경우 두 selectsdistinct을 추가해야합니다.

색인은 bal1(ts, bid, ask)입니다.

필요에 따라 order by ts을 쿼리에 추가 할 수 있습니다. 처리에 시간이 더 걸릴 것입니다.

+0

이것이 나의 문제 다 : 나는 모른다. UNION이 데이터를 제거하길 원합니다! 데이터에 doublons이 없다면 신경 쓰지 마세요. – norisknofun

+0

이미 언급 한 내용을 추가하면 전체 테이블을 읽으므로 데이터베이스 엔진이 최적화하기 위해 할 수있는 일이 많지 않습니다. 디스크 및 메모리 처리량에 의해 제한됩니다. – mustaccio

1

여기에서 그가 잘못된 문제를 해결합니다. 문제는 순서가 아닙니다. 잘못된 기술을 사용하여 시작합니다.

먼저 여러 개의 테이블을 가지는 것은 의미가 없습니다. 데이터베이스를 사용하고 적절한 인덱스를 사용해야하는 경우 하나를 모두 저장하십시오. 그리고 하드웨어 - 6GB 메모리는 7200RPM SATA 디스크가 아닌 지속될 것입니다.복수의 SSD에 대한 RAID 0은 처리를 통해 주문에 도움이 될 수 있지만 깨진 디자인입니다.

여기에 비슷한 일을하고 기본적으로 http://www.trade-robots.com/blog/how-to-efficiently-store-and-read-tick-data

에 대해 블로그 :

  • 나는 파일의 가격 데이터를 저장합니다. 그것은 관계형이 아니며 원시 데이터를 실제로 분석하지 않습니다. 단지 재생 만합니다. 왜 데이터베이스를 저장합니까?
  • 나는 그것을 선형 적으로 읽었다.

내 백 테스트 클러스터는 초당 6-7 기가비트의 데이터를 처리하고 있으며 대기 시간 문제가 없습니다. 즉, 나는 10 기가비트 네트워크에서이를 실행하고 데이터는 SSD 캐시가있는 RAID 10에서 8 개의 벨로시 랩터에서 나옵니다. 파일 서버는 8GB 메모리로 제한된 가상 시스템입니다. 따라서 적절한 결과를 얻을 수는 있지만 올바른 도구를 사용해야합니다. 데이터베이스에 대한 결정을 내렸지 만, 시계열에 대한 특별 데이터베이스 (정상적인 관계형 데이터베이스가 아님)와 그처럼 부러진 디자인을 가진 사람이 아닙니다 (왜 노조를 시작해야할까요?)

누구에게나 이것은 대답이라고 생각하지 않습니다. 그렇습니다. 이 접근법은 핵심 문제를 해결합니다. 그리고 그것은 노동 조합 성과가 아닙니다. 이 경우 상자를 둥근 구멍에 넣으려고합니다.

+0

나는 그것을위한 ressources가 없다. 그게 바로 DB가되는 이유입니다. – norisknofun

+0

LESS 리소스를 사용하는 솔루션 리소스가 없으므로 더 많은 리소스를 사용하는 db에없는 리소스를 사용할 수 있습니다. 워크 스테이션에서 일주일에 한 번씩 데이터를 읽습니다. 디버깅하는 동안 1.5 초가 걸렸습니다. 그것은 모든 입찰/요청과 함께 ES 데이터입니다. 나는 당신보다 적은 자원을 사용합니다. 잘못된 기술. – TomTom