TGViewer
Data Science. SQL hub Data Science. SQL hub @sqlhub · 36K subscribers
Post #555 3.17K
🦆 DuckDb: эффективная OLAP-база данных

DuckDB набирает популярность, поскольку столбцово-векторный механизм этой базы данных позволяет выполнять аналитические типы запросов. Это аналитическая или OLAP-версия SQLite, широко распространенной встроенной СУБД.

Хотя DuckDB  —  это СУБД, ее установка проще по сравнению с Microsoft SQL Server и Postgres. Кроме того, для выполнения запроса не требуется никаких внешних зависимостей. Выполнить SQL-запрос можно с помощью DuckDb CLI.

Если вы предпочитаете интерфейс SQL, DuckDb может стать для вас лучшей альтернативой анализу данных непосредственно в CSV или Parquet-файлах. Продолжим с примерами кода и одновременно покажем, насколько просто работать с SQL в DuckDb.

В DuckDb есть функция read_csv_auto для вывода CSV-файла и загрузки этих данных в память. Во время выполнения было обнаружено, что нужно изменить SAMPLE_SIZE=-1, чтобы пропустить выборку, так как некоторые поля в наборе данных не были выведены правильно, а выборка по умолчанию составляет 1000 строк.

import duckdb
from repeat_helper import repeat_executor

con = duckdb.connect(database=':memory:')
con.execute("""CREATE TABLE parking_violations AS SELECT "Summons Number", "Vehicle Make", "Issue Date" FROM read_csv_auto('/Users/chengzhizhao/projects/pandas_alternatives/Parking_Violations_Issued_-_Fiscal_Year_2017.csv', delim=',', SAMPLE_SIZE=-1);""")
con.execute("""SELECT COUNT(1) FROM parking_violations""")
print(con.fetchall())

# ## Фильтрация по марке автомобиля (для BMW)
@repeat_executor(times=5)
def test_filter():
con.execute("""
SELECT * FROM parking_violations WHERE "Vehicle Make" = 'BMW'
""")
return con.fetchall()

# # ## Группировка по марке автомобиля и подсчет
@repeat_executor(times=5)
def test_groupby():
con.execute("""
SELECT COUNT("Summons Number") FROM parking_violations GROUP BY "Vehicle Make"
""")
return con.fetchall()

# # # ## SELF join
@repeat_executor(times=5)
def test_self_join():
con.execute("""
SELECT a."Summons Number"
FROM parking_violations a
INNER JOIN parking_violations b on a."Summons Number" = b."Summons Number"
""")
return con.fetchall()

# ## оконная функция
@repeat_executor(times=5)
def test_window_function():
con.execute("""
SELECT *, ROW_NUMBER() OVER (PARTITION BY "Vehicle Make" ORDER BY "Issue Date")
FROM parking_violations
""")
return con.fetchall()
test_filter()

# Время медианы - 0.410 с
test_groupby()
# # Время медианы - 0.122 с
test_self_join()
# # Время медианы - 3.364 с
test_window_function()
# # Время медианы - 6.466 с


Тест фильтрации показал достижение паритета, а в остальных трех тестах производительность намного выше по сравнению с Pandas.

Чтобы не писать на Python, можно использовать DuckDb CLI с SQL-интерфейсом в командной строке или TAD.

https://duckdb.org/

@sqlhub
  • 👍 11
  • ❤ 3
  • 🔥 2
More from @sqlhub
  1. Oct 7, 2026🌍 SQL-задача: ближайшие точки на замкнутой карте Карта 100 × 100: противоположные края со…
  2. Oct 7, 2026ИИ-агент, который только отвечает на вопросы, — это уже прошлый этап. Следующий шаг — науч…
  3. Oct 6, 2026⚡️ SQL с подвохом: NULL в пустом списке Что выведет PostgreSQL? SELECT NULL IN (SELECT 1 W…
  4. Oct 3, 2026DOOM запустили внутри SQL-базы. Каждый кадр теперь результат запроса 🤯 Лукас Фогель собра…
  5. Oct 3, 2026Из аналитика в дата-инженеры: переход реален? 🤔 В последнее время все чаще дата-инженерия…
  6. Oct 2, 2026🧠 TIL: SQLite превращает числа в текст сразу по две цифры Обычно integer → string делают…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →