Bir tablodan son satırı almanın en hızlı yolu nedir?


11

Ben bir PostgreSQL tablo, Pricessütunlarla:

  • price (Ondalık)
  • product_id (Int)

Ayrıca created_atve updated_atsütunlar da vardır .

Fiyatlar düzenli olarak güncelleniyor ve eski fiyatları tabloya koyuyorum. Belirli bir ürün için, tablodaki son fiyat geçerli fiyattır.

Belirli bir ürün için son fiyatı almanın en verimli yolu nedir:

  • product_idSon kaydın dizini ve sorgusu
  • activeEn son fiyatı işaretlemek ve bileşik bir dizin ( product_idve active) oluşturmak için üçüncü bir sütun (Boolean) ekleyin
  • Veya başka bir şey?

4
Koşulla birlikte kısmi bir dizin kullanmak where active, muhtemelen en son ürünü almak için daha da fazla yardımcı olacaktır.
a_horse_with_no_name

Yanıtlar:


11

Çözüme bakmaksızın product_id dizinine ihtiyacınız olacaktır.

Updated_at sütununda bir dizin var ve tek ihtiyacınız belirttiğiniz gibi "belirli bir ürün" getirmektir, o zaman ben yaparım:

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

Ancak istediğim sonuçları elde etmediysem veya birçok ürün için geçerli fiyatı almam gerekirse, etkin bir sütun ekleme ve bunu yaparken yeni bir fiyat dışındaki tüm fiyatlar için N'ye ayarlama seçeneğini denerdim fiyat güncellemeleri ve sonra a_horse_with_no_name tarafından önerildiği gibi aktif nerede kısmi bir dizin oluşturmak istiyorum. Ben sadece aktif olmamak için önceki fiyat satırları güncelleme karmaşıklığı bir katman ekledi gerekirse ben oraya gitmek istiyorum.


1
Bu sorgunun etkili olabilmesi için (product_id, updated_at)açık veya açık bir indeks (product_id, updated_at DESC)gerekir. Sadece açık değil (updated_at).
ypercubeᵀᴹ

5

Veritabanınızın geri kalanı hakkında bilgi sahibi olmadan, ürün fiyatı getirmeyi hızlandırmak için normal olmayan bir form alabilir (her öğe için bir fiyat olduğu varsayılarak).

Sadece adlı yeni sütun oluşturun last_priceÇeşidi pricesizin de productmasa ve bir tetikleyici oluşturmak AFTER INSERT ON EACH ROWiçin üzerine pricemasaya. Her yeni fiyat oluşturulduğunda, ilgili ürünü en son fiyatla günceller. Bu şekilde, bir ürünü her aldığınızda, son fiyatını da alırsınız.

9.3 sürümünden bu yana, PostgreSQL somutlaştırılmış görünümleri desteklemektedir. Bu, verileri yazmak için normal bir form ve okuma için normal olmayan bir görünüm tutarak verileri denormalize etmenin güzel bir yoludur. Görünümün güncellenmesi Postgres'in LISTEN / NOTIFY mekanizması tarafından tetiklenebilir.


-1

Fiyat tablosunda bir tarih ve saat sütunu (tarihinden itibaren geçerli olacak şekilde) olmalıdır. Kullanıcı fiyatı güncellerken değerini girecektir. Bundan sonra sadece 1. sınır limitiyle getir.


Bu soruya cevap vermiyor.
Colin 't Hart
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.