2015-07-20 82 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.如果没有您的整个查询的知识,没有什么别的可以提供。

相关问题