테이블에서 마지막 행을 가져 오는 가장 빠른 방법은 무엇입니까?


11

Prices열 이있는 PostgreSQL 테이블 이 있습니다.

  • price (소수)
  • product_id (Int)

도 있습니다 created_atupdated_at열.

가격은 정기적으로 업데이트되며 이전 가격을 표에 유지합니다. 특정 제품의 경우 표의 마지막 가격이 현재 가격입니다.

특정 제품의 최종 가격을 얻는 가장 효율적인 방법은 무엇입니까?

  • product_id마지막 레코드에 대한 인덱스 및 쿼리
  • 세 번째 열 active(부울)을 추가 하여 최신 가격을 표시하고 복합 지수 ( product_idactive)를 만듭니다.
  • 또는 다른 것?

4
조건과 함께 부분 인덱스를 사용 where active하면 최신 제품을 더 많이 검색하는 데 도움이 될 것입니다.
a_horse_with_no_name

답변:


11

솔루션에 관계없이 product_id에 대한 색인이 필요합니다.

updated_at 열에 색인이 있고 명시된대로 "특정 제품"을 가져 오는 것만 필요하면 다음을 수행합니다.

select *
from Prices
where product_id = ?
order by updated_at desc 
limit 1

그러나 원하는 결과를 얻지 못하거나 많은 제품의 현재 가격을 얻으려면 활성 열을 추가하고 수행 할 때 새 열 이외의 모든 가격에 대해 N으로 설정하는 옵션을 시도합니다 가격을 업데이트 한 다음 a_horse_with_no_name에서 제안한대로 활성화 된 부분 인덱스를 만듭니다. 이전 가격 행을 활성화하지 않도록 업데이트하는 복잡한 계층을 추가하기 때문에 필요한 경우에만 갈 것입니다.


1
이 쿼리에 인덱스를 필요로 (product_id, updated_at)하거나에 - (product_id, updated_at DESC)효율적으로 -. 뿐만 아니라 (updated_at).
ypercubeᵀᴹ

5

데이터베이스의 나머지 부분에 대한 지식이 없으면 제품 가격 반입 속도를 높이기 위해 약간의 비정규 형태를 감당할 수 있습니다 (각 품목에 대해 하나의 가격이 있다고 가정).

그냥라는 새 열 생성 last_price유형의 price당신의 product테이블과 트리거 만드는 AFTER INSERT ON EACH ROWprice테이블을. 새로운 가격이 생성 될 때마다 관련 제품이 최신 가격으로 업데이트됩니다. 이렇게하면 제품을 가져올 때마다 마지막 가격도 가져옵니다.

버전 9.3부터 PostgreSQL은 구체화 된 뷰를 지원합니다. 이것은 데이터를 비정규 화하고 쓰기를위한 일반적인 형식과 비정규 화 된보기를 유지하는 좋은 방법입니다. 뷰의 업데이트는 Postgres의 LISTEN / NOTIFY 메커니즘에 의해 트리거 될 수 있습니다.


-1

가격표에 wef 날짜 및 시간 열 (효과가 있음)이 있어야합니다. 사용자는 가격을 업데이트하면서 값을 입력합니다. 그런 다음 desc wef limit 1의 값만 가져옵니다.


이것은 질문에 대답하지 않습니다.
Colin 't Hart
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.