Сравнение сложности между временной таблицей + создание индекса тиковой группы с несколькими таблицами без индекса

-4

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

select *  
from
(
select foo.a,bar.b,baz.c
from foo,bar,baz
-- updated for clarity sake
where foo.a=b.bar
and b.bar=baz.c
)
group by a,b,c

вице

create table results as
select foo.a,bar.b,baz.c
from foo,bar,baz
where foo.a=b.bar
and b.bar=baz.c ;

create index results_spanning on results(a,b,c);

select * from results group by a,b,c;

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

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

Комментарии

Вы действительно делаете CROSS JOIN на трех столах? Являются ли эти три столбца индексированными сами по себе? Как часто вы хотите запустить запрос, который обеспечивает конечный результат?

1) Нет.
2) Да, где предложение опущено для обсуждения, поскольку это, очевидно, супер тривиальный пример
3) Не имеет значения.

2-е обновление

Это временная таблица, так как она действительна только на короткий промежуток времени, поэтому да, эта таблица будет запрашиваться только один раз.

спросил(а) 2020-03-25T15:05:38+03:00 2 месяца назад
1
Решение
98

Итак, вопрос в том, что быстрее?

Выполнить запрос один раз и отсортировать набор результатов?

Запустите запрос один раз, чтобы построить таблицу, затем создать индекс, затем снова запустить запрос и отсортировать набор результатов?

Хммм. Трудный.

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

Итак, сделайте первый вариант и при необходимости настройте запрос.

Ответ таков, как это часто бывает при настройке вопросов, это зависит.

Почему вы делаете GROUP BY в первую очередь. Запрос, который вы отправили, не делает никакой агрегации, поэтому единственной причиной для выполнения GROUP BY woudl является устранение повторяющихся строк, то есть операция DISTINCT. Если это действительно так, то вы делаете какую-то форму декартового соединения, и одна настройка запроса будет заключаться в том, чтобы зафиксировать предложение WHERE, чтобы оно возвращало только дискретные записи.

ответил(а) 2020-03-25T15:16:28.823510+03:00 2 месяца назад
38

Если ваш запрос выполняется часто и неприемлемо медленно, вы можете посмотреть на создание материализованных представлений, чтобы предварительно вычислить результаты. Это дает вам преимущество индексируемой "таблицы", без накладных расходов на создание таблицы каждый раз.


Вам нужно будет обновить материализованное представление (желательно fast если большие таблицы) либо on commit либо on demand. Существуют некоторые ограничения на то, как вы можете создавать на фиксации, быстро обновляемые представления, и они немного добавят вашу обработку времени фиксации, но они всегда будут давать тот же результат, что и базовый запрос. По требованию MVs станет устаревшим, поскольку базовые данные будут изменены до тех пор, пока они не будут обновлены. Вам нужно будет определить, приемлемо это или нет.

ответил(а) 2020-03-25T15:05:38+03:00 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема