Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como otimizar um SQL de atualização que é executado em uma tabela Oracle com 700 milhões de linhas


Em primeiro lugar, é uma consulta única ou é uma consulta recorrente? Se você precisar fazer isso apenas uma vez, talvez queira executar a consulta no modo paralelo. Você terá que varrer todas as linhas de qualquer maneira, você pode dividir a carga de trabalho com intervalos de ROWID (paralelismo faça você mesmo) ou usar os recursos integrados do Oracle.

Supondo que você deseja executá-lo com frequência e deseja otimizar essa consulta, o número de linhas com o field coluna como NULL eventualmente será pequena em comparação com o número total de linhas. Nesse caso, um índice pode acelerar as coisas. O Oracle não indexa linhas que tenham todas as colunas indexadas como NULL, portanto, um índice em field não será usado por sua consulta (já que você deseja encontrar todas as linhas em que field é nulo).

Qualquer:
  • criar um índice em (FIELD, 0) , o 0 funcionará como uma pseudocoluna não NULL e todas as linhas serão indexadas na tabela.

  • crie um índice baseado em função em (CASE WHEN field IS NULL THEN 1 END) , isso indexará apenas as linhas que são NULLs (o índice seria, portanto, muito compacto). Nesse caso, você teria que reescrever sua consulta:

    UPDATE [TABLE] SET [FIELD]=0 WHERE (CASE WHEN field IS NULL THEN 1 END)=1

Editar:


Como este é um cenário único, você pode querer usar o PARALLEL dica:
SQL> EXPLAIN PLAN FOR
  2  UPDATE /*+ PARALLEL(test_table 4)*/ test_table
  3     SET field=0
  4   WHERE field IS NULL;

Explained

SQL> select * from table( dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 4026746538
--------------------------------------------------------------------------------
| Id  | Operation             | Name       | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT      |            | 22793 |   289K|    12   (9)| 00:00:
|   1 |  UPDATE               | TEST_TABLE |       |       |            |
|   2 |   PX COORDINATOR      |            |       |       |            |
|   3 |    PX SEND QC (RANDOM)| :TQ10000   | 22793 |   289K|    12   (9)| 00:00:
|   4 |     PX BLOCK ITERATOR |            | 22793 |   289K|    12   (9)| 00:00:
|*  5 |      TABLE ACCESS FULL| TEST_TABLE | 22793 |   289K|    12   (9)| 00:00:
--------------------------------------------------------------------------------