Cache do plano de consulta no Amazon Neptune
Quando uma consulta é enviada ao Neptune, a string de consulta é analisada, otimizada e transformada em um plano de consulta, executado pelo mecanismo. As aplicações muitas vezes são apoiadas por padrões de consulta comuns que são instanciados com diferentes valores. O cache do plano de consultas pode reduzir a latência geral ao armazenar em cache os planos de consulta e, assim, evitar a análise e a otimização desses padrões repetidos.
O cache de plano de consultas pode ser usado para consultas do openCypher, tanto consultas não parametrizadas como parametrizadas. Ele está habilitado para READ e para HTTP e Bolt. Não é compatível com consultas de mutação do OC. Não é compatível com consultas Gremlin ou SPARQL.
Como habilitar ou desabilitar à força o cache do plano de consultas
O cache do plano de consulta é habilitado por padrão para consultas parametrizadas de baixa latência. Um plano para uma consulta parametrizada é armazenado em cache somente quando a latência é inferior ao limite de 100 ms. Esse comportamento pode ser alterado para cada consulta (parametrizada ou não) por meio da dica de consulta em nível de consulta QUERY:PLANCACHE. Ele precisa ser usado com a cláusula USING. A dica de consulta aceita enabled ou disabled como valor.
# Forcing plan to be cached or reused % curl -k https://<endpoint>:<port>/opencypher \ -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1" % curl -k https://<endpoint>:<port>/opencypher \ -d "query=Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \ -d "parameters={\"arg\": 123}" # Forcing plan to be neither cached nor reused % curl -k https://<endpoint>:<port>/opencypher \ -d "query=Using QUERY:PLANCACHE \"disabled\" MATCH(n) RETURN n LIMIT 1"
Como determinar se um plano está armazenado em cache ou não
Para HTTP READ, se a consulta foi enviada e o plano está armazenado em cache, explain mostra detalhes relevantes ao cache do plano de consultas.
% curl -k https://<endpoint>:<port>/opencypher \ -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1" \ -d "explain=[static|details]" Query: <QUERY STRING> Plan cached by request: <REQUEST ID OF FIRST TIME EXECUTION> Plan cached at: <TIMESTAMP OF FIRST TIME EXECUTION> Parameters: <PARAMETERS, IF QUERY IS PARAMETERIZED QUERY> Plan cache hits: <NUMBER OF CACHE HITS FOR CACHED PLAN> First query evaluation time: <LATENCY OF FIRST TIME EXECUTION> The query has been executed based on a cached query plan. Detailed explain with operator runtime statistics can be obtained by running the query with plan cache disabled (using HTTP parameter planCache=disabled).
Ao usar o Bolt, o recurso de explicação não é compatível.
Remoção
Um plano de consulta é removido pelo tempo de vida útil (TTL) do cache ou quando um número máximo de planos de consulta armazenados em cache é atingido. Quando o plano de consultas é atingido, o TTL é atualizado. Os padrões são:
-
1000: o número máximo de planos que podem ser armazenados em cache por instância.
-
TTL: 300 mil milissegundos ou 5 minutos. O acerto de cache reinicia o TTL e o redefine para 5 min.
Condições que fazem com que o plano não seja armazenado em cache
O cache do plano de consultas não é usado nas seguintes condições:
-
Quando uma consulta é enviada usando a dica de consulta
QUERY:PLANCACHE "disabled". Você pode executar novamente a consulta e removerQUERY:PLANCACHE "disabled"para habilitar o cache do plano de consulta. -
Se a consulta enviada não for uma consulta parametrizada e não contiver a dica
QUERY:PLANCACHE "enabled". -
Se o tempo de avaliação da consulta for maior que o limite de latência, a consulta não será armazenada em cache e será considerada uma consulta de longa duração que não se beneficiaria do cache do plano de consulta.
-
Se a consulta contiver um padrão que não retorne nenhum resultado.
-
Ou seja,
MATCH (n:nonexistentLabel) return nquando há zero nós com o rótulo especificado. -
Ou seja,
MATCH (n {name: $param}) return ncomparameters={"param": "abcde"}quando não há nenhum nó contendoname=abcde.
-
-
Se o parâmetro de consulta for um tipo composto, como
listoumap.curl -k https://<endpoint>:<port>/opencypher \ -d "query=Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \ -d "parameters={\"arg\": [1, 2, 3]}" curl -k https://<endpoint>:<port>/opencypher \ -d "query=Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \ -d "parameters={\"arg\": {\"a\": 1}}" -
Se o parâmetro de consulta for uma string que não fez parte de uma operação de carregamento ou inserção de dados. Por exemplo, se
CREATE (n {name: "X"})for executado para inserir"X", entãoRETURN "X"será armazenado em cache, masRETURN "Y"não será armazenado em cache, pois"Y"não foi inserido e não existe no banco de dados.