【问题标题】:Separation and access times in SQL serverSQL Server 中的分离和访问时间
【发布时间】:2015-06-21 19:46:30
【问题描述】:
在 SQL Server 中,如果我有一列很大,它会减少我可以拉入页面的行数(并且可能会增加访问时间)。
如果我从表中删除该列并将该数据放在一个更加独立的表中,它将增加我可以提取一页数据的行数。
假设我从数据库中完全删除该列并将其完全放入单独的数据库中。这会减少数据库中所有内容的查找时间吗?
更笼统地说:什么时候将列移到单独的表中有意义,什么时候应该移到单独的数据库中?
【问题讨论】:
标签:
sql-server
database-design
sql-server-2008-r2
sql-server-2012
database-schema
【解决方案1】:
如果确实需要频繁访问该列,则将其放在单独的表(或数据库)中会导致需要连接到另一个表。什么都没有保存。事实上,如果这种特定的性能考虑是移动列的唯一原因,性能会变得更差。
如果您经常访问表的子集,但有时仍需要访问所有列,请考虑使用 covering index 进行此类查询。
【解决方案2】:
micahhoover 你的问题读起来像是小林丸的情景。如果长数据大部分是空的并且大部分不需要显示,那么你可以把它放在另一个表中,这样你就可以在你的页面中打包更多。但是,如果您的双表数据位于 SQL 缓存中,那么它占用的空间量与将其放在同一个表中并将表加载到缓存中所占用的空间量相同。
当很少需要数据时将数据放入另一个表中效果很好,并且在每次访问主表期间将通过单独的查询而不是连接来检索数据,这将导致 Eric J. 提到的性能影响。
由于需要同步备份、日志文件备份等,将数据放入另一个数据库将是一场灾难。
只有一种方法可以确保您拥有最佳设计。唯一的方法是使用真实世界的数据和查询对几种设计进行基准测试。
【解决方案3】:
在 SQL Server 中,如果我有一列很大,它会减少
我可以在页面中拉入的行数(并且可能会增加
访问时间)。
理论上是的。这取决于某些因素。这取决于数据类型,以及该列中包含数据的频率和数量。
如果我从表中删除该列并将该数据放入更多
隔离表它将增加我可以拉入的行数
数据页。
技术上是的,但同样取决于几个因素。
假设我从数据库中完全删除该列并将其放入
完全独立的数据库。这会减少寻找时间吗
数据库中的所有内容?
这取决于您对数据库的操作,例如 sql server 管理内存等,但大多数情况下没有。我不会这样做。在不需要时跨数据库连接数据总是比它的价值更麻烦。有很多事情需要考虑,例如备份计划、管理数据库增长等。99% 的时间,这是不值得的。
听起来您确实在尝试使用vertical partitioning 来提高查询速度。现在理论上这可能有所帮助,但我猜你正在查看的数据量并不会真正使这变得有利。如果您希望查找速度更快,我将从查看查询执行计划和索引开始,以确保一切正常。
移动场地以提高速度应该是最后的手段,因为它会使维护等变得更加乏味。这种方法也必须向任何接管的人解释,但他们首先要问的是为什么所有这些 1x1 关系存在,除非他们知道这样做是为了提高性能,否则他们可能会尝试并开始逻辑地组织数据回到一起。