簡體   English   中英

800萬條記錄查詢性能

[英]8 million records query performance

我的查詢概述如下。 目前,由於zt_Arrival_Data表中有超過800萬條記錄,因此運行需要8分鍾以上,而zt_Tpl_Tuple_Stats_2故事只包含9774條記錄,而總輸出僅為6946條唯一記錄。

我可以通過哪種方式構造此查詢以提高性能?

SELECT  distinct b.Tuple_ID
    ,   LTRIM(RTRIM(a.ORIGIN_CITY)) + ', ' + LTRIM(RTRIM(a.ORIGIN_STATE))   AS Origin_TX
    ,   LTRIM(RTRIM(a.DESTINATION_CITY)) + ', ' + LTRIM(RTRIM(a.DESTINATION_STATE)) AS Destination_TX
    ,   LTRIM(RTRIM(a.ORIGIN_CITY)) + ' - ' + LTRIM(RTRIM(a.CUSTOMER_NAME)) AS Origin_Customer_TX
    ,   LTRIM(RTRIM(a.ORIGIN_CITY)) + ' - ' + LTRIM(RTRIM(a.DESTINATION_CITY)) AS Origin_Destination_TX
    ,   LTRIM(RTRIM(a.CUSTOMER_NAME))   AS Customer_Name
    ,   LTRIM(RTRIM(a.CUSTOMER_NAME)) + ', ' + LTRIM(RTRIM(a.CUSTOMER_NO))  AS Customer_TX
    ,   CASE 
            WHEN LTRIM(RTRIM(a.CUSTOMER_TYPE)) = 'C' THEN 'Customer'
            WHEN LTRIM(RTRIM(a.CUSTOMER_TYPE)) = 'I' THEN 'Internal'
            WHEN LTRIM(RTRIM(a.CUSTOMER_TYPE)) = 'S' THEN 'Shop'
            WHEN LTRIM(RTRIM(a.CUSTOMER_TYPE)) = '' THEN 'zUnkown'
            ELSE LTRIM(RTRIM(a.CUSTOMER_TYPE))
        END AS Customer_Type
    ,   CASE
            WHEN a.CARE_OF_NAME = '' THEN 'zUnknown'
            ELSE a.CARE_OF_NAME
        END AS Care_of_Name
    ,  LTRIM(RTRIM(a.ORIGIN_CITY        ))  AS Origin_City
    ,  LTRIM(RTRIM(a.ORIGIN_STATE       ))  AS Origin_State
    ,  LTRIM(RTRIM(a.DESTINATION_CITY   ))  AS Destination_City
    ,  LTRIM(RTRIM(a.DESTINATION_STATE  ))  AS Destination_State
    ,  LTRIM(RTRIM(b.BusinessGroup_TX   ))  AS BusinessGroup_TX
    ,   b.Fleet_TX AS Fleet_TX
    ,   c.Leg_TX AS Leg_TX
FROM         zt_Arrival_Data a
INNER JOIN   zt_Tpl_Tuple_Stats_2       b
            ON LTRIM(RTRIM(a.ORIGIN_CITY)) + ', ' + LTRIM(RTRIM(a.ORIGIN_STATE)) = b.ORIGIN_TX
            AND LTRIM(RTRIM(a.DESTINATION_CITY)) + ', ' + LTRIM(RTRIM(a.DESTINATION_STATE)) = b.DESTINATION_TX
            AND a.CUSTOMER_NO = b.CUSTOMER_CD
            AND a.BUSINESS_GROUP = b.BusinessGroup_TX
            AND a.[FLEET_ID (GEN PLANT)] = b.Fleet_TX
    JOIN zt_LegMap c ON c.Leg_CD = b.Leg_CD

修剪數據條目的數據要好得多,只需要發生一次,而不是對選擇中的大表做這種事情。

這是一個特別糟糕的設計,你必須連接才能加入。 在執行這些操作時,您將無法使用索引。 在SQL Server中,我會創建一個Ci可以加入的計算持久列,而不確定mysql是否有這樣的東西。 但是您應該對此進行調查。

根據我的經驗,我已經了解到,當您需要格式化字段以加入表格時,您應該格式化表格的列,這些列具有較少的行以匹配具有更多行的行,必須進行未更改的比較。

一些想法開始:

FROM         zt_Arrival_Data a
INNER JOIN   zt_Tpl_Tuple_Stats_2       b
        ON a.ORIGIN_CITY = <format the b table columns to match a.ORIGIN_CITY>
        AND a.DESTINATION_STATE = <format the b table columns to match a.DESTINATION_STATE>
        AND a.DESTINATION_CITY = <format the b table columns to match a.DESTINATION_CITY>
        AND a.ORIGIN_STATE = <format the b table columns to match a.ORIGIN_STATE>
        AND a.CUSTOMER_NO = b.CUSTOMER_CD
        AND a.BUSINESS_GROUP = b.BusinessGroup_TX
        AND a.[FLEET_ID (GEN PLANT)] = b.Fleet_TX

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM