나는 두 개의 테이블이 있습니다 동일한 구조 다음 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 엔진에 도움이되지만 ... 그렇지 않습니다.
질문 : 일을 더 빠르게 만드는 방법은 무엇입니까? 문제가 발생했다고 생각하십니까?
- UNION 선택 종류에 맞지 않는 테이블 구조입니까?
- SQL 요청에서?
- 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 블록에도 불구하고 꽤 빨리 응답 할 수 있어야하므로
왜 쿼리에서 반환되는 3 천만 개의 데이터 행이 필요합니까? – mustaccio
db에서 사용 가능한 전체 실행 기록 데이터에 대해 백 테스트를 실행합니다. 데이터 자체는 메모리에 동시에 완전히로드되지 않습니다. sql-return-set이 스트리밍됩니다. – norisknofun
글쎄, 여기있다 : * 합리적인 디스크를 얻고, * 합리적인 RAM을 얻고, * 관계형 모델의 남용이기 때문에 연합을 제거하십시오. 노동 조합과 명령은 모든 결과를 temp db 공간으로 덤프합니다. 귀하의 하드 디스크는 죽은 천천히 흥분하고 모든 결과를 주문해야합니다. – TomTom