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


11

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

  • price (소수)
  • product_id (Int)

도 있습니다 created_at및 updated_at열.

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

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

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

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 ROW온 price테이블을. 새로운 가격이 생성 될 때마다 관련 제품이 최신 가격으로 업데이트됩니다. 이렇게하면 제품을 가져올 때마다 마지막 가격도 가져옵니다.

버전 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.