2016-06-03 1 views
0

다음 표가 있습니다.INSERT 쿼리에서 WHERE BETWEEN 절을 어떻게 사용할 수 있습니까?

이 테이블은 지나치게 자세히 설명하지 않고 모든 전자 요청과 광고 노출을 전국의 전자 스크린에 기록합니다. 이 테이블은 또한 보고서를 생성하는 데 사용되며 + 5 천만 개의 레코드로 구성됩니다.

현재 보고서는 created_at 시간 소인에서 필터링됩니다. 5 천만 개가 넘는 레코드를 사용하면 created_at 열에 대한 인덱스를 사용해도 쿼리가 느려질 것이라고 상상할 수 있습니다. 보고서는 시스템의 UI에서 데이터를 요청할 날짜를 선택하여 생성됩니다.

년, 월 및 일 열은 방금보고를보다 효율적으로 만들기 위해 추가 한 새로운 열입니다. 날짜에 대해 색인을 작성하는 대신 시스템에 1 년, 1 개월 및 1 일의 모든 별도의 값을 색인화합니다.

새로 추가 된 열은 여전히 ​​비어 있습니다. created_at 열이 두 날짜 사이에있는 값을 삽입하는 쿼리를 실행하려고합니다. 예 :

INSERT INTO ad (year) VALUES (2016) WHERE created_at BETWEEN '2016-01-01 00:00:00' AND '2016-12-31 23:59:59'; 

물론 이것은 작동하지 않습니다. 인터넷에서 INSERT 문이 WHERE BETWEEN 절을 사용하는 부분을 찾지 못하는 것 같습니다. 또한 하위 쿼리 및 WITH 절을 사용하여 generate_series를 사용하여 2012 년과 2020 년 사이에 일련의 연도를 생성했습니다. 그것 모두는 잘 풀리지 않았다.

+2

는'INSERT' 새로운 행을 삽입), 당신은에'UPDATE' 기존 행을 원한다. – klin

답변

4

새 행을 삽입하지 않으려면 테이블을 업데이트해야합니다.

UPDATE table_name 
SET column1=value1,column2=value2,... 
WHERE column_name BETWEEN value1 AND value2; 

그렇지 않으면 100 milions 행을해야합니다;

+0

아, 나는 방금 그것을 알아 차렸다. 나는 항상 기존 행에 삽입 할 수 있다고 생각했습니다. 문제는 UPDATE가 5 천만 건이 넘는 속도가 매우 느리지 만 또 다른 해결책을 찾을 수 있다는 것입니다. 귀하의 답변에 감사드립니다. –

+0

물론, insert 문은 올바른 접근법이 아니므로 행을 업데이트해야합니다. 성능을 위해 db 논리 구조에서 허용하는 경우 여러 개의 하위 테이블에서 테이블을 분할 할 수 있습니다. – lubilis

관련 문제