在一个应用程序中,我有 2000 个帐户。第一个账户包含 10000 个客户,这是一个账户的最大限制。用户可以从第一个账户中选择客户,然后选择一些账户将选定的客户复制到选定的账户。所以可能的最大值是 1999 个帐户和 10000 个客户。
目前,我正在遍历 Account 列表并在客户端应用程序的每次迭代中调用存储过程。在每次迭代中,将一个 Account Id 和一个包含客户端 ID 列表的表值参数传递给 SP。使用 500 个帐户和 10000 个客户端进行测试时,需要 25 分钟、34 秒和 543 毫秒。在 SP 中的某个时刻,我正在使用以下代码 –
INSERT INTO Client
SELECT AccountId, CId, Code, Name, Email FROM Client
WHERE Client.Id IN(SELECT Id FROM @clientIdList)
其中@clientIdList
是包含 10000 个客户 ID 的表类型变量。
问题是,每次迭代后,都会将 10000 个新的客户端数据添加到客户端表中。因此,对于每次迭代,此INSERT
操作在下一次迭代中将花费更长的时间。谷歌搜索一些 SP 性能提示我开始知道该IN
子句被认为有些邪恶,大多数人建议使用它INNER JOIN
。所以我把上面的代码改成了——
INSERT INTO Client
SELECT c.AccountId, c.CId, c.Code, c.Name, c.Email FROM Client AS c
INNER JOIN @clientIdList AS cil
ON c.Id = cil.Id
现在需要 25 分 17 秒和 407 毫秒。没有什么令人兴奋的,真的!
我是存储过程领域的新手。那么,有了这么多的数据,它应该需要这么长时间吗?对于给定的场景,我应该考虑哪一个,IN
或者INNER JOIN
?欢迎提出建议和性能提示。谢谢。