Запрос большого объема данных для отображения веб-страницы - PullRequest
0 голосов
/ 18 августа 2011

Я новичок в Oracle (знаю немного базового SQL), но задача как-то назначена мне.

Моя задача - оптимизировать запрос.Он объединяет несколько больших таблиц (запрос занимает много времени) и возвращает результат на веб-страницу (можно использовать подкачку страниц).

Мой вопрос: в каком направлении мне следует искать?Было бы лучше, если ссылки могут быть предоставлены.

Вот некоторые детали:

Оптимизированные методы приняты

index on dayNum, timeNum, entityID columns  

Количестворяды:

  • time_seq: 100 000
  • индикатор_набора: 50 000 000
  • количество раз: 1000

Запрос:

select * 
  from time_seq seq,  
       (  
        select entityID, 
               dayNum,
               timeNum,
               sum(ind1) sum_ind1, 
               avg(ind2) avg_ind2, 
               max(ind3) max_ind3  
          from indicator_set  
         group by entityID, dayNum, timeNum 
         -- the dayNum timeNum are grouped to the time sequence standard 
         -- in time_seq table  
        ) sum  
where seq.entityID=sum.entityID  
  and seq.dayNum=sum.dayNum  
  and seq.timeNum=sum.timeNum  

Таблица time_seq

entityID, dayNum, timeNum
--------------------------------
object1, 20110818, 220000  
object1, 20110818, 223000  
object1, 20100818, 230000  
object1, 20110819, 220000  
object1, 20110819, 223000  
object1, 20100819, 230000 
object2, 20110818, 220000  
object2, 20110818, 223000   
object2, 20100818, 230000  
object2, 20110819, 220000  
object2, 20110819, 223000  
object2, 20100819, 230000  

Таблица Indicator_set

entityID, dayNum, timeNUm, ind1, ind2, ind3
--------------------------------------------
object1, 20110818, 220000, 23,34,23
object1, 20110818, 220500, 23,54,543
object1, 20110818, 220530, 23,54,543
object1, 20110818, 220610, 23,54,543
object1, 20110818, 222900, 23,54,543
...

PS: извините, яне предоставили точный формат / детализацию таблицы и запроса.Просто слишком сложно.

ура ~

Ответы [ 3 ]

1 голос
/ 18 августа 2011

Что вы делаете с результатами этого запроса? Предполагая, что запрос возвращает порядка 100 000 строк (я предполагаю, что объединение не устраняет значительное количество строк в TIME_SEQ), запрос не имеет большого смысла. Вы возвращаете 100 000 неупорядоченных строк пользователю через веб-страницу - нет никакого способа, которым человек когда-либо пролистал бы 100 000 строк, и нет никакого способа представить эти неупорядоченные строки (или упорядочить их в средний уровень).

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

Конечно, даже если вы предварительно агрегируете 50 миллионов строк до 100 000 строк, вы все равно пытаетесь объединить две 100 000 таблиц строк и отправить клиенту 100 000 неупорядоченных строк, что вряд ли будет разумным. Вы могли бы потенциально добавить предложение ORDER BY, чтобы строки располагались в разумном порядке, но это, как правило, увеличивает время запроса, поскольку вы вводите дополнительную сортировку. Могут быть способы оптимизировать это в зависимости от того, что вы собираетесь сортировать. Однако я все еще возвращаюсь к фундаментальной проблеме, заключающейся в том, что возвращение 100 000 строк клиенту-человеку в корне не является правильным подходом.

0 голосов
/ 18 августа 2011

Вы можете создать материализованное представление на основе вашего запроса:

create materialized view mv as
select entityID, 
               dayNum,
               timeNum,
               sum(ind1) sum_ind1, 
               avg(ind2) avg_ind2, 
               max(ind3) max_ind3  
          from indicator_set  
         group by entityID, dayNum, timeNum;

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

select * 
  from time_seq seq,  
      mv sum  
where seq.entityID=sum.entityID  
  and seq.dayNum=sum.dayNum  
  and seq.timeNum=sum.timeNum;

Ваш материализованный вид может быть обновлен в быстром режиме, обычном и т. Д.

http://orafaq.com/wiki/Oracle_Materialized_Views

0 голосов
/ 18 августа 2011

Будет ли связывание таблиц Indicator_set и Time_seq в подзапросе ограничивать количество строк, которые будут сгруппированы в большой таблице Indicator_set?

SELECT *
  FROM time_seq seq,
       (  SELECT ind.entityid,
                 ind.dayNum,
                 ind.timeNum,
                 SUM( ind.ind1 ),
                 AVG( ind.ind2 ),
                 MAX( ind.ind3 )
            FROM indicator_set ind,
                 time_seq ts
           WHERE ind.entity_id = ts.entityid
             AND ind.daynum    = ts.daynum
             AND ind.timenum   = ts.timenum
        GROUP BY ind.entityid,
                 ind.daynum,
                 ind.timenum) SUM
 WHERE seq.entityid = SUM.entityid
   AND seq.daynum   = SUM.daynum
   AND seq.timenum  = SUM.timenum

Внешний запрос все равно будет гарантировать, что из запроса будут возвращены только записи из таблицы time_seq.

Это полезно?

РЕДАКТИРОВАТЬ: Кстати, я бы использовал псевдоним таблицы лучше, чем SUM, поскольку это функция оракула. ​​

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