aşağıdaki tabloyu aşağıdaki verilerePerformans değerleri
INSERT INTO my_table (column_1, column_2, column_3, price) VALUES
(1, NULL, 1, 54.99),
(1, NULL, 1, 69.50),
(NULL, 2, 2, 54.99),
(NULL, 2, 2, 69.50),
(3, 3, NULL, 54.99),
(3, 3, NULL, 69.50);
ile
CREATE TABLE my_table
(
record_id SERIAL,
column_1 INTEGER,
column_2 INTEGER,
column_3 INTEGER,
price NUMERIC
);
var Diyelim Şimdi tek yapmamız
CREATE TABLE my_table_aggregations AS
SELECT
ROW_NUMBER() OVER() AS aggregation_id,
column_1,
column_2,
column_3
FROM my_table
GROUP BY
column_1,
column_2,
column_3;
gibi bir şey Şimdi yapmak istediğim, my_table içindeki her record_id dosyasına bir aggregation_id atar. NULL değerlerim olduğu için, NULL = NULL
NULL olduğundan ve bu kayıtlar bu kayıtları hariç tutacağından, t1.column_1 = t2.column_1
'a bağlanamıyorum.
Şimdi ben buradaki sorun ben kayıtları yüz milyonlarca uğraşan ve çalıştırmak için sonsuza kadar sürer gibi görünüyor katılmak içinde bir ameliyathane yaşıyorum ki bu
SELECT
t.record_id,
agg.aggregation_id
FROM my_table t
JOIN my_table_aggregations agg ON
(
((t.column_1 IS NULL AND agg.column_1 IS NULL) OR t.column_1 = agg.column_1) AND
((t.column_2 IS NULL AND agg.column_2 IS NULL) OR t.column_2 = agg.column_2) AND
((t.column_3 IS NULL AND agg.column_3 IS NULL) OR t.column_3 = agg.column_3)
);
gibi bir şey kullanması gerektiğini biliyoruz.
bu
SELECT
t.record_id,
agg.aggregation_id
FROM my_table t
JOIN my_table_aggregations agg ON
(
COALESCE(t.column_1, -1) = COALESCE(agg.column_1, -1) AND
COALESCE(t.column_2, -1) = COALESCE(agg.column_2, -1) AND
COALESCE(t.column_3, -1) = COALESCE(agg.column_3, -1)
);
gibi bir şey Ama bu sorun ben -1 bu sütunların herhangi birinde hiçbir değer yoktur varsayıyorum olmasıdır olan alternatif vardır.
Not, bu aynı sonucu elde etmek için DENSE_RANK
kullanabileceğimin farkında olduğum bir örnektir. Öyleyse bunun bir seçenek olmadığını varsayalım.
COALESCE
'u kullanmaktan zevk almanın, ancak OR
'un doğru yolunu kullanarak performansını sürdürmenin bazı çılgın harika yolu var mı? Testleri çalıştırıyorum ve COALESCE
, OR
'dan 10 kat daha hızlı.
Bunu bir Greenplum veritabanında çalıştırıyorum, dolayısıyla bu performans farkının standart Postgres veritabanında aynı olup olmadığından emin değilim.
yardımcı olur. Bunun neden Postgres'de bir sorun olduğunu anlamıyorum ... –