Мой запрос выполняется быстрее во второй раз, как мне это остановить? - PullRequest
11 голосов
/ 07 июля 2011

я выполняю запрос в oracle 10 select A from B where C = D B содержит миллионы записей, а индекс C

отсутствует. Первый раз, когда я его запускаю, это занимает около 30 секунд, второй раз, когда я запускаюзапрос занимает около 1 секунды.

Очевидно, что он что-то кеширует, и я хочу, чтобы он прекратил это, каждый раз, когда я запускаю запрос, я хочу, чтобы он занимал 30 секунд - как в первый раз.

  • я слишком упрощаю проблему, которая у меня есть, чтобы сделать вопрос читабельным.

Спасибо

Ответы [ 4 ]

10 голосов
/ 07 июля 2011

Очистка кэшей для измерения производительности возможна, но очень громоздка.

Очень хорошая мера для отслеживания достигнутой производительности при настройке - это подсчет количества прочитанных блоков во время выполнения запроса.Один из самых простых способов сделать это - использовать sqlplus с функцией autotrace, например:

set autotrace traceonly
<your query>

output

...
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          1  consistent gets
          0  physical reads
          0  redo size
        363  bytes sent via SQL*Net to client
        364  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

Количество прочитанных блоков, будь то из кэша или с диска,is consistent gets.

Другой способ - выполнить запрос с увеличенной статистикой, т.е. с подсказкой gather_plan_statistics, а затем просмотреть план запроса из кэша курсора:

auto autotrace off
set serveroutput off
<your query with hint gather_plan_statistics>
select * from table(dbms_xplan.display_cursor(null,null,'typical allstats'));

Числопрочитанные блоки выводятся в столбце buffers.

---------------------------------------------------------------------------------------------------------------------
| Id  | Operation        | Name           | Starts | E-Rows | Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                |      3 |        |     1 (100)|          |      3 |00:00:00.01 |       3 |
|   1 |  SORT AGGREGATE  |                |      3 |      1 |            |          |      3 |00:00:00.01 |       3 |
|   2 |   INDEX FULL SCAN| ABCDEF         |      3 |    176 |     1   (0)| 00:00:01 |    528 |00:00:00.01 |       3 |
---------------------------------------------------------------------------------------------------------------------
5 голосов
/ 07 июля 2011

См. вопрос ...

В нем показано, как очистить кэш для данных и планов выполнения, а также подробно рассматривается, является ли это хорошей идеей или нет.

2 голосов
/ 07 июля 2011

Очевидный ответ для каждого тестового случая - выполнить запрос несколько раз и выдать первый результат.

Из-за различных кешей нелегко полностью воспроизвести условия первого запуска запросаучаствует: некоторые из них являются кешами Oracle (курсор, буфер и т. д.);некоторые - ОС (дисковый кеш, в зависимости от конфигурации Oracle);некоторые из них аппаратные (SAN, RAID, диск).

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

0 голосов
/ 07 июля 2011

Это может помочь вам

http://www.mssqltips.com/tip.asp?tip=1360

CHECKPOINT;
GO DBCC DROPCLEANBUFFERS;
GO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...