Pular para o conteúdo principal

Identificar endpoints de Pesquisa de AI não utilizados

Esta página descreve como usar a tabela do sistema de log de auditoria para encontrar endpoints de Pesquisa de AI que têm índices, mas não recebem tráfego de consulta. Endpoints não utilizados consomem recursos e geram custos sem entregar valor. Identificar endpoints não utilizados ajuda a limpar recursos não utilizados e a reduzir custos.

Requisitos

  • Um workspace habilitado para o Unity Catalog.
  • Acesso à tabela system.access.audit. Por padrão, apenas os administradores de contas têm acesso. Para conceder acesso a outros usuários, consulte Referência da tabela do sistema de log de auditoria.
  • Um SQL warehouse ou compute serverless para executar consultas.

Como funciona

A system.access.audit tabela registra cada chamada da API de Pesquisa de AI como um evento com service_name = 'vectorSearch'. Isso inclui criação de índice, exclusão, consultas, upserts e varreduras.

Um único endpoint pode servir múltiplos índices. Para encontrar endpoints não utilizados, compare o conjunto de índices que existem (criados, mas não excluídos) com o conjunto de índices que receberam tráfego de consulta em uma determinada janela de tempo, em seguida, agregue-os ao nível do endpoint. Um endpoint não é usado somente quando nenhum de seus índices recebeu consultas.

O log de auditoria retém 365 dias de dados, permitindo consultar um período de até um ano.

nota

O log de auditoria registra consultas no nível do índice, não no nível do endpoint. As consultas neste guia mapeiam índices de volta para seus endpoints usando o endpoint_name registrado no momento da criação do índice.

Encontrar endpoints não utilizados

A consulta a seguir identifica endpoints em que nenhum índice recebeu nenhuma consulta nos últimos 30 dias. Ele usa eventos de log de auditoria para determinar quais índices foram criados, quais foram excluídos e quais receberam tráfego de consulta e, em seguida, agrega ao nível do endpoint.

importante

Esta consulta determina índices ativos comparando createVectorIndex e deleteVectorIndex eventos no log de auditoria. Se um índice foi criado há mais de 365 dias (antes da janela de retenção do log de auditoria), não aparece nos resultados. Para uma visão completa, cruze esses resultados com a saída do método SDK list_indexes de AI.

SQL
WITH created_indexes AS (
-- All indexes created in the last year
SELECT DISTINCT
request_params['name'] AS index_name,
request_params['endpoint_name'] AS endpoint_name
FROM system.access.audit
WHERE service_name = 'vectorSearch'
AND action_name = 'createVectorIndex'
AND event_date >= current_date() - INTERVAL 365 DAYS
),

deleted_indexes AS (
-- Indexes that have been deleted
SELECT DISTINCT
request_params['name'] AS index_name
FROM system.access.audit
WHERE service_name = 'vectorSearch'
AND action_name = 'deleteVectorIndex'
AND event_date >= current_date() - INTERVAL 365 DAYS
),

active_indexes AS (
-- Indexes that exist (created but not deleted)
SELECT ci.index_name, ci.endpoint_name
FROM created_indexes ci
LEFT JOIN deleted_indexes di ON ci.index_name = di.index_name
WHERE di.index_name IS NULL
),

queried_indexes AS (
-- Indexes that received queries in the last 30 days
SELECT DISTINCT
request_params['name'] AS index_name
FROM system.access.audit
WHERE service_name = 'vectorSearch'
AND action_name IN (
'queryVectorIndex',
'queryVectorIndexNextPage',
'queryVectorIndexRouteOptimized',
'scanVectorIndex',
'scanVectorIndexRouteOptimized'
)
AND event_date >= current_date() - INTERVAL 30 DAYS
),

index_status AS (
SELECT
ai.endpoint_name,
ai.index_name,
CASE WHEN qi.index_name IS NOT NULL THEN 1 ELSE 0 END AS is_queried
FROM active_indexes ai
LEFT JOIN queried_indexes qi ON ai.index_name = qi.index_name
)

SELECT
endpoint_name,
COUNT(*) AS total_indexes,
SUM(is_queried) AS queried_indexes,
COUNT(*) - SUM(is_queried) AS unqueried_indexes
FROM index_status
GROUP BY endpoint_name
HAVING SUM(is_queried) = 0 -- Only fully unused endpoints
ORDER BY total_indexes DESC

