请教一下, 多表查询优化 大概百万条数据 . . .

遥远的守望 西安交建交通科技有限公司 程序员  2015-08-18 03:43:37

===============================================================

SELECT Tong.TongDate
FROM Stations INNER JOIN Tong ON Stations.STGUID= Tong.STGUID
INNER JOIN TMaterial ON TMaterial.TGUID = Tong.TGUID
INNER JOIN STMaterial ON TMaterial.STMGUID = STMaterial.STMGUID
WHERE (ABS(TMaterial.误差率) > STMaterial.误差率上限) OR
(ABS(TMaterial.误差率) > STMaterial.误差率下限)
GROUP BY Tong.TongDate

===============================================================
Stations和Tong是一对多关系~
Tong 和 TMaterial 是一对多关系~

sql 写的不太好.
现在数据一多,执行时间达到6秒

请教一下如何修改 . .

...全文
135 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
遥远的守望 2015-08-19
谢谢大神的建议 . . . . .
回复
ChinaITOldMan 2015-08-19
这个好象比较难优化,订一下
回复
shoppo0505 2015-08-18
1.把(ABS(TMaterial.误差率) > STMaterial.误差率上限) OR (ABS(TMaterial.误差率) > STMaterial.误差率下限) 这两个条件放到inner join后。 2.顺便看看那个表格中的数据比较少,少的可以作为出发表
回复
Tiger_Zhao 2015-08-18
SELECT DISTINCT tong.tongdate
FROM tong
WHERE EXISTS (SELECT *
FROM tmaterial
JOIN stmaterial
ON tmaterial.stmguid = stmaterial.stmguid
WHERE tmaterial.tguid = tong.tguid
AND ( (Abs(tmaterial.误差率) > stmaterial.误差率上限)
OR (Abs(tmaterial.误差率) > stmaterial.误差率下限)
)

如果 Tong.STGUID 都是从Stations来的话,没必要连Stations了。
需要建索引
tong(tguid)包含(tongdate)
tmaterial(tguid)包含(stmguid,误差率)
stmaterial(stmguid)包含(误差率上限,误差率下限)

tong要全遍历,很难优化了。
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-08-18 03:43
社区公告
暂无公告