Я пытаюсь запустить следующий 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 занимает такое долгое время в Oracle? В SQL Server весь оператор выполняется быстро.
В качестве альтернативы есть более простой/отличный/лучший оператор SQL, который я должен использовать?
Дополнительная информация о проблеме:
- Каждый заказ выполнен из множества задач
- Каждый заказ будет выделен (одна или несколько его задач будут установлены инженером и инженером2) или порядок может быть нераспределенным (вся его задача имеет нулевые значения для инженерных полей)
- Я пытаюсь найти все идентификаторы orderID, которые нераспределены.
На всякий случай это имеет значение, в таблице есть ~ 120 тыс. строк и 3 задания на заказ, поэтому ~ 40 тыс. разных заказов.
Ответы на ответы:
- Я бы предпочел оператор SQL, который работает как в SQL Server, так и в Oracle.
- Задачи имеют только индекс на идентификаторе orderID и taskID.
- Я попробовал версию NOT EXISTS, но она длилась более 3 минут, прежде чем я отменил ее. Возможно, нужна версия JOIN для утверждения?
- Существует таблица "заказы", а также столбец orderID. Но я пытался упростить вопрос, не включив его в исходный оператор SQL.
Я предполагаю, что в исходном выражении SQL подзапрос запускается каждый раз для каждой строки в первой части инструкции SQL - даже если она статическая и ее нужно запускать только один раз?
Выполнение
ANALYZE TABLE tasks COMPUTE STATISTICS;
сделал мой исходный оператор SQL выполняться намного быстрее.
Хотя мне все еще интересно, почему я должен это делать, и если/когда мне нужно будет запустить его снова?
Статистика дает Oracle информацию об оптимизации на основе стоимости, которая ему необходимо определить эффективность различных планов выполнения: для Например, количество строк в таблице, средняя ширина строк, максимальная и наименьшие значения за столбец, количество разные значения для столбца, кластеризация коэффициент индексов и т.д.
В небольшой базе данных вы можете просто настроить каждую неделю собирать статистику и оставить его в покое. На самом деле это значение по умолчанию менее 10g. Для более крупных реализаций, которые вы обычно должны взвешивать стабильность исполнения планы против того, чтобы данные изменения, которые представляют собой сложный баланс.
Oracle также имеет функцию, называемую "динамическая выборка", которая используется для примеры таблиц для определения соответствующих статистика во время выполнения. Это гораздо чаще используется с данными складов, где накладные расходы отбор проб был перевешен потенциальное увеличение производительности для долгосрочный запрос.