gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:23:23 28 4
gpt4 key购买 nike

我创建了一个表来插入我的应用程序的所有文档。这是一个简单的表(我们称之为 DOC_DATA),它有 3 个字段:DOC_ID、FileSize、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

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

替代解决方案是将 FIleSize 字段放在所有主表(CUSTOMER_DOCUMENTS、EMPLOYEES_DOCUMENTS,...)中。当然加入对性能有一点影响,现在我不是问一般的加入或不加入,而是加入或不加入一个巨大的表,而我对巨大的字段不感兴趣。

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

最佳答案

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

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

关于sql-server - 在包含 varbinary(max) 数据的表中查询非 varbinary(max) 字段是否存在性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2911677/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com