Skip to content

Instantly share code, notes, and snippets.

@vhood
Last active January 24, 2024 06:57
Show Gist options
  • Save vhood/c4d7ae1bdc9263f31b288384f0a30f0d to your computer and use it in GitHub Desktop.
Save vhood/c4d7ae1bdc9263f31b288384f0a30f0d to your computer and use it in GitHub Desktop.
Базы данных

Функции

Агрегатные: SUM, COUNT, AVG, MAX, MIN

Ранжирующие:

  • ROW_NUMBER – функция возвращает номер строки и используется для нумерации
  • RANK — функция возвращает ранг каждой строки. В данном случае значения уже анализируются и, в случае нахождения одинаковых, возвращает одинаковый ранг с пропуском следующего значения
  • DENSE_RANK — функция возвращает ранг каждой строки. Но в отличие от функции RANK, она для одинаковых значений возвращает ранг, не пропуская следующий
  • NTILE – это функция, которая позволяет определить к какой группе относится текущая строка. Количество групп задается в скобках

Функции смещения:

  • LAG или LEAD – функция LAG обращается к данным из предыдущей строки окна, а LEAD к данным из следующей строки. Функцию можно использовать для того, чтобы сравнивать текущее значение строки с предыдущим или следующим. Имеет три параметра: столбец, значение которого необходимо вернуть, количество строк для смещения (по умолчанию 1), значение, которое необходимо вернуть если после смещения возвращается значение NULL
  • FIRST_VALUE или LAST_VALUE — с помощью функции можно получить первое и последнее значение в окне. В качестве параметра принимает столбец, значение которого необходимо вернуть

Аналитические:

  • CUME_DIST — вычисляет интегральное распределение (относительное положение) значений в окне
  • PERCENT_RANK — вычисляет относительный ранг строки в окне
  • PERCENTILE_CONT — вычисляет процентиль на основе постоянного распределения значения столбца. В качестве параметра принимает процентиль, который необходимо вычислить (в этой статье я рассказываю как посчитать медиану, благодаря этой функции)
  • PERCENTILE_DISC — вычисляет определенный процентиль для отсортированных значений в наборе данных. В качестве параметра принимает процентиль, который необходимо вычислить

Индексы

Кластерный - как правило PRIMARY KEY. Определяет порядок, в котором данные хранятся в таблице, может быть только один. Если таблица не имеет кластерный индекс, то она является кучей. Кластерный индекс не хранится отдельно.

Не кластерный имеет ссылку на строку, после поиска в нем будет выборка конкретной строки (если он не покрывающий). Хранится отдельно.

Некоторые СУБД поддерживают include в индексе, колонки из include не отсортированы (быстрее вставка в индекс).

Операции:

  • Scan: O(n) - выборка всех данных для работы с ними
  • Seek: log(n) - поиск по данным

Иногда полный скан быстрее, чем поиск (если мало данных).

Индексы в PostgreSQL:

  • RUM - для полнотекстового поиска
  • GIN - для массивов и json, при поиске по ключу
  • "Частичный" - можно повесить на выборку, а не на таблицу
  • "Функциональный" - можно повесить на функцию, а не на таблицу
  • Другие:
    • GiST - R-Tree
    • SP-GiST - для k-префиксных деревьев
    • HASH - не пишется в лог, строится в джйонах
    • BitMAP - нельзя построить, мапит количество строк

Транзакции

Группа последовательных операций с базой данных, которые проходят как единое целое

ACID свойства транзакций

Atomicity (Атомарность)

Либо все операции будут полностью выполнены, либо не будет выполнена ни одна операция

Consistency (Консистентность, Согласованность)

Транзакция фиксирует только допустимые результаты

Isolation (Изолированность)

Параллельные транзакции не влияют на результат текущей

Уровни изоляции по степени строгости:

Read Uncommited

При SELECT считывать данные даже не завершенных транзакций, самые новые

Read Commited

При SELECT считывать закоммиченные другими транзакциями данные

Repeatable read

При первом SELECT считывать данные один раз, при последующих использовать значение первого

Snapshot isolation

Читать во время транзакции только те данные, которые были на момент ее старта

Serializable (Специальный тип, не по сложности)

Выстроить все параллельные транзакции в очередь

Durability (Отказоустойчивость)

Если транзакция выполнена успешно, никакой сбой не отменит эти ее результат

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment