Coldfusion QoQ невероятно медленный

Запрос содержит около 40 тыс. строк, взятых, как правило, из кэшированного запроса. По какой-то причине 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

person Magic Lasso    schedule 03.07.2013    source источник
comment
Чтобы отладить, я бы начал разбирать ваш запрос, чтобы увидеть, сможете ли вы определить, какая часть занимает время. Начните с удаления предложения GROUP BY и повторите запуск. Затем удалите предложение ORDER BY и повторите запуск. Затем начните удалять условия из пункта WHERE одно за другим, пока не увидите заметную разницу во времени. По крайней мере, вы будете знать, что вызывает задержку, а затем, возможно, сможете придумать лучший метод выполнения этой части.   -  person Miguel-F    schedule 03.07.2013
comment
Q из Q на больших наборах данных медленные. Так оно и есть. Может быть, у вас есть другой способ достичь своей цели.   -  person Dan Bracuk    schedule 03.07.2013
comment
Он вроде в пределах QoQ. Из документов: >Запрос запросов идеально подходит для таблиц, содержащих от 5000 до 50 000 строк, и ограничен только памятью главного компьютера ColdFusion.   -  person Miguel-F    schedule 03.07.2013
comment
Сайт размещен на ужасном сервере, проблема вполне может быть в памяти.   -  person Magic Lasso    schedule 03.07.2013
comment
В запросе около 40 тыс. строк... правильно... так что такая обработка данных должна выполняться в БД, верно? Не в памяти CF, использующей довольно простой механизм обработки SQL. Даже если бы это сработало очень быстро, я считаю, что вам все равно не следует делать это в CF.   -  person Adam Cameron    schedule 03.07.2013
comment
Не могли бы вы предоставить образец строки из исходного запроса? мне интересно, имеет ли к этому какое-либо отношение количество данных в каждой строке.   -  person Russ    schedule 04.07.2013
comment
Это перекрестное соединение с отличительным. Не хорошая идея. Вам нужно будет отфильтровать больше записей, чтобы создать какое-то соединение. Иногда вам нужно проявить творческий подход с несколькими запросами.   -  person J.T.    schedule 04.07.2013


Ответы (1)


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

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

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

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

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

person duncan    schedule 03.07.2013
comment
Я пытался получить лучший набор результатов, но проблема в том, что это было из серии фильтров продуктов. К сожалению, QoQ в Coldfusion не имеет функции соединения. MIN существует исключительно для того, чтобы избежать необходимости группировки с использованием различных. Что касается номера 4, я понятия не имел, ГДЕ это работает, это отличная информация. Хорошие предложения, но я думаю, что наш общий дизайн базы данных просто архаичен. На самом деле требуется гораздо больше нормализации, чтобы мы могли лучше использовать индексы. Спасибо за предложения. - person Magic Lasso; 03.07.2013
comment
Вы можете присоединиться к QoQ: SELECT cols FROM tbl1 T1, tbl2 T2 WHERE T1.PK = T2.FK - person Adam Cameron; 03.07.2013
comment
QoQ поддерживает некоторые функции присоединения. Из документы: >Query of Queries поддерживает соединения с помощью предложения WHERE. Query of Queries не поддерживает соединения с помощью предложений INNER JOIN или OUTER JOIN. Примечание. Query of Queries поддерживает соединения только между двумя таблицами. - person Miguel-F; 03.07.2013