gpt4 book ai didi

java - 更改查询设计以提高性能

转载 作者:行者123 更新时间:2023-11-30 11:54:02 25 4
gpt4 key购买 nike

这更像是一个设计问题,但也与 SQL 优化有关。

我的项目必须将大量记录导入数据库(超过 100k 条记录)。同时,该项目有逻辑来检查每条记录以确保它符合可配置的标准。然后它会将记录标记为没有警告或在数据库中有警告。插入和警告检查在一个导入过程中完成。

对于每个条件,它都必须查询数据库。该查询需要连接其他两个表,有时会在条件内添加额外的嵌套查询,例如

select * from TableA a 
join TableB on ...
join TableC on ...
where
(select count(*) from TableA
where TableA.Field = Bla) > 100

虽然查询花费的时间不明显,但查询整个记录集需要相当长的时间,在服务器上可能需要 4 到 5 个小时。特别是如果有很多条件,最后项目将停止运行导入和回滚。

我试过将“SELECT * FROM”更改为“SELECT TableA.ID FROM”,但似乎根本没有效果。有没有更好的设计来提高这个过程的性能?

最佳答案

如何制作一个(或多个)临时表来存储子查询的聚合结果,然后用覆盖索引索引那个/那些。

根据您上面的代码,我们将在 TableA.Field1 上创建一个临时表分组并包括一个计数,然后在 Field1 上建立索引 theCount。在 SQL Server 上,最快的方法是:

select * from TableA a 
join TableB on ...
join TableC on ...
join (select Field1 from #temp1 where theCount > 100) t on...

之所以可行,是因为我们重复了同样的技巧。

首先,我们预先聚合到临时表中,这是一个简单的操作,也很容易被SQL Server优化。因此,我们解决了问题的一部分并以可优化的方式解决了问题。

然后我们通过连接到子查询来重复这个技巧,将过滤器放在子查询中,以便连接充当过滤器。

关于java - 更改查询设计以提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5932033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com