Как узнать, что запрос работает с базой данных в памяти или с дисковой базой данных

#oracle #in-memory-database

#Oracle #база данных в памяти

Вопрос:

Я пытаюсь измерить время выполнения запроса в oracle 12c для базы данных в памяти по сравнению с базой данных на диске. На стороне клиента я использую JDBC для запуска запроса.

Как я узнаю, ищет ли запрос требуемую базу данных в памяти или на диске? Есть ли какая-либо опция, которая сообщает серверу oracle db, что сначала база данных ищет в памяти, а затем на диске?

Ответ №1:

Как я узнаю, ищет ли запрос требуемую базу данных в памяти или на диске?

Вы можете увидеть, просматривал ли oracle данные в памяти или на диске в плане выполнения, как показано ниже.

 SQL> desc t1
 Name                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                           VARCHAR2(20)
 COL2                           VARCHAR2(20)

SQL> alter table t1 inmemory;

Table altered.

SQL> explain plan for select * from t1;

Explained.

SQL> select * from table(dbms_xplan.display());
Plan hash value: 3617692013

------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)|
------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |      | 1 |    24 | 0   (0)|
|   1 |  TABLE ACCESS INMEMORY FULL| T1   | 1 |    24 |        |
------------------------------------------------------------------------

8 rows selected.

SQL> alter table t1 no inmemory;

Table altered.

SQL> explain plan for select * from t1;

Explained.

SQL> select * from table(dbms_xplan.display());
Plan hash value: 3617692013

--------------------------------------------------------------------------
| Id  | Operation     | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |  |     1 |    24 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T1   |     1 |    24 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

8 rows selected.
  

Есть ли какая-либо опция, которая сообщает серверу oracle db, что сначала база данных ищет в памяти, а затем на диске?

В документе Oracle говорится-

INMEMORY _QUERY используется для включения или отключения запросов в памяти для всей базы данных на уровне сеанса или системы. Этот параметр полезен, когда вы хотите протестировать рабочие нагрузки с использованием и без использования хранилища столбцов в памяти (IM column store).

Вы отключаете запрос в памяти как:

 SQL> alter session set inmemory_query = disable;
  

Вы даете INMEMORY подсказку оптимизатору, чтобы он просматривал данные в памяти, как показано ниже.

 select /*  INMEMORY */ * from t1;