Я пытаюсь запустить следующий оператор SQL в Oracle, и для его запуска требуется много лет:
SELECT orderID FROM tasks WHERE orderID NOT IN
(SELECT DISTINCT orderID FROM tasks WHERE
engineer1 IS NOT NULL AND engineer2 IS NOT NULL)
Если я запускаю только часть, которая находится в предложении IN, она очень быстро выполняется в Oracle, т.е.
SELECT DISTINCT orderID FROM tasks WHERE
engineer1 IS NOT NULL AND engineer2 IS NOT NULL
Почему все утверждение занимает так много времени в Oracle? В SQL Server весь оператор выполняется быстро.
В качестве альтернативы, я должен использовать более простой / другой / лучший оператор SQL?
Еще несколько подробностей о проблеме:
- Каждый заказ состоит из множества задач
- Каждый ордер будет распределен (одна или несколько задач будут иметь установлен engineer1 и engineer2) или ордер может быть нераспределенным (все его задачи имеют нулевые значения для полей инженера)
- Я пытаюсь найти все нераспределенные идентификаторы заказов.
На всякий случай, если есть какая-то разница, в таблице ~ 120 тыс. Строк и 3 задания на каждый заказ, поэтому ~ 40 тыс. Различных заказов.
Ответы на ответы:
- Я бы предпочел оператор SQL, который работает как в SQL Server, так и в Oracle.
- У заданий есть только индекс для orderID и taskID.
- Я попробовал версию оператора NOT EXISTS, но она работала более 3 минут, прежде чем я ее отменил. Возможно, нужна версия заявления JOIN?
- Существует также таблица "orders" со столбцом orderID. Но я пытался упростить этот вопрос, не включив его в исходный оператор SQL.
Я полагаю, что в исходном операторе SQL подзапрос выполняется каждый раз для каждой строки в первой части оператора SQL - даже если он статический и его нужно запускать только один раз?
Выполнение
ANALYZE TABLE tasks COMPUTE STATISTICS;
заставил мою первоначальную инструкцию SQL выполняться намного быстрее.
Хотя мне все еще интересно, почему я должен это делать, и если / когда мне нужно будет запустить его снова?
Статистика дает Oracle
информация оптимизатора на основе затрат, которая
нужно определить эффективность
различных планов выполнения: для
Например, количество строк в таблице,
средняя ширина рядов, максимальная и
самые низкие значения в столбце, количество
отдельные значения на столбец, кластеризация
коэффициент показателей и т. д.
В небольшой базе данных вы можете просто настроить
работа по сбору статистики каждую ночь
и оставь это в покое. На самом деле это
по умолчанию под 10g. Для большего
реализации вы обычно должны
взвесить стабильность исполнения
планы против того, как данные
изменения, что является хитрым балансом.
Oracle также имеет функцию под названием
«динамическая выборка», которая используется для
образцы таблиц для определения соответствующих
статистика во время исполнения. Это
гораздо чаще используется с данными
склады, где накладные расходы
выборка перевесила
потенциальное увеличение производительности для
длительный запрос.