3

我创建了一个表格来插入我的应用程序的所有文档。这是一个简单的表(我们称之为 DOC_DATA),它有 3 个字段:DOC_ID、FileSize、Data。数据是 varbinary(max)。

然后我有许多表(CUSTOMERS_DOCUMENTS、EMPLOYEES_DOCUMENTS、...),其中包含其他数据(如“文档描述”、“创建者”、“客户 ID”...)。我的情况不完全是这样,反正写这个例子我可以更好的表达自己。所有这些表都有一个对 DOC_DATA.DOC_ID 的 FK)。

当用户搜索客户文档时,他将运行类似于以下的查询:

select CD.*, DD.FileSize
from DOC_DATA DD
join CUSTOMERS_DOCUMENTS CD ON CD.DOC_ID = DD.DOC_ID

我的问题是:这个查询的性能会很差,因为我们还要从一个可能很大的表中读取一个字段(DOC_DATA 表可以包含许多 GB 的数据)或者这不是问题吗?

另一种解决方案是将 FIleSize 字段放在所有主表(CUSTOMER_DOCUMENTS、EMPLOYEES_DOCUMENTS、...)中。当然 join 对性能的影响不大,现在我不是在问一般的 join or not join,而是 join or not to join HUGE table,而我对 HUGE 字段不感兴趣。

请注意:我不是在设计一个新系统,而是在维护一个遗留系统,所以在这里我不讨论一般来说哪个是最好的设计,而只是在这种情况下哪个是最好的选择。

4

1 回答 1

2

我看不出为什么您的查询性能会因为这些大列的存在而受到影响。当您读取该数据时会出现性能问题 - 特别是当您需要数据库引擎返回文档时,但您(当然)在查询中没有这样做。

在内部,对于各种 yada(max) 数据类型,SQL 会在行中存储一个 16 字节左右的指针(或引用标记、转发记录或其他任何名称),而实际数据存储在单独的一组页面中. 因此,如果您不阅读该列,则不需要访问这些页面,并且不会导致磁盘 I/O 命中。

于 2010-05-26T14:13:45.833 回答