现在的sql语句
Select v_id as dyn_vehid,Dyn_Time ,v_companyid ,dyn_mile From WisdomTaxiPosition_2015_1_15..T_Dyndata WITH (NOLOCK) left Join V_CompanyVehicle WITH (NOLOCK) On Dyn_VehID=V_Id Where dyn_mile is not null and Dyn_Time Between '2015-01-15 00:00:00' And '2015-01-15 23:59:59' And TenantId=123476 And V_CompanyID=1 Union All Select v_id as dyn_vehid,Dyn_Time ,v_companyid ,dyn_mile From WisdomTaxiPosition_2015_1_16..T_Dyndata WITH (NOLOCK) left Join V_CompanyVehicle WITH (NOLOCK) On Dyn_VehID=V_Id Where dyn_mile is not null and Dyn_Time Between '2015-01-16 00:00:00' And '2015-01-16 17:20:11' And TenantId=123476 And V_CompanyID=1
用union all 的原因是一日一库的原因 所有导致了这样的写法 这个没法改
V_CompanyVehicle是个视图
具体的如下
个人想法优化想法:
第一 dyn_mile入库数据的时候默认设置为-1 不要有null 通过看博客园数据库优化说
dyn_mile is not null导致查询语句不走索引
第2
把条件放到外面来 具体格式如下
select xxxxx from( Select v_id as dyn_vehid,Dyn_Time ,v_companyid ,dyn_mile From WisdomTaxiPosition_2015_1_15..T_Dyndata WITH (NOLOCK) left Join V_CompanyVehicle WITH (NOLOCK) On Dyn_VehID=V_Id Union All Select v_id as dyn_vehid,Dyn_Time ,v_companyid ,dyn_mile From WisdomTaxiPosition_2015_1_16..T_Dyndata WITH (NOLOCK) left Join V_CompanyVehicle WITH (NOLOCK) On Dyn_VehID=V_Id ) temp where 条件
疑问?
这里需要建立联合索引
问题是
TenantId V_CompanyID 是视图里面的表的字段
不知道这个索引是建立在视图表上还是
WisdomTaxiPosition_xxx..T_Dyndata 上
看下了下执行计划 里面有FID
这里我的直觉应该很多优化的地方
希望各位园友赐教 谢谢
一日一库确实……
因为一日一库,所以时间索引没什么用,Dyn_VehID=V_Id这里建索引,并把相关的列建包含索引:create index xx on table include(xxx,xxx,xxx)
首先且不谈优化..这个设计的就有问题吧....一日一库是什么意思?一天一个库?....如果一日一表倒还可以理解...但是你数据量有多大需要一日一表?还有就是有这种需求...为什么不用分区表实现?
第二种方式优化性能会更差...建议优先缩小数据范围..在union all...如果创建索引最优先的是Dyn_VehID=V_Id这两个字段...其它可以参照我的博文以此进行...http://www.cnblogs.com/zhijianliutang/p/4204390.html
对应的业务 一些数据庞大的 一日一个库(库里面对应建立表 ) 类似分区表一样的一样的逻辑