当前位置: 代码迷 >> Sql Server >> 关于索引解决方案
  详细解决方案

关于索引解决方案

热度:53   发布时间:2016-04-24 10:23:26.0
关于索引
程序中有语句如下:
1、year(pPeriod)=   and month(pPeriod)=    and country =  
2、year(pPeriod)=   and month(pPeriod)=    and country =    and lx=
3、year(pPeriod)=   and month(pPeriod)=    and country =    and agent=    and dwlx= 
4、year(pPeriod)=   and month(pPeriod)=    and country =    and agent=    and dwlx=   and lx2=
5、year(pPeriod)=   and month(pPeriod)=    and country =    and agent=    and dwlx=    and lx=    and lx2=   and companyid=


如果建立索引的话,是要单独的建还是建立多字段索引???

单独建立的话是:第1到5各建立一个索引
多字段建立的话是:pPeriod、country、agent、dwlx、 lx、 lx2、companyid一起建立一个索引(这个好像不行的吧)

如果建立了索引后,不需要在SQL语句中调用吗?

------解决方案--------------------
year/month这些2000也会影响索引,你可以试试where条件只保留这样:
where country =    and agent=    and dwlx=    and lx=    and lx2=   and companyid=

然后按照where条件的顺序创建一个索引,即(country,agent,dwlx,lx,lx2,conpanyid),但是还有一些注意事项:
1、索引中的列顺序,最好按照选择度从高到底的顺序写,看你的列名,可能companyid做索引的第一列最好,切记where条件中列的顺序要和索引的定义顺序一模一样。选择度的计算公式可以用:
select 1/count(distinct 列名) from tb 这种计算,越小的值代表选择度越高,越适合做索引的前面的列。
2、索引是否能用也和返回的数据量有关系,即使你用了where条件,假设表有100万数据,你的语句要返回过万,那么通常会出现表扫描或者聚集索引扫描。或者非聚集索引扫描。因为到了一定程度扫描的开销会比查找的更低。
3、类型隐式转换,比如country列是varchar类型,而你where中传入了nvarchar类型,会导致这列也无效,即使上面有索引也用不到
  相关解决方案