2016-09-27 102 views
0

即使我没有包含BLOB列,对BLOB表的SELECT查询也很慢。有人可以解释为什么,也可能如何规避它?我正在使用SQL Server 2012,但也许这更像是一个概念性问题,对于其他发行版也是如此。为什么在blob表上选择SQL查询很慢,即使没有选择blob也是如此。

我发现这个职位:SQL Server: select on a table that contains a blob,它显示了同样的问题,但明显的答案并不能解释为什么会发生这种情况,既没有提供如何解决问题的好建议。

+0

你是否也在使用SQL Server? – jarlh

+0

SQL Server 2012 R2,但我猜这对于许多MS SQL Server版本以及其他SQL服务器可能很常见? – LIvanov

+0

这可能是因为 - 也许SQL无法轻松缓存表页,而且您必须更频繁地访问磁盘。我不是专家,但为什么 - 如果它发生了,然后尝试我提到的表重新设计,如果你需要blob,只是做一个加入 – Cato

回答

2

如果您要求解决性能拖延的方法,您可以采取多种方法。向表中添加索引应该可以帮助大规模地提供您不是简单地选择整个记录集。在表格上创建视图也可能有所帮助。检查表上的索引碎片级别也是值得的,因为这可能导致性能不佳,并且可以通过定期维护工作来解决。建立一个链接表来存储blob数据的建议也是一个非常好的建议。

但是,如果您的问题是问为什么会发生这种情况,这是因为MS SQL Server功能的基本原理。本质上是您的数据库和服务器上的所有数据库,并分割成页面,8kb大小的数据与一个96字节的标题。每个页面代表单个I/O操作中可能的内容。页面收集包含并分组在Exents中,包含八个连续页面的64kb集合。因此,SQL Server每兆字节数据使用十六个执行。有几种不同的页面类型,例如数据页面类型将不包含被称为“大对象”的内容。这包括数据类型文本,图像,varbinary(max),xml数据等......这些也用于存储超过8kb的可变长度列(并且不要忘记96字节标题)。

在每个页面的末尾会有少量的可用空间。数据库操作显然会随时移动这些页面,并且可以在处理大量I/O和随机记录访问/修改的数据库中大量增加空闲空间分配。这就是为什么数据库上的可用空间可以大规模增长的原因。管理套件中提供了一些工具,可让您减少或删除可用空间,基本上这会重新组织页面和exents。

现在,我可能在这里做了一个飞跃,但我猜测你桌子上的斑点超过8kb。请记住,如果它们超过64kb,它们将不仅跨越多页,而且实际上跨越多个exens。这样做的最终结果是,“正常”表读取将导致大量的I/O请求。即使您对BLOB数据不感兴趣,服务器也可能需要读取页面和exents以获取其他表数据。随着更多的交易使构成表格的页面和缓冲区变得不连续,这将只会变得复杂。

在使用“大对象”的情况下,SQL Server将Row-Overflow值写入包含24位指针的数据实际存储位置。如果您的桌面上有多个列超过8kb页面大小与blob结合并受随机事务影响,您会发现服务器正在执行的大部分工作是将页面移入和移出内存的I/O操作,读取指针,获取相关的行数据等等,所有这些都代表着严重的开销。

+0

好。所以你说的是,在使用“大对象”的地方,SQL服务器会写入一些指向实际存储大对象的另一个地方(你猜对了,我的对象在50 kB和3 MB之间)。那么为什么引擎会加载BLOB引用指向的位置?如果我做了一个不包含BLOB的查询,为什么要取它呢?或者,如果那些放置BLOB的Exents包含更多数据?那么为什么要获取它的所有内容,而不仅仅是第一个和最后一个,前提是它们是顺序的,而我的BLOB跨越了其中的10个。 – LIvanov

+0

你已经在那里回答了你自己的问题;不能保证它们按顺序(甚至是连续地)存储。不要认为一个50kb的对象存在于7个页面中,因此它是一个exent。组成这个对象的7个页面都存在于2,3,甚至7个不同的exent中。 –

+0

我现在看到。感谢您解决这个问题。也许将其添加到您的答案,以便任何人可能会遇到相同的:)完全清楚 – LIvanov

2

我有一个建议的话,有一个单独的表中的所有斑点具有标识ID,然后只保存身份ID在你的主表

这可能是因为 - 也许SQL无法缓存表的页面作为很容易,你必须更频繁地去磁盘。尽管如此,我并不是专家。

很多人在BLOBS /数据库中的图像中皱眉 - 在SQL 2012中存在某种妥协方式,您可以配置数据库以将对象保留在文件结构中,而不再是实际的数据库中 - 您可能想要寻找

+0

我想这是最好的方式去,只是这不回答这是什么原因的问题。此外,目前我的公司还没有可能开始进行此项更改,因此我正在寻找不同的方法。 – LIvanov