一般来说,在 DBMS 中进行连接。如果您在应用程序服务器中执行此操作,那么您打赌您可以比编写 DBMS 的人更好地优化连接,并且(进一步)您可以通过足以抵消成本的方式超越他们的最佳努力通过网络传输未连接的数据。
现在,如果您要对两个宽表(假设它们是 T1,宽度为 W1 的 N1 行和宽度为 W2 的 N2 行的 T2)进行交叉乘积而不进行过滤,那么 DBMS 必须创建并通过线路发送 N1 * N2 * (W1 + W2) 字节的数据,而您可以将表格分别作为 N1 * W1 + N2 * W2 字节的数据来提取。如果 N1 = N2 = 1M 且 W1 = W2 = 100,那么这是 200 TB 与 200 MB 的数据传输,有利于在应用服务器中进行交叉产品。但这对 DBMS 来说并不完全公平。大多数查询并不是那么傻——它们加入列并应用条件,DBMS 优化器将竭力(并且自动)努力最小化完成的工作。此外,它只会将相关数据发回给您;它不必发送所有与您的条件不匹配的行。
为了展示另一种情况(有利于 DBMS),请考虑以下情况:T1 有 N1 = 1M 行宽度 W1 = 100,但 T2 有 N2 = 100K 行宽度 W2 = 50。一个整数列,因此,T1 中有 10 行,T2 中的每一行。假设您将所有 T1 和 T2 吸入应用服务器:这需要 N1 * W1 + N2 * W2 = 105 MB 的数据。但是过滤条件将数据限制为 T2 中行的 1/10,对于 T1 中与 T2 中的一行匹配的每一行,实际上只有 2 行匹配过滤条件。现在 DBMS 只传输 N2 * (W1 + W2) / 5 = 3 MB,DBMS 节省了超过 100 MB 的数据传输。现在,如果你设法聪明一点,只下载与 T2 中的值相对应的 N2 * W2 / 10 = 500 KB 数据,您仍然必须让 DBMS 对您想要从 T1 到应用服务器的正确行的值执行 T1 的“半连接”。如果您只需要列的一个子集,则可以节省另一组。DBMS 往往有相当聪明的排序包;你需要在你的应用服务器中有一个好的排序包来以正确的顺序呈现数据。
对于 DBMS 中的连接,它通常应该是一个不折不扣的胜利。如果不是,那是因为您要求服务器做的工作超出了它的处理能力。在这种情况下,您需要查看复制数据库服务器是否有意义,或者添加更多内核、更多网络带宽或更多主内存是否可以完成这项工作。