2013-07-03 8 views
1

Запрос имеет около 40 тыс. Строк, взятых в основном из кэшированного запроса. По какой-то причине QoQ просто SLOW. Я попытался удалить большую часть логики (раздельно, группировать и т. Д.), Но это ни к чему не приводит, что заставляет меня думать, что что-то не так в настройках. У кого-нибудь есть представление о том, что происходит и как это ускорить?Coldfusion QoQ невероятно медленно

subcats (Datasource=, Time=42979ms, Records=14) 

      SELECT 
       DISTINCT(SNGP.subtyp1) AS cat, 
       MIN(SNGP.sortposition) AS sortposition, 
       MIN(taxonomy.web_url) AS url 
      FROM 
       SNGP, 
       taxonomy 
      WHERE 
       SNGP.typ > '' 
       AND UPPER(SNGP.typ) <> 'EMPTY' 
       AND UPPER(SNGP.DEPT) = 'SHOES' AND UPPER(SNGP.TYP) = 'FASHION' AND SNGP.SUBTYP1 <> 'EMPTY' 
      GROUP BY SNGP.subtyp1 
      ORDER BY SNGP.sortposition ASC 
+1

Чтобы отладить, я бы начал разбивать ваш запрос, чтобы узнать, можете ли вы определить, какая часть занимает время. Начните с удаления предложения GROUP BY и повторного запуска. Затем удалите предложение 'ORDER BY' и заново запустите. Затем начните удаление условий из предложения 'WHERE', пока вы не увидите заметную разницу во времени. По крайней мере, вы будете знать, что вызывает задержку, а затем, возможно, может придумать лучший способ сделать эту часть. –

+2

Q Q на больших наборах данных медленный. Так оно и есть. Возможно, есть еще один способ достижения вашей цели. –

+0

Он, кажется, находится в пределах QoQ. Из [docs] (http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec0e4fd-7ff9.html#WSc3ff6d0ea77859461172e0811cbec0e4fd-7ff8): _ Запрос запросов идеально подходит для таблиц от 5000 до 50000 строк и ограничен только памятью хост-компьютера ColdFusion. –

ответ

0
  1. Вы должны сделать относительно предыдущего квартала; можно ли изменить исходный запрос, чтобы предоставить вам нужные данные? Могли бы вы даже кэшировать все возможные QoQ, которые вы делаете, по расписанию?

  2. Вы выбираете из двух таблиц (SNGP, таксономия), но я не вижу соединение между ними

  3. web_url звучит как струна, почему вы делаете MIN() на нем?

  4. В предложении WHERE переместите наиболее ограничительные части этого первого. например если typ > '' ограничивает результаты до 1000 строк, но UPPER(SNGP.typ) <> 'EMPTY' ограничил бы его до 100 строк, тогда вы должны положить это первым. Это общий совет SQL, но не уверен, насколько хорошо он работает с QoQ.

  5. 40k строк, чтобы выбрать только 14 результатов, звучит как несоответствие данных; есть ли какой-либо другой способ, которым вы сможете получить данные более ограниченным, прежде чем попробовать свой QoQ.

+0

Я пытался получить лучший результат, но проблема в том, что это было из серии фильтров продуктов. К сожалению, QoQ в Coldfusion не имеет функции соединения. MIN существует чисто, чтобы избежать группировки с помощью различных. Что касается номера 4, я понятия не имел, где это работает, это отличная информация. Хорошие предложения, но я думаю, что наш общий дизайн базы данных просто архаичен. Это действительно требует гораздо большей нормализации, поэтому мы можем лучше использовать индексы. Спасибо за предложения. –

+1

Вы * можете * присоединяться к QoQ: SELECT cols FROM tbl1 T1, tbl2 T2 WHERE T1.PK = T2.FK –

+0

QoQ поддерживает функцию _some_ join. Из [docs] (http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec0e4fd-7ff0.html#WSc3ff6d0ea77859461172e0811cbec0e4fd-7fee): _Query of Queries поддерживает соединения через предложение WHERE._Query of Queries не поддерживает соединения через INNER JOIN или OUTER JOIN clauses._ _ ** Примечание: ** Запрос запросов поддерживает объединения только между двумя таблицами. –