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

遥远的守望 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秒

请教一下如何修改 . .

...全文
164 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
遥远的守望 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要全遍历,很难优化了。

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