簡體   English   中英

SQL QUERY 在 SERACH ALL 時花費太多時間

[英]SQL QUERY TAKING TOO MUCH TIME WHEN SERACH ALL

當我運行具有特定結果的查詢時,我有一個查詢,它在不到 1 秒的時間內顯示結果。 但是當我搜索所有產品的結果時,它需要半小時。 我已經索引以及我從中檢索的表中包含 2 年少於 6000 行的數據,下面是我的代碼。

SELECT dbo.IItems.ItCode, dbo.IItems.ItCodeD AS [Item Code], dbo.IItems.ItHead AS Description, 
       dbo.dbfn_TotalAllSRInq_N(dbo.IItems.ItCode) AS QTY  , 
       dbo.dbfn_TotalALL_Classification_N(dbo.IItems.ItCode,'Display') 
         + dbo.dbfn_TotalALL_Classification_N(dbo.IItems.ItCode,'Trading')
         + dbo.dbfn_TotalALL_Classification_N(dbo.IItems.ItCode,'FOC')
         + dbo.dbfn_TotalALL_Classification_N(dbo.IItems.ItCode,'Liquidation')
         - dbo.dbfn_TotalALL_ClassificationBooked_N(dbo.IItems.ItCode) AS Trade, 
       dbo.dbfn_TotalALL_Classification_N(dbo.IItems.ItCode,'Damage') AS Damage  ,
       dbo.dbfn_TotalALL_ClassificationBooked_N(dbo.IItems.ItCode) AS Booked,
       dbo.CRM_Services_D.Charges AS BottomPrice, 
       (dbo.CRM_Services_D.SM_Price +((dbo.CRM_Services_D.SM_Price * 0)/100)) AS [SM-Price],
       dbo.CRM_Services_D.TagPrice AS Retail, dbo.CRM_Services_D.Pur_Price AS Purchase, 
       dbo.CRM_Services_D.Inst_Price AS Install, dbo.CRM_Services_D.FixPrice AS Fixed,
       dbo.IBinCard.ColorCode , dbo.IBinCard.Mid ,
       IBinCard.mid Brandid,''itHeadL3,'' itHeadL2,''itHeadL1,CRM_Services_D.HF_Price as [HF Price],
       CRM_Services_D.WebPrice, 
       CRM_Services_D.comments as [comments], 
       CRM_Services_D.FCommission as [FCommission], 
       CRM_Services_D.SalesTax as [SalesTax]   
FROM dbo.IItems 
     left Outer JOIN dbo.CRM_Services_M ON dbo.IItems.ItCode = dbo.CRM_Services_M.ItemCode
     left outer JOIN dbo.CRM_Services_D ON 
         dbo.CRM_Services_M.Service_ID = dbo.CRM_Services_D.Service_ID
         AND dbo.CRM_Services_M.POSID = dbo.CRM_Services_D.POSID 
         AND dbo.CRM_Services_D.StDate = ISNULL((Select Top 1 StDate 
                                                   from CRM_Services_M M, CRM_Services_D D 
                                                  Where M.Service_ID = D.Service_ID 
                                                    and M.POSID = D.POSID 
                                                    and M.ItemCode= dbo.IItems.itcode
                                                    and M.POSID in (1,1) 
                                                  Order by StDate Desc), GetDate()) 
     INNER JOIN dbo.IBinCard ON 
          dbo.IItems.ItCode = dbo.IBinCard.Itcode  
          and iitems.itstatus = 1
          and isdisabled = 0  
          and dbo.CRM_Services_M.POSID = ISNULL((Select Top 1 M.POSID 
                                                   from CRM_Services_M M,CRM_Services_D D
                                                  Where M.Service_ID = D.Service_ID 
                                                    and M.POSID = D.POSID 
                                                    and M.ItemCode= dbo.IItems.itcode  
                                                    and M.POSID in (1,1) 
                                                  Order by StDate Desc),1)   
    -- THIS IS THE POINT WHERE I WRITE ANY WORD ITS SHOWING RESULT IN 1 SEC IF I LEFT IT EMPTY ITS GO DOWN
         AND IItems.ItHead  like '%18cith13%'
    --ORDER BY dbo.IItems.ITL1, dbo.IItems.Itl2, dbo.IItems.Itl3, dbo.IItems.Itl4

當我使用 items.ithead 運行查詢時,如 '%any word%' 查詢顯示結果非常快,但是當我完全放下空時。 如果有任何建議,請在此查詢中提供幫助。 問候, 馬克

dbo.IBinCard 上的內部聯接包含條件:

      and dbo.CRM_Services_M.POSID = ISNULL((Select Top 1 M.POSID 
                                               from CRM_Services_M M,CRM_Services_D D
                                              Where M.Service_ID = D.Service_ID 
                                                and M.POSID = D.POSID 
                                                and M.ItemCode= dbo.IItems.itcode  
                                                and M.POSID in (1,1) 
                                              Order by StDate Desc),1)   

但:

  • 它與 dbo.IBinCard 無關
  • 它與dbo.CRM_Services_M.POSID = 1相同,因為您需要M.POSID in (1,1)的 M.POSID 並且如果缺少記錄,您也返回 1。
FROM dbo.IItems 
     left Outer JOIN dbo.CRM_Services_M ON 
         dbo.IItems.ItCode = dbo.CRM_Services_M.ItemCode
         AND dbo.CRM_Services_M.POSID = 1
     left outer JOIN dbo.CRM_Services_D ON 
         dbo.CRM_Services_M.Service_ID = dbo.CRM_Services_D.Service_ID
         AND dbo.CRM_Services_D.POSID  = 1
         AND dbo.CRM_Services_D.StDate = (Select max(StDate)
                                            from CRM_Services_D D 
                                            Where dbo.CRM_Services_M = D.Service_ID 
                                              and D.POSID = 1) 
     INNER JOIN dbo.IBinCard ON 
          dbo.IItems.ItCode = dbo.IBinCard.Itcode  
WHERE iitems.itstatus = 1
  and isdisabled = 0  
  • 您只對 POSID = 1 的 CRM_Services_M 感興趣 -> 我將該條件移至第一個左外連接
  • 因此也只有 CRM_Services_D POSID = 1
  • 只有具有最高 StDate 值的 CRM_Services_D 鏈接到此項目。 鏈接的 dbo.CRM_Services_M 記錄滿足您的所有條件,為什么不重用它呢?
  • 我已將與 IBinCard 無關的標准移至單獨的 where 子句以提高可讀性。
  • ISNULL 檢查不是必需的。 如果子查詢為空,則左外連接也將沒有結果,因為它們使用相同的條件。 因此,要么您已鏈接 CRM_Services_D,因此您也至少有一個 StDate,要么您沒有符合 Service_Id 和 POSID 標准的 CRM_Services_D 記錄。

暫無
暫無

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

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