2014-01-20 22 views
0

У нас есть несколько запросов coldfusion, которые запускают и сравнивают данные из двух баз данных, одного MS SQL и одного MYSQL для выполнения задачи по обновлению цен на нашем интернет-магазине из нашей базы данных instore.Запросы Coldfusion SQL очень медленные

Проблема заключается в том, что этот запрос занимает больше четырех минут, чтобы завершить. Можем ли мы упростить этот запрос, чтобы ускорить его или мы столкнулись с ограничением от нашего хоста?

Запрос -:

<cfsetting requestTimeOut = "1440"> 

<cftry> 
    <cfset request.timing = structNew()> 

    <cfset getOffline = getTickCount()> 
    <cfquery datasource="MSSQLDATABSE" name="get_offlineproduct2" timeout="240"> 
     SELECT p.id, p.code, pl.salesPrice3 
     FROM products p with(nolock) 
      INNER JOIN productposlocations pl with(nolock) 
       ON pl.ProductID = p.ID 
     WHERE pl.posLocationID = 1 
    </cfquery> 
    <cfset request.timing.getOffline = (getTickCount() - getOffline)/1000> 

<cfquery datasource="MYSQLDATABASE" name="get_onlineproducts" timeout="240"> 
     SELECT s.SKU_ID, s.SKU_MerchSKUID, s.SKU_Price, s.SKU_ShowWeb, b.brand_Name 
     FROM tbl_skus AS s 
     INNER JOIN tbl_prdtbrand_rel r 
     ON s.SKU_ProductID = r.prdt_brand_rel_Product_ID 
     INNER JOIN tbl_prdtbrands b 
     ON r.prdt_brand_rel_Brand_ID = b.brand_ID 
     ORDER BY b.brand_Name 
    </cfquery> 

    <cfquery name="qPriceCheck" dbtype="query"> 
     SELECT * 
     FROM get_onlineproducts, get_offlineproduct2 
     WHERE SKU_MerchSKUID = code 
      AND SKU_Price <> salesPrice3 
    </cfquery> 

    <table border="1" cellspacing="2" cellpadding="2"> 
     <tr> 
      <th>SKU ID</th> 
      <th>Brand</th> 
      <th>SKU Merchant ID</th> 
      <th>SKU Price</th> 
      <th>Stock Price</th> 
      <th>Price Updated?</th> 
     </tr> 
     <cfoutput query="get_onlineproducts"> 
      <cfquery name="qPC" dbtype="query"> 
       SELECT * 
       FROM get_offlineproduct2 
       WHERE code = '#get_onlineproducts.SKU_MerchSKUID#' 
      </cfquery> 
      <tr> 
       <td>#get_onlineproducts.SKU_ID#</td> 
       <td>#get_onlineproducts.brand_Name#</td> 
       <td>#get_onlineproducts.SKU_MerchSKUID#</td> 
       <td>#get_onlineproducts.SKU_Price#</td> 
       <cfif qPC.recordCount> 
        <td>#qPC.salesPrice3#</td> 
        <cfif qPC.salesPrice3 neq get_onlineproducts.SKU_Price> 
         <td>Yes</td> 
         <cfquery datasource="MYSQLDATABASE" name="UpdateonlineproductsPrices"> 
          UPDATE tbl_skus 
          SET SKU_Price = '#qPC.SalesPrice3#' 
          WHERE SKU_MerchSKUID = '#get_onlineproducts.SKU_MerchSKUID#' 
         </cfquery> 
        </cfif> 
       </cfif> 
      </tr> 
     </cfoutput> 
    </table> 

    <cfset request.timing.totalTime = (getTickCount() - getOffline)/1000> 
    <cfdump var="#request.timing#"> 

<cfcatch type="Any" > 
    <cfdump var="#cfcatch#" label="cfcatch"> 
</cfcatch> 
</cftry> 
+0

Зачем вам размещать весь этот код .. – Mihai

+0

Я думал, что это может быть полезно, извините – matthew

+0

Опубликовать запрос и пояснить план – Mihai

ответ

2

Что касается комментариев, «Как вы могли бы предложить удаление запроса от cfoutput Я не уверен, что лучший способ сделать это», я предлагаю следующее:

<cfquery name="qPC" dbtype="query"> 
SELECT field1, field2, etc 
FROM get_offlineproduct2 
WHERE code in (<cfqueryparam 
value = #ValueList(get_onlineproducts.SKU_MerchSKUID)# list="yes") 
</cfquery> 

Затем вы можете выполнить эти результаты и выполнить то, что вам нужно. Это всего лишь 1 поездка в базу данных.

Смежные вопросы