PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Có nhà điều hành postgres CLOSEST không?

Tôi có thể hơi thiếu cú ​​pháp, nhưng truy vấn tham số hóa này (tất cả là? Lấy '1' của câu hỏi ban đầu) sẽ chạy nhanh, về cơ bản là 2 tra cứu B-Tree [giả sử số được lập chỉ mục].

SELECT * FROM
(
  (SELECT id, number FROM t WHERE number >= ? ORDER BY number LIMIT 1) AS above
  UNION ALL
  (SELECT id, number FROM t WHERE number < ? ORDER BY number DESC LIMIT 1) as below
) 
ORDER BY abs(?-number) LIMIT 1;

Kế hoạch truy vấn cho điều này với một bảng gồm ~ 5e5 hàng (với chỉ mục trên number ) trông như thế này:

psql => explain select * from (
        (SELECT id, number FROM t WHERE number >= 1 order by number limit 1) 
        union all
        (select id, number from t where number < 1 order by number desc limit 1)
) as make_postgresql_happy 
order by abs (1 - number) 
limit 1;
                                                  QUERY PLAN
--------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.24..0.24 rows=1 width=12)
   ->  Sort  (cost=0.24..0.24 rows=2 width=12)
         Sort Key: (abs((1::double precision - public.t.number)))
         ->  Result  (cost=0.00..0.23 rows=2 width=12)
               ->  Append  (cost=0.00..0.22 rows=2 width=12)
                     ->  Limit  (cost=0.00..0.06 rows=1 width=12)
                           ->  Index Scan using idx_t on t  (cost=0.00..15046.74 rows=255683 width=12)
                                 Index Cond: (number >= 1::double precision)
                     ->  Limit  (cost=0.00..0.14 rows=1 width=12)
                           ->  Index Scan Backward using idx_t on t  (cost=0.00..9053.67 rows=66136 width=12)
                                 Index Cond: (number < 1::double precision)
(11 rows)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Định dạng ngày Postgres UTC &truyền kỷ nguyên, đảo ngược ký hiệu

  2. Tên bảng động truy vấn SQL trong FOR

  3. JDBCTemplate đặt POJO lồng nhau với BeanPropertyRowMapper

  4. PostgreSQL:NGOẠI KHÓA / ON XÓA CASCADE

  5. Kết hợp các truy vấn vòng lặp lồng nhau vào kết quả mảng mẹ - pg-promise