我应该执行多个 sql 查询还是一个大型查询并在服务器上进行处理?

Posted

技术标签:

【中文标题】我应该执行多个 sql 查询还是一个大型查询并在服务器上进行处理?【英文标题】:Should I do many sql queries or one large query and do the processing on the server? 【发布时间】:2014-05-21 11:39:42 【问题描述】:

情况如下:我有一个大型数据集,其中包含从 Excel 文件填充的几千个条目。对于每个条目,我必须将其与数据库中某个表上的另一个字段匹配(该表仅包含几百个条目)。

最好的方法是什么?我可以对数据集中的每个条目进行查询,但这似乎相当浪费;另一方面,我可以从表中的所有条目中选择我需要的字段,将它们放在字典或其他一些数据结构上并在 IIS 上匹配它们,从而有效地只进行一个查询,但在网络服务器上进行所有处理.

数据集:~1000 到 ~3000 个条目

数据库中的表:~300 个条目

在 IIS 上使用 asp.net 但数据库是 MS 访问文件。

这两个更好吗?有没有我没想到的第三种更好的方法?

【问题讨论】:

在数据库中进行处理。您想要的操作是join,并且数据库针对这种类型的数据处理进行了优化。 问题是我的数据集不在数据库中,我应该用它在数据库中创建一个临时表并从那里加入它们吗? 这在很大程度上取决于数据集的大小,正如 Gordon 所说,SQL 针对连接操作进行了优化,这将是最快的方式。但是,根据您建议的大小,如果您必须创建并填充一个临时表来进行连接,然后将记录返回到服务器,然后摆脱临时表,我原以为会是更快地填充和循环包含几千条记录的数据集,填充和查找包含几百条记录的小型字典。 如前所述,数据库会处理得更好,但是,我的猜测是,将数据导入数据库的过程会抵消大部分收益。请记住,一个数据集可以包含多个表,您可以在这些表之间创建关系。我在这方面做得不多,但我认为你可以以某种方式利用关系。底线,可能唯一确定的方法是尝试这两种方法。 【参考方案1】:

数据库旨在执行许多对数据处理有用的事情。事务处理的许多好处都包含在首字母缩写词 ACID 中——原子性、一致性、隔离性、持久性。换句话说,数据库的行为方式与您在其中存储内容时所期望的方式相同。数据在那里,关系被强制执行,明天就会在那里。

您想要的功能在查询端。一般的数据库(虽然可能不是特别是 MS Access)允许一个相对标准的接口来进行强大的处理。数据库引擎知道如何优化查询。数据库引擎知道如何管理内存。数据库引擎知道如何使用磁盘、RAM 和缓存来管理分层内存。数据库知道如何利用索引、行分区和其他优化(您可以通过使用更高级数据库的免费版本来获得此功能,例如 SQL Server、Oracle、Postgres 甚至 mysql)。

您正在谈论数千行数据。数据库可以轻松处理数百万行。你说的是两张桌子。数据库可以使用十几个表轻松管理更多表和查询。

所以,不,您不应该将数据加载到应用程序端的内存结构中。您应该在数据库中进行处理并带回您想要的结果。然后,您可以在应用程序端格式化结果,以利用应用程序最擅长的功能:与用户交互。

【讨论】:

以上是关于我应该执行多个 sql 查询还是一个大型查询并在服务器上进行处理?的主要内容,如果未能解决你的问题,请参考以下文章

大型sql server查询性能优化

Excel ODBC - SQL 查询

Python - 从文件执行多个 SQL 查询

JOINS 的大型查询中的 SQL 子查询链

ADO.net执行多个查询(ExecuteQuery和ExecuteScalar)并在Web表单控件中显示结果

SQL Server 获取解析的查询