Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Apache AGE, поддерживаемый Базой данных Azure для PostgreSQL, обеспечивает поддержку расширенной обработки графов и запросов. Однако для достижения оптимальной производительности запросов требуется продуманная стратегия индексирования и загрузки данных. В этом руководстве описаны некоторые рекомендации, основанные на последних результатах тестирования и технической аналитике.
Индексирование в Apache AGE
Индексирование является ключевым для повышения производительности запросов, особенно в базах данных графов.
Поведение по умолчанию
По умолчанию Apache AGE не создает индексы для только что созданных графов. Это требует явного создания индексов на основе характера запросов и набора данных.
Клаузула WHERE
В Apache AGE следующие запросы оцениваются по-разному:
SELECT * FROM cypher('graph_name',
$$
MATCH (n:Customer {Name:'Alice'}) RETURN n
$$)
AS (n agtype);
SELECT * FROM cypher('graph_name',
$$
MATCH (n:Customer) WHERE n.Name='Alice' RETURN n
$$)
AS (n agtype);
Чтобы воспользоваться полным преимуществом индексирования, необходимо понять, какие типы индексов используются запросами с предложением WHERE и без него.
ОПИСАНИЕ в Apache AGE
В отличие от стандартного SQL, ключевое слово EXPLAIN в запросах шифра требует другого формата запроса.
SELECT * FROM cypher('graph_name',
$$
EXPLAIN
MATCH (n:Customer)
WHERE n.Name='Alice'
RETURN n
$$)
AS (plan text);
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Seq Scan on "Customer" n (cost=0.00..418.51 rows=43 width=32)
Filter: (agtype_access_operator(VARIADIC ARRAY[properties, '"Name"'::agtype]) = '"Alice"'::agtype)
Чтобы увидеть различия в планах выполнения запросов без использования предложения WHERE:
SELECT * FROM cypher('graph_name',
$$
MATCH (n:Customer {Name:'Alice'}) RETURN n
$$)
AS (n agtype);
QUERY PLAN
---------------------------------------------------------------
Seq Scan on "Customer" n (cost=0.00..396.56 rows=9 width=32)
Filter: (properties @> '{"Name": "Alice"}'::agtype)
Распространенные типы индексов
- Индекс BTREE: эффективный для точных совпадений и запросов диапазона. Рекомендуется использовать с такими столбцами, как ID, start_id и end_id в таблицах рёбер и вершин.
- Индекс GIN: полезно для полей JSON, что позволяет эффективно выполнять поиск пар "ключ-значение" в столбце свойств.
Используйте следующие команды, чтобы создать индексы для вершин и пограничных таблиц:
Таблица вершин:
CREATE INDEX ON graph_name."VLABEL" USING BTREE (id); CREATE INDEX ON graph_name."VLABEL" USING GIN (properties);Таблица Microsoft Edge:
CREATE INDEX ON graph_name."ELABEL" USING BTREE (id); CREATE INDEX ON graph_name."ELABEL" USING GIN (properties);CREATE INDEX ON graph_name."ELABEL" USING BTREE (start_id); CREATE INDEX ON graph_name."ELABEL" USING BTREE (end_id);
Индексирование определенного значения ключа в свойствах
Для целевых запросов можно создать более эффективный индекс BTREE для определенных ключей в столбце свойств:
CREATE INDEX ON graph_name.label_name USING BTREE (agtype_access_operator(VARIADIC ARRAY[properties, '"KeyName"'::agtype]));
Этот подход позволяет избежать индексирования ненужных данных, повышения эффективности.
Аналитика плана запросов с помощью EXPLAIN
Ключевое слово EXPLAIN показывает, как запросы используют индексы. Не все запросы автоматически используют индексы, особенно те, которые выданы без предложения WHERE. Используйте EXPLAIN для проверки использования индекса и оптимизации запросов соответствующим образом.
Контрольные наблюдения
Последние тесты подчеркивают влияние индексирования на производительность запросов.
Индексированные и неиндексированные запросы
В этом разделе рассматриваются различия в производительности индексированных и неиндексированных запросов.
- Последовательные сканирования превосходят индексные сканирования для запросов, извлекающих целые таблицы.
- Индексирование значительно повышает производительность запросов на присоединение (например, количество связей).
Рекомендации по загрузке данных
Эффективная загрузка данных имеет решающее значение для больших наборов данных.
Библиотека AGEFreighter предлагает упрощенный процесс приема данных.
Загрузка данных с помощью AGEFreighter
AGEFreighter — это библиотека Python, предназначенная для упрощения загрузки данных в Apache AGE. Он поддерживает различные форматы данных, включая CSV, Avro и Parquet, и предоставляет простой интерфейс для загрузки данных в графы AGE.
Настройка среды
- Создан гибкий экземпляр сервера Базы данных Azure для PostgreSQL с поддержкой AGE.
- Рекомендуется использовать средство управления зависимостями Python, например "Поэзия". Необходимо установить Python 3.9 или более поздней версии.
- Библиотека AGEFreighter (AGEFreighter PyPi) должна быть установлена как зависимость:
poetry add agefreighter
Использование формата данных CSV для тестов
Для тестов я использовал CSV-файл для загрузки данных в AGE. Формат CSV широко поддерживается и легко работает, что делает его хорошим выбором для задач загрузки данных.
Так как используемый набор данных состоит из юридических случаев и связей между ними, я структурировал входной CSV-файл следующим образом:
id,CaseID,start_vertex_type,end_CaseID,end_vertex_type
1,1005631,Case,5030916,Case
2,1005631,Case,5028652,Case
3,1005631,Case,996512,Case
4,1005631,Case,3413065,Case
5,1005631,Case,4912975,Case
Каждая строка представляет связь между двумя случаями. CaseID ссылается на начальный узел случая, а end_CaseID относится к связанному случаю.
Использование скрипта загрузки данных для тестов
Следующий скрипт Python использовался для загрузки набора данных в AGE. Вы также можете обратиться к разделу "Использование CSVFreighter" в AGEFreighter PyPi для другого примера.
await instance.load(
graph_name="CaseGraphFull",
start_v_label="Case",
start_id="CaseID",
start_props=[],
edge_type="REF",
edge_props=[],
end_v_label="Case",
end_id="end_CaseID",
end_props=[],
csv_path="./cases.csv",
use_copy=True,
drop_graph=True,
create_graph=True,
progress=True,
)
Как видно, здесь определены graph_name и поля в предоставленном CSV-файле. Параметр use_copy=True обеспечивает эффективную загрузку данных. Параметры drop_graph=True и create_graph=True обеспечивают свежий запуск перед загрузкой новых данных.
Другие источники данных
AGEFreighter поддерживает другие форматы, такие как MultiCSV, Avro, Parquet, служба хранилища Azure и т. д., которые можно адаптировать на основе требований к формату данных. Дополнительные сведения см. здесь: AGEFreighter PyPi
Тесты производительности загрузки данных
- Размер набора данных: 725K случаев, 2,8 МЛН связей.
- Время загрузки: 83 секунды.
Эффективная загрузка данных необходима для эффективной обработки больших наборов данных.
Замечание
Хотя этот процесс подходит для больших файлов, этот процесс может быть менее эффективным для небольших наборов данных из-за времени подготовки.