程序中有语句如下:
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类型,会导致这列也无效,即使上面有索引也用不到