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

时间:2017-06-26 19:07:22

标签: 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>

1 个答案:

答案 0 :(得分:1)

  

结果集中提到的BLOB值重复是否会影响通过网络传输的数据量

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

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

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

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

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

现在MySQL Connector / Java因其默认行为&#34; slurping&#34;而闻名。整个ResultSet一次性下载到客户端,因此其他JDBC驱动程序可能采取不同的行为。您可能应该使用您打算使用的实际JDBC驱动程序进行一些测试。