java - 在 SELECT 查询中从 JOIN 复制 BLOB 值是否会显着影响性能?

标签 java sql database jdbc blob

我关注的案例如下。一共有三个表:

CREATE TABLE Transaction(
  Id DECIMAL(13,0),
  User_Name CHAR(50)
  PRIMARY KEY (Id)
);
--
CREATE TABLE Attachment(
  Id DECIMAL(13, 0),
  Transaction_Id DECIMAL(13, 0),
  Description CHAR(200),
  PRIMARY KEY (Id),
  FOREIGN KEY (Transaction_Id) REFERENCES Transaction(Id)
);
--
CREATE TABLE Transaction_Data(
  Transaction_Id DECIMAL(13, 0),
  Json BLOB(32M),
  PRIMARY KEY (Transaction_Id),
  FOREIGN KEY (Transaction_Id) REFERENCES Transaction(Id)
);

对于每一笔交易,可以有0个或多个附件,0个或只有一个用BLOB编写的JSON。我需要获取与特定交易相关的所有数据。为此,我编写了以下 SELECT 查询:

SELECT t.Id, t.User_Name, a.Id, a.Description, d.Json
FROM Transaction t
LEFT JOIN Attachment a
    ON a.Transaction_Id = t.Id
LEFT JOIN Transaction_Data d
    ON d.Transaction_Id = t.Id
WHERE t.Id = 100;

在结果表中,我得到的 BLOB 值 (JSON) 重复的次数与交易的附件一样多。我需要在我的 Java 应用程序中使用结果集。应用程序与数据库远程通信。所以,我的问题是,所提到的结果集中 BLOB 值的重复是否会影响通过网络传输的数据量,以及处理此类情况的常见做法是什么?

我正在使用 IBM DB2 数据库和驱动程序 db2jcc4-4.9.78,或 Maven 依赖项:

<dependency>
  <groupId>db2jcc4</groupId>
  <artifactId>db2jcc4</artifactId>
  <version>4.9.78</version>
</dependency>

最佳答案

does the mentioned duplication of BLOB value in result set affect the amount of data transferred via the network

像这样的 JDBC 问题的答案通常取决于特定 JDBC 驱动程序的实际实现。在不知道您使用的 JDBC 驱动程序的情况下,我无法确定复制是否影响通过线路传输的数据量,但快速测试表明它肯定可以> 影响那个音量。

我在 MySQL 中创建了一个名为 transaction_data 的表,在名为 json 的列中有一个 1.7 MB 的 LONGBLOB。我创建了一个小的 Java 测试来使用 mysql-connector-java-5.1.41 和默认连接属性、ResultSet 属性等来查询该数据库。另外值得一提的是,我刚刚做了 ResultSet rs = ps.executeQuery( );我没有遍历 ResultSet 并使用 getBlob 显式检索 json 值。 (事实上​​,我根本没有从 ResultSet 中检索任何值。)

当我执行一个影响带有一 (1) 个附件的事务的 SELECT 查询时,相关的 json 值只包含在一行中,Wireshark 告诉我该查询的总网络流量 (两个方向)是 1877488 字节,或 1.8 MB。

在向该事务添加九 (9) 个附件后,相关的 json 值包含在十 (10) 行中,Wireshark 告诉我该查询的总网络流量(双向)是 18766790 字节,或 17.9 MB。

所以是的,在这种情况下,重复的 json BLOB 被拉过电线十 (10) 次。

现在 MySQL Connector/Java 以其一次性将整个结果集“吞噬”到客户端的默认行为而闻名,因此其他 JDBC 驱动程序的行为可能有所不同。您可能应该对打算使用的实际 JDBC 驱动程序进行一些测试。

关于java - 在 SELECT 查询中从 JOIN 复制 BLOB 值是否会显着影响性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44766967/

相关文章:

mysql - 聚合 MAX COUNT 子查询,带连接

mysql - SELECT 语句的 WHERE 子句中列名的通配符?

sql-server - 从 DataSet 创建数据库 (mdf)

java - 创建名称为 'employeeController' : Injection of autowired dependencies failed 的 bean 时出错

Java:计算 java.util.BitSet 中设置的位数

java - JComboBox:ItemStateChange 上的行为

database - MySQL 查询未从 2 个连接表中正确选择

JAVA - 是否有用于客户端-服务器交互/连接的日志/任何文件?

MYSQL INNER JOIN 其中一行不存在属性

php - 在 ID 上连接了 2 个表,工作正常,但现在我想回显另一个表的 ID