apache / apache/iceberg-python

Upsert gets slow on tables with many columns

Offen
#3,860 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Python
Sterne
1.1k
Forks
581
Ø Merge
1 T. 17 Std.
Gemergte PRs (30 T.)
77

Beschreibung

### Feature Request / Improvement

`upsert` compares the matched rows one cell at a time, so it gets slower with every extra column, not just with every extra row.

On a table with 200 columns, comparing 20k matched rows takes around 20 seconds on my machine, before anything is written.

To reproduce:

```python
import time
import pyarrow as pa
from pyiceberg.table.upsert_util import get_rows_to_update

rows, cols = 20_000, 200
table = pa.table({"pk": pa.array(range(rows)), **{f"c{i}": pa.array([float(i)] * rows) for i in range(cols)}})

start = time.monotonic()
get_rows_to_update(table, table, ["pk"]) # nothing has changed
print(time.monotonic() - start)
```

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Beginnen Sie mit pyiceberg.table.upsert_util.get_rows_to_update und führen Sie die bereitgestellte PyArrow-Reproduktion mit 20,000 Zeilen und 200 Spalten aus. Vergleichen Sie das aktuelle Verhalten bei unveränderten Tabellen und verfolgen Sie, wo übereinstimmende Zeilen verglichen werden; abgeschlossen ist die Aufgabe, wenn der Vergleich eines unveränderten upsert den gemeldeten spaltenabhängigen Performanceeinbruch vermeidet und dabei die erwarteten zu aktualisierenden Zeilen beibehält.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
databases, performance
Issue-Typ
Feature
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Aktiv
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
68/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.