在包含varbinary(max)数据的表中查询非varbinary(max)字段是否存在性能问题?

3
我创建了一张表来插入我应用程序中的所有文档。这是一个简单的表,我们称之为DOC_DATA,它有三个字段:DOC_ID,FileSize和Data。Data是varbinary(max)类型。
然后我有很多其他数据的表(如CUSTOMERS_DOCUMENTS、EMPLOYEES_DOCUMENTS等),这些表包含其他数据(如“文档描述”、“创建者”、“客户ID”...)。虽然我的情况并非完全如此,但通过编写此示例,我可以更好地表达自己。所有这些表都具有对DOC_DATA.DOC_ID的外键约束。
当用户搜索客户文档时,他将运行类似于以下查询的查询语句:
select CD.*, DD.FileSize
from DOC_DATA DD
join CUSTOMERS_DOCUMENTS CD ON CD.DOC_ID = DD.DOC_ID

我的问题是:我们从一个可能包含许多GB数据的表(DOC_DATA表)中读取字段,这个查询的性能会不会很差?或者这不是一个问题?
另一种解决方案是将FileSize字段放在所有主要表中(CUSTOMER_DOCUMENTS,EMPLOYEES_DOCUMENTS等)。当然,连接对性能有一定影响,现在我不是在讨论一般的连接问题,而是在讨论当我不关心巨大字段时,是否连接一个巨大的表。
请注意:我正在维护一个旧系统,所以我不讨论最好的设计方案,只讨论在这种情况下最好的选择。
1个回答

2

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

对于各种yada(max)数据类型,SQL在行中存储一个大约16字节的指针(或引用标记、转发记录或其他名称),实际数据存储在单独的页面集中。因此,如果您不读取该列,则无需访问那些页面,也不会导致磁盘I/O负担。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接