PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Lambat LEFT JOIN di CTE dengan interval waktu

Yang benar adalah yang utama :Saya menduga ada bug dalam kueri Anda:

 LEFT JOIN historical_ohlcv ohlcv ON ohlcv.time_open >= g.start_time
                                 AND ohlcv.time_close < g.end_time

Tidak seperti jawaban referensi saya, Anda bergabung pada interval waktu :(time_open, time_close] . Cara Anda melakukannya mengecualikan baris dalam tabel di mana interval melintasi batas ember. Hanya interval yang terisi penuh dalam satu ember yang dihitung. Saya tidak berpikir itu dimaksudkan?

Perbaikan sederhana adalah memutuskan keanggotaan bucket berdasarkan time_open (atau time_close ) sendiri. Jika Anda ingin tetap bekerja dengan keduanya, Anda harus mendefinisikan dengan tepat cara menangani interval yang tumpang tindih dengan banyak ember.

Juga, Anda mencari max(high) per ember, yang sifatnya berbeda dari count(*) dalam jawaban referensi saya.

Dan ember Anda adalah interval sederhana per jam?

Kemudian kita dapat menyederhanakan secara radikal. Bekerja hanya dengan time_open :

SELECT date_trunc('hour', time_open) AS hour, max(high) AS max_high
FROM   historical_ohlcv
WHERE  exchange_symbol = 'BINANCE'
AND    symbol_id = 'ETHBTC'
AND    time_open >= now() - interval '5 months'  -- frame_start
AND    time_open <  now()                        -- frame_end
GROUP  BY 1
ORDER  BY 1;

Terkait:

  • Contoh ulang data deret waktu

Sulit untuk berbicara tentang pengoptimalan kinerja lebih lanjut sementara dasar-dasarnya tidak jelas. Dan kami membutuhkan lebih banyak informasi.

Apakah WHERE variabel kondisi?
Berapa banyak nilai yang berbeda dalam exchange_symbol dan symbol_id ?
Rata-rata ukuran baris? Apa yang Anda dapatkan untuk:

SELECT avg(pg_column_size(t)) FROM historical_ohlcv t TABLESAMPLE SYSTEM (0.1);

Apakah tabel hanya-baca?

Dengan asumsi Anda selalu memfilter exchange_symbol dan symbol_id dan nilainya bervariasi, tabel Anda hanya-baca atau autovacuum dapat mengikuti beban tulis sehingga kami dapat berharap untuk pemindaian hanya-indeks, sebaiknya Anda memiliki indeks multikolom pada (exchange_symbol, symbol_id, time_open, high DESC) untuk mendukung pertanyaan ini. Indeks kolom dalam urutan ini. Terkait:

  • Indeks dan kinerja multikolom

Bergantung pada distribusi data dan detail lainnya LEFT JOIN LATERAL solusi mungkin pilihan lain. Terkait:

  • Cara mencari nilai rata-rata untuk interval waktu di postgres
  • Optimalkan kueri GROUP BY untuk mengambil data terbaru per pengguna

Selain semua itu, Anda EXPLAIN plan menunjukkan beberapa sangat perkiraan buruk :

  • https://explain.depesz.com/s/E5yI

Apakah Anda menggunakan saat ini versi Postgres? Anda mungkin harus bekerja pada konfigurasi server Anda - atau setidaknya menetapkan target statistik yang lebih tinggi pada kolom yang relevan dan pengaturan autovacuum yang lebih agresif untuk tabel besar. Terkait:

  • Jauhkan PostgreSQL dari terkadang memilih paket kueri yang buruk
  • Autovacuum Agresif di PostgreSQL



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan Fungsi Korelasi PostgreSQL

  2. Meningkatkan kecepatan kueri:SELECT sederhana di tabel postgres besar

  3. GroupingError:ERROR:kolom harus muncul di klausa GROUP BY atau digunakan dalam fungsi agregat

  4. Python Postgres psycopg2 ThreadedConnectionPool habis

  5. Server PostgreSQL tidak akan mati di Lion (Mac OS 10.7)