Docs
Поиск⌘ K
  • Главная страница
  • О The Graph
  • Поддерживаемые сети
  • Protocol Contracts
  • Субграфы
    • Субпотоки
      • Token API
        • Hypergraph
          • AI Suite
            • Индексирование
              • Graph Horizon
                • Ресурсы
                  Субграфы > Лучшие практики

                  4 минуты

                  Лучшие практики субграфов №5 — Упрощение и оптимизация с помощью временных рядов и агрегаций

                  Краткое содержание

                  Leveraging the new time-series and aggregations feature in Subgraphs can significantly enhance both indexing speed and query performance.

                  Обзор

                  Временные ряды и агрегации снижают накладные расходы на обработку данных и ускоряют запросы, перенося вычисления агрегаций на базу данных и упрощая код отображений. Этот подход особенно эффективен при обработке больших объемов данных, основанных на времени.

                  Преимущества временных рядов и агрегаций

                  1. Улучшенное время индексирования
                  • Меньше данных для загрузки: мэппинги обрабатывают меньше данных, поскольку необработанные данные хранятся в виде неизменяемых объектов временных рядов.
                  • Агрегации, управляемые базой данных: агрегации вычисляются автоматически базой данных, что снижает нагрузку на мэппинги.
                  1. Упрощённый код мэппинга
                  • Отсутствие ручных вычислений: разработчикам больше не нужно писать сложную логику агрегации в мэппингах.
                  • Снижение сложности: упрощает обслуживание кода и минимизирует вероятность ошибок.
                  1. Существенное ускорение запросов
                  • Неизменяемые данные: все данные временных рядов неизменяемы, что обеспечивает эффективное хранение и извлечение.
                  • Эффективное разделение данных: агрегаты хранятся отдельно от необработанных данных временных рядов, что позволяет запросам обрабатывать значительно меньше данных — часто на несколько порядков меньше.

                  Важные замечания

                  • Незаменяемость данных: данные временных рядов не могут быть изменены после записи, что обеспечивает целостность данных и упрощает индексирование.
                  • Автоматическое управление ID и метками времени: поля id и timestamp автоматически управляются graph-node, что снижает вероятность ошибок.
                  • Эффективное хранение данных: разделение необработанных данных и агрегатов оптимизирует хранилище и ускоряет выполнение запросов.

                  Как внедрить временные ряды и агрегации

                  Предварительные требования

                  You need spec version 1.1.0 for this feature.

                  Определение объектов временных рядов

                  Объект временного ряда представляет собой необработанные данные, собранные с течением времени. Он определяется с помощью аннотации @entity(timeseries: true). Ключевые требования:

                  • Неизменяемость: объекты временного ряда всегда неизменяемы.
                  • Обязательные поля:
                    • id: должен быть типа Int8! и автоматически увеличиваться.
                    • timestamp: должен быть типа Timestamp! и автоматически устанавливаться в соответствии с временной меткой блока.

                  Пример:

                  1type Data @entity(timeseries: true) {2  id: Int8!3  timestamp: Timestamp!4  amount: BigDecimal!5}

                  Определение объектов агрегаций

                  Объект агрегации вычисляет агрегированные значения из источника данных временного ряда. Он определяется с помощью аннотации @aggregation. Ключевые компоненты:

                  • Аргументы аннотации:
                    • intervals: указывает временные интервалы (например, ["hour", "day"]).

                  Пример:

                  1type Stats @aggregation(intervals: ["hour", "day"], source: "Data") {2  id: Int8!3  timestamp: Timestamp!4  sum: BigDecimal! @aggregate(fn: "sum", arg: "amount")5}

                  In this example, Stats aggregates the amount field from Data over hourly and daily intervals, computing the sum.

                  Запрос агрегированных данных

                  Агрегации предоставляются через поля запросов, которые позволяют фильтровать и извлекать данные на основе измерений и временных интервалов.

                  Пример:

                  1{2  tokenStats(3    interval: "hour"4    where: { token: "0x1234567890abcdef", timestamp_gte: "1704164640000000", timestamp_lt: "1704251040000000" }5  ) {6    id7    timestamp8    token {9      id10    }11    totalVolume12    priceUSD13    count14  }15}

                  Использование измерений в агрегациях

                  Измерения — это неагрегированные поля, которые используются для группировки точек данных. Они позволяют выполнять агрегации на основе определённых критериев, таких как токен в финансовом приложении.

                  Пример:

                  Объект временного ряда

                  1type TokenData @entity(timeseries: true) {2  id: Int8!3  timestamp: Timestamp!4  token: Token!5  amount: BigDecimal!6  priceUSD: BigDecimal!7}

                  Объект агрегации с измерением

                  1type TokenStats @aggregation(intervals: ["hour", "day"], source: "TokenData") {2  id: Int8!3  timestamp: Timestamp!4  token: Token!5  totalVolume: BigDecimal! @aggregate(fn: "sum", arg: "amount")6  priceUSD: BigDecimal! @aggregate(fn: "last", arg: "priceUSD")7  count: Int8! @aggregate(fn: "count", cumulative: true)8}
                  • Поле измерения: token группирует данные, так что агрегированные значения вычисляются для каждого токена.
                  • Агрегаты:
                    • totalVolume: сумма количества.
                    • priceUSD: последняя зафиксированная цена в USD.
                    • count: кумулятивное количество записей.

                  Функции агрегации и выражения

                  Поддерживаемые функции агрегации:

                  • sum
                  • count
                  • min
                  • max
                  • first
                  • last

                  Аргумент в @aggregate может быть

                  • Названием поля из объекта временных рядов.
                  • Выражением, использующим поля и константы.

                  Примеры выражений агрегации

                  • Сумма стоимости токена: @aggregate(fn: “sum”, arg: “priceUSD * amount”)
                  • Максимальное положительное значение суммы: @aggregate(fn: “max”, arg: “greatest(amount0, amount1, 0)”)
                  • Условная сумма: @aggregate(fn: “sum”, arg: “case when amount0 > amount1 then amount0 else 0 end”)

                  Поддерживаемые операторы и функции включают базовую арифметику (+, -, *, /), операторы сравнения, логические операторы (and, or, not), а также SQL-функции, такие как greatest, least, coalesce и другие.

                  Параметры запроса

                  • interval: указывает временной интервал (например, “час”).
                  • where: фильтрует данные по измерениям и диапазонам временных меток.
                  • timestamp_gte / timestamp_lt: фильтрует по времени начала и окончания (микросекунды с эпохи).

                  Примечания

                  • Сортировка: результаты автоматически сортируются по временным меткам и идентификатору в порядке убывания.
                  • Текущие данные: опциональный текущий аргумент может включать текущий, частично заполненный интервал.

                  Заключение

                  Implementing timeseries and aggregations in Subgraphs is a best practice for projects dealing with time-based data. This approach:

                  • Улучшает производительность: ускоряет индексирование и запросы, снижая нагрузку на обработку данных.
                  • Упрощает разработку: устраняет необходимость в ручном написании логики агрегации в мэппингах.
                  • Эффективно масштабируется: обрабатывает большие объемы данных, не ухудшая скорость и отзывчивость.

                  By adopting this pattern, developers can build more efficient and scalable Subgraphs, providing faster and more reliable data access to end-users. To learn more about implementing timeseries and aggregations, refer to the Timeseries and Aggregations Readme⁠ and consider experimenting with this feature in your Subgraphs.

                  Лучшие практики для субграфов 1-6

                  1. Improve Query Speed with Subgraph Pruning

                  2. Improve Indexing and Query Responsiveness by Using @derivedFrom

                  3. Improve Indexing and Query Performance by Using Immutable Entities and Bytes as IDs

                  4. Improve Indexing Speed by Avoiding eth_calls

                  5. Simplify and Optimize with Timeseries and Aggregations

                  6. Use Grafting for Quick Hotfix Deployment

                  ⁠Редактировать на GitHub⁠

                  Avoiding eth_callsGrafting and Hotfixing
                  На этой странице
                  • Краткое содержание
                  • Обзор
                  • Преимущества временных рядов и агрегаций
                  • Важные замечания
                  • Как внедрить временные ряды и агрегации
                  • Предварительные требования
                  • Определение объектов временных рядов
                  • Определение объектов агрегаций
                  • Запрос агрегированных данных
                  • Использование измерений в агрегациях
                  • Объект временного ряда
                  • Объект агрегации с измерением
                  • Функции агрегации и выражения
                  • Аргумент в @aggregate может быть
                  • Примеры выражений агрегации
                  • Параметры запроса
                  • Примечания
                  • Заключение
                  • Лучшие практики для субграфов 1-6
                  The GraphСтатусТестовая сетьБрундовые ресурсыФорумБезопасностьПолитика конфиденциальностиУсловия обслуживания