2013-04-01 1 views
0

저는 psycopg2를 통해 db를 작업 중이며 데이터베이스에서 '최신 항목'을 찾고 싶습니다. 글자 그대로 그냥 최신판을 원하기 때문에 이걸 얻기 위해 정렬을해야한다고 생각하지 않습니다. 데이터는 다음과 유사합니다.최신 항목에 해당하는 데이터 찾기

id | x | y |    param_a  |  param_b | param_c 
-------+-----+-----+----------------------------+-------------------------+---------------------------+------------+----------------+------------- 
    1 | 324 | 229 | 2013-03-27 22:41:39.052966 |  75.000 | 82.000 
    2 | 317 | 232 | 2013-03-27 22:41:39.185109 |  70.000 | 86.000 
    3 | 278 | 364 | 2013-03-27 22:41:39.203416 |  68.000 | 75.000 

# 3이 가장 최신 인 경우 (이 데이터 세트에 있음)를 가정 해 보겠습니다. 데이터가 직렬 포트를 통해 상당히 빠르게 유입되면서 데이터 세트가 시간이 지남에 따라 상당히 커질 수 있으므로 db 전체를 정렬하지 않고 찾을 수 있습니다. 나는 N 최신을 발견하기를 원한다면 나는 다음과 같은 예제 코드? 또한

conn = psycopg2.connect(database = POSTGRESQL_DATABASE, host = POSTGRESQL_SERVER, user = POSTGRESQL_USERNAME, password = POSTGRESQL_PASSWORD) 
cur = conn.cursor() 
cur.execute("") #need help here 

으로 필요 쿼리 어떤 종류의

, 큰 차이가있다?

답변

1

좋아 최선입니다 자체 이제

SELECT * FROM mytable ORDER BY param_a DESC LIMIT 1 

당신이 그 권리를 제대로 수행 할 것입니다 가정에서. 그러나 param_a에 색인을 추가하면 실제로는 매우 빠른 색인 조회를 수행 한 다음 찾고있는 레코드 하나를 가져올 수 있습니다.

그래서 PostgreSQL의 주요 문제는 쿼리를 조정하는 것이 아니라 쿼리를 빠르게 실행하도록 데이터베이스를 조정하는 것입니다. 간단한 색인은 놀라운 일을합니다. 가능한 경우

은 흥미롭게도 다음은 PostgreSQL의 두 인덱스 스캔 조회를 수행 (테이블은 충분히 큰, 충분히 선택적 데이터) :

SELECT min(param_a), max(param_a) from mytable; 

이 점을 염두에 두어야합니다. 이는 영리한 쿼리가 아니라 스마트 인덱싱을 통해 해결됩니다.