Encontrar índices não utilizados em endpoints ativos

Mesmo que um endpoint esteja ativamente atendendo consultas para alguns índices, ele pode ter outros índices que não recebem tráfego. Esses índices não utilizados ainda consomem recursos no endpoint. A remoção de índices não utilizados de um endpoint ativo pode reduzir seu consumo de memória e prevenir seu escalonamento desnecessário.

A consulta a seguir identifica índices individuais não utilizados, incluindo aqueles em endpoints que possuem outros índices ativos.

SQL
WITH created_indexes AS (
SELECT DISTINCT
request_params['name'] AS index_name,
request_params['endpoint_name'] AS endpoint_name
FROM system.access.audit
WHERE service_name = 'vectorSearch'
AND action_name = 'createVectorIndex'
AND event_date >= current_date() - INTERVAL 365 DAYS
),

deleted_indexes AS (
SELECT DISTINCT
request_params['name'] AS index_name
FROM system.access.audit
WHERE service_name = 'vectorSearch'
AND action_name = 'deleteVectorIndex'
AND event_date >= current_date() - INTERVAL 365 DAYS
),

active_indexes AS (
SELECT ci.index_name, ci.endpoint_name
FROM created_indexes ci
LEFT JOIN deleted_indexes di ON ci.index_name = di.index_name
WHERE di.index_name IS NULL
),

queried_indexes AS (
SELECT DISTINCT
request_params['name'] AS index_name
FROM system.access.audit
WHERE service_name = 'vectorSearch'
AND action_name IN (
'queryVectorIndex',
'queryVectorIndexNextPage',
'queryVectorIndexRouteOptimized',
'scanVectorIndex',
'scanVectorIndexRouteOptimized'
)
AND event_date >= current_date() - INTERVAL 30 DAYS
)

SELECT
ai.endpoint_name,
ai.index_name
FROM active_indexes ai
LEFT JOIN queried_indexes qi ON ai.index_name = qi.index_name
WHERE qi.index_name IS NULL
ORDER BY ai.endpoint_name, ai.index_name

Obter detalhes da atividade de consulta por índice

Para entender os padrões de consulta em todos os seus índices, não apenas os não utilizados, utilize a seguinte consulta. Esta consulta identifica a última hora da consulta e o volume da consulta para cada índice, ajudando a identificar índices que são consultados, mas que apresentam tráfego muito baixo e também podem ser candidatos para limpeza.

SQL
SELECT
request_params['name'] AS index_name,
MAX(event_time) AS last_query_time,
DATEDIFF(current_date(), DATE(MAX(event_time))) AS days_since_last_query,
COUNT(*) AS query_count_30d,
COUNT(DISTINCT DATE(event_time)) AS active_days_30d
FROM system.access.audit
WHERE service_name = 'vectorSearch'
AND action_name IN (
'queryVectorIndex',
'queryVectorIndexNextPage',
'queryVectorIndexRouteOptimized',
'scanVectorIndex',
'scanVectorIndexRouteOptimized'
)
AND event_date >= current_date() - INTERVAL 30 DAYS
GROUP BY 1
ORDER BY last_query_time ASC

Identificar quem criou endpoints não utilizados

Para descobrir quem criou endpoints que estão servindo índices não utilizados, use a seguinte consulta. Isto pode ajudar a entrar em contato com a equipe certa para limpeza.

SQL
SELECT
request_params['name'] AS endpoint_name,
user_identity.email AS created_by,
event_time AS created_at
FROM system.access.audit
WHERE service_name = 'vectorSearch'
AND action_name = 'createEndpoint'
AND event_date >= current_date() - INTERVAL 365 DAYS
ORDER BY event_time DESC

Personalize a janela de lookback

Os exemplos acima usam uma janela de 30 dias para definir “não usado”. Ajuste o valor de INTERVAL com base no seu caso de uso:

  • 30 days : Bom default para a maioria das cargas de trabalho.
  • Sete dias: Usar para cargas de trabalho que devem ser consultadas diariamente.
  • 90 dias : Use para lotes ou cargas de trabalho sazonais que são executadas com menos frequência.

Substitua INTERVAL 30 DAYS no queried_indexes CTE por sua janela preferencial.

Passos seguintes