【问题标题】:Coldfusion SQL queries very slowColdfusion SQL查询很慢
【发布时间】:2014-02-09 11:06:17
【问题描述】:

我们有一些 Coldfusion 查询运行并比较来自两个数据库(一个 MS SQL 和一个 MYSQL)的数据,以执行从我们的店内数据库更新我们网上商店价格的任务。

问题是这个查询需要超过四分钟才能完成。我们可以简化这个查询以加快它吗?还是我们面临来自主机的限制?

查询-:

<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>

【问题讨论】:

  • 你为什么要发布所有代码..
  • 我觉得可能有用,抱歉
  • 发布查询并解释计划
  • 您的 qPC 查询针对每个产品运行。鉴于一旦您运行此脚本一次,几乎所有内容都会同步,因此此查询将为大多数产品返回 0 行。在您的输出循环之前,处理 qPriceCheck 结果,并根据需要进行更新。如果您需要输出更新了哪些产品,请将产品 ID 放入 struct 中,然后在主输出循环中使用 StructKeyExists() 来查看是否进行了更改。
  • 哎呀。刚刚注意到循环。还应该摆脱 SELECT * 调用,只返回所需的列(例如,在 qPC 中,您只需要 salesPrice3),并参数化所有这些查询,而不是硬编码将值写入 SQL 字符串!像这样把你的模型和视图逻辑混为一谈有点混乱。 HTML 表中的 UPDATE 查询!?!

标签: mysql sql-server coldfusion


【解决方案1】:

关于评论,“您如何建议从 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 次访问数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2013-12-29
    • 2018-06-12
    • 2014-09-24
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多