2015-07-20 77 views
0

我有一個包含超過一百萬行集數據的數據庫。當我執行這個查詢時,需要幾個小時,主要是由於pageIOLatch_sh。目前沒有索引。你能建議where子句中可能的索引。我相信它應該在日期時間,因爲它在哪裏使用,以及如何使用哪個索引。基於日期時間字段的Where子句的索引和優化

if(<some condition>) 
BEGIN 
select <some columns> 
From <some tables with joins(no lock)> 

WHERE 

    ((@var2 IS NULL AND a.addr IS NOT NULL)OR 
     (a.addr LIKE @var2 + '%')) AND 
    ((@var3 IS NULL AND a.ca_id IS NOT NULL) OR 
     (a.ca_id = @var3)) AND 
    b.time >= @from_datetime AND b.time <= @to_datetime AND 
    (
      (
       b.shopping_product IN ('CX12343', 'BG8945', 'GF4543') AND 
       b.shopping_category IN ('online', 'COD') 
      ) 
      OR 
      (
       b.shopping_product = 'LX3454' and b.sub_shopping_list in ('FF544','GT544','KK543','LK5343') 
      ) 
      OR 
      (
       b.shopping_product = 'LK434434' and b.sub_shopping_list in ('LL5435','PO89554','IO948854','OR4334','TH5444') 
      ) 

      OR 
      (
       b.shopping_product = 'AZ434434' and b.sub_shopping_list in ('LL54352','PO489554','IO9458854','OR34334','TH54344') 
      ) 
    )AND 

    ORDER BY 
     b.time desc 
ELSE 
BEGIN 
select <some columns> 
From <some tables with joins(no lock)> 
where <similar where as above with slight difference> 
+0

請確定您正在使用哪個DBMS。你同時標記了兩個 - mysql和sqlserver – CeOnSql

+0

Microsoft SQL server 2005 – aquesh

+0

如果你沒有建立索引,我猜猜問題是聯接,你沒有包含在問題中。 –

回答

0

那好吧,

我說:「這些先取指標:shopping_product和shopping_category sub_shopping_list,其次ü可以嘗試的日期,在這之後看到的執行計劃(或將是更好的。在時間欄上創建分區)「

我正在研究oracle,但基本是一樣的。

您可以在該列上創建3個不同的索引:shopping_product,shopping_category,sub_shopping_list。或者,您可以爲3列製作1個複合索引。關鍵是你需要檢查執行計劃哪一個最​​適合你。 哦,這裏是a.ca_id列(幾乎忘記),你也需要一個索引。

對於日期列,我認爲你最好創建一個分區而不是索引。

總結,兩種方式: - 創建4不同指數(shopping_product,shopping_category,sub_shopping_list,ca_id),創建日期列 一系列鍵入分區 - 創建1個綜合指數(shopping_product,shopping_category,sub_shopping_list)和1個正常索引(ca_id),在日期列上創建一個範圍類型分區

0

如果您正在處理這種大小的表格,那麼您可能應該瞭解索引。這不是一個微不足道的過程。在確定需要的索引時,JOIN操作是一件大事。讀這個。 http://use-the-index-luke.com/

在此期間,如果您的日期範圍是高度選擇性(即,如果

b.time >= @from_datetime AND b.time <= @to_datetime 

選擇行的一個合理的小部分在你的數據庫),你應該試試下面的複合索引。

b.shopping_product, b.time 

如果沒有幫助,本身嘗試

b.time 

。這個想法是構建您的索引,以便服務器可以做一個range scan.如果沒有您的整個查詢的知識,沒有什麼別的可以提供。

相關問題