sql-server – 为什么建议将BLOB存储在单独的SQL Server表中?
This highly-upvoted SO answer建议将图像放在单独的表中,即使与另一个表只有1:1的关系:
为什么?我是在表中的SQL Server only stores a pointer to some dedicated BLOB data structure的印象,所以为什么还要手动创建另一层间接?它是否真的显着改善了性能?如果是,为什么? 解决方法虽然我不同意BLOB应该只是在另一个表中 – 它们应该是 not be in the database at all.存储指向文件所在磁盘的位置的指针,然后从数据库中获取它…他们造成的主要问题(对我来说)是索引.将XML与查询计划一起使用,因为每个人都有了,我们制作一张桌子: SELECT TOP 1000 ID = IDENTITY(INT,1,1),deq.query_plan INTO dbo.index_test FROM sys.dm_exec_cached_plans AS dec CROSS APPLY sys.dm_exec_query_plan(dec.plan_handle) AS deq ALTER TABLE dbo.index_test ADD CONSTRAINT pk_id PRIMARY KEY CLUSTERED (ID) 它只有1000行,但是checking on the size …… sp_BlitzIndex @DatabaseName = 'StackOverflow',@SchemaName = 'dbo',@TableName = 'index_test' 仅1000行就超过40 MB.假设你每1000行添加40 MB,那么很快就会变得非常难看.当你达到100万行时会发生什么?那里只有大约1 TB的数据. 现在,任何需要使用聚簇索引的查询都需要将所有BLOB数据读入内存说明:引用BLOB数据列时. 你能想到比存储BLOB更好的方法来使用SQL Server内存吗?因为我当然可以. 将其扩展为非聚簇索引: CREATE INDEX ix_noblob ON dbo.index_test (ID) CREATE INDEX ix_returnoftheblob ON dbo.index_test (ID) INCLUDE (query_plan) 您可以设计非聚簇索引以在很大程度上避免BLOB列,因此常规查询可以避免聚簇索引,但只要您需要BLOB列,就需要聚簇索引. 如果将其作为INCLUDED列添加到非聚簇索引以避免键查找方案,则最终会得到巨大的非聚簇索引: 他们造成的问题更多: >如果有人运行SELECT *查询,他们将获得所有BLOB数据. 希望这可以帮助! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |