日期:2014-05-17  浏览次数:20559 次

关于大量数据使用索引的问题
小白请教,假设我有
表A(列a-主键ID,b-关键信息,c-其他信息)
表B(列a-主键ID,b-A表外键,c-关键信息Double类型,d-关键信息,e-其他信息)
其中表A有大约10万条数据,B有大约1000万条数据,A表中的一条数据对应B表中50-200条不等
我的查询语句需要动态拼接,可能很长,牵扯到多条件的where,举个例子
sql = "select B.c,B.b,A.a,A.b from B left join A on B.b = A.a where 1=1" 然后下面开始动态拼接条件
我用程序通过for循环拼的,第一次拼接完是这个样子
sql += "and ((B.c>2000 and B.c<2010) or (B.c>2030 and B.c<2038) or ...... or(B.c>15000 and B.c<15002))"
然后继续第二个条件拼接
sql += "and (B.d in (xxx,xxx,xxx,......,xxx,xxx,xxx,xxx)"
写的可能有点累赘,小弟新手,我这样的sql语句合理么,意思就是说A和B连接查询,要得到B中的两列和A中的两列的值,条件是B中的c列值在N个区间范围内,并且满足B中的d列的值是一组值中的一个
如果在这种数据量的这样查询条件下,我是否应该创建索引,这个索引应该怎么建,索引是否会自动调用,还是需要我在sql语句中指定,我看网上有个语句
select * from A with(Index(xx))
是不是必须指定索引,执行的时候才会提升效率,小弟先谢了
------解决方案--------------------
1.B表,在条件中出现的列最好都单独建非聚集索引
2.尽量减少记录集,一次几万到几百万的数据,看不过来吧.
------解决方案--------------------
1.若是這樣的情況,加索引是必然的。

在2008之後可以指定使用索引搜索參數forceseek.
e.g.
select * from tableName a with(forceseek,index(ix_IndexName)) 

2.如果有可能也可以對表進行分區。

3.你可以考慮存儲過程,+ table 變量,如:
create proc usp_test 
(
   @par1 tableVar1
  ,@par2 tableVar2
)
select B.c,B.b,A.a,A.b 
   from B 
      left join A on B.b = A.a 
   where exists(select 1 from @par1 x where b.c > x.Start and b.c < x.End)
    and exists(select 1 from @par2 y where b.d=y.id)
go
其中類型tableVar1:(Start int,End int)
類型tableVar2:(id int)

4. 提高硬件設備的內存和升級CPU,換更快的磁盤