SELECT T.ID,
P.TEST_SCHEME_NAME,
PI.ITEM_NAME,
E.TEST_POINT_NAME,
T.SAM_NO,
T.UPCODE,
T.ERR_VALUE,
to_char(t.DATATIME, 'yyyy-MM-dd HH24:mi:ss'),
M.DATAQW,
M.DATASD,
M.DATAQY,
M.DATAGZ,
M.DATAYW,
M.DATAYX,
E.TEST_V,
E.TEST_I,
E.POWER_FACTOR,
T.TESTRESULT
FROM TD_METER_BASEERROR_RSLT T
JOIN MT_TEST_ENVIRONMENT M
ON T.ENV_ID = M.ENV_ID
JOIN P_TEST_SCHEME P
ON T.SCHEMEID = P.TEST_SCHEME_ID
JOIN P_POINT_BASE_ERR E
ON T.SCHEMEPOINTID = E.TEST_POINT_ID
JOIN K_TASK_SAM S
ON T.SAM_NO = S.ASSET_NO
JOIN P_ITEM_POINT PI
ON T.SCHEMEITEMID = PI.ITEM_POINT_ID
WHERE 1 = 1
AND T.BASE_NO = '10001'
AND P.SCHEMETYPE = '01'
AND P.TEST_SCHEME_ID = '100000'
AND S.MANUFACTURER = '001'
AND S.ASSET_NO in ('160813000017')
AND S.LOT_NO = '1000'
AND to_char(t.DATATIME, 'yyyy-mm-dd') >= '2017-11-01'
AND to_char(t.DATATIME, 'yyyy-mm-dd') <= '2017-11-01'
order by t.DATATIME desc
查询速度巨慢,sql应该怎么优化才能提高查询速度
查询的几个字段建索引、创建视图
AND to_char(t.DATATIME, 'yyyy-mm-dd') >= '2017-11-01'
AND to_char(t.DATATIME, 'yyyy-mm-dd') <= '2017-11-01'
to_char(t.DATATIME, 'yyyy-MM-dd HH24:mi:ss'),
这些换掉
AND S.ASSET_NO in ('160813000017')
是否考虑分区,我看有时间查询可以考虑按日期进行时间分区,然后对于是否可以有些字段是否需要加索引,还有根据数据进行分析是加什么样的索引,是否需位图索引或者B树索引,其次分析大小表的问题,以及where条件根据数据量进行分析
根据你的查询语句来说,应该是主表数据比较大而已。根据你的这个问题,也不知道,你的需求是什么,查询的频率高不,每天会插入多少条数据,都不清楚,如果每天都会插入很多,如要只要一些汇总性的数据,可以提前生成等。方法还是蛮多的,看你的需求是什么了,单纯的一条语句慢,还是不好处解决方案的,
1.用到的表关联字段都创建索引
2.S.ASSET_NO in ('160813000017') 换成 S.ASSET_NO= '160813000017'
3.AND to_char(t.DATATIME, 'yyyy-mm-dd') >= '2017-11-01'
AND to_char(t.DATATIME, 'yyyy-mm-dd') <= '2017-11-01' 换成 between and