Какой SQL-запрос более эффективен? - PullRequest
1 голос
/ 23 апреля 2011

Какой из двух запросов более эффективен?

  1. SELECT *FROM Emp WHERE DeptNo<>20

  2. SELECT *FROM Emp WHERE NOT Deptno=20

Мой тренер сказал мне, что 1-й более эффективен, и я понимаю причину, но как я могу проверить это с помощью Oracle 10g? Он использовал некоторые команды для отображения потребляемых циклов ЦП, но я не могу их найти после поиска в Google.

Выходы с использованием AUTOTRACE одинаковы.

SQL> SELECT *FROM Emp
    WHERE DeptNo<>20

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=9 Bytes=333
          )

   1    0   TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=9 Bytes=
          333)
Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          8  consistent gets
          0  physical reads
          0  redo size
       1125  bytes sent via SQL*Net to client
        508  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          9  rows processed
SQL> SELECT *FROM Emp
WHERE NOT Deptno=20

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=9 Bytes=333
          )

   1    0   TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=9 Bytes=
          333)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          8  consistent gets
          0  physical reads
          0  redo size
       1125  bytes sent via SQL*Net to client
        508  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          9  rows processed

Ответы [ 3 ]

4 голосов
/ 23 апреля 2011

Из статистики они оба выглядят одинаково.Однако пара советов:

  • Не используйте select *, выберите только те поля, которые вам нужны
  • Убедитесь, что индексы настроены правильно
1 голос
/ 24 апреля 2011

AUTOTRACE сообщает вам, что в этом случае запросы выполнялись точно так же, и поэтому ни один из них не лучше другого. Оба включали полное сканирование таблицы. Базы данных могут быть довольно умными для оптимизации. Возможно, Oracle потратил на 1 наносекунду меньше, чтобы составить план запроса для версии <>.

Общее замечание, которое ваш тренер , возможно, пытался сделать, касается того, когда индекс можно использовать, а когда нет. Таким образом, SELECT с IN, скорее всего, будет работать быстрее, чем SELECT с NOT IN, поскольку у БД больше шансов использовать поиск по индексу для первого.

1 голос
/ 23 апреля 2011

В оракуле оба они будут обрабатываться одинаково.Любая разница будет иметь место при разборе (= подразделении) запроса, и даже это будет иметь значение, если запросы будут выполняться несколько раз, потому что результаты разбора кэшируются.

Сосредоточьте усилия по повышению эффективности на более неэффективных процессах, напримерприсоединения и подзапросы.

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