sql server 2005 快速创建索引公式所需的空间
Posted
技术标签:
【中文标题】sql server 2005 快速创建索引公式所需的空间【英文标题】:sql server 2005 express space needed to create index formula 【发布时间】:2011-07-08 19:27:41 【问题描述】:计算索引需要创建多少空间的公式是什么?
重要提示:我们使用的是 sql server express 2005。所以 4GB 是限制。因此这个问题。 日志文件的无限制自动增长不是一个选项。下面的t-sql伪代码会进一步解释。
int spaceNeeded =
FN_COMPUTE_SPACE_NEEDED_TO_CREATE_UNCLUSTERED_INDEX(MyTableName, MyColumnName)
这是我在编写这个存储过程时遇到的一个函数 我想我可以使用 msdn 等提供的信息处理以下所有内容。
While(GetDBSpaceAvailable() < spaceNeeded )
purge some data (go thru all tables and delete data logically)
create the index we need
CREATE NONCLUSTERED INDEX [IX_NonClustered_MyTable] ON [dbo].[MyTable]
( [MyColumn] ASC
)
在这方面赞赏的任何指针。希望这是一个重复但我搜索时找不到任何东西。 谢谢
更新:对我有用的解决方案使用了 Aaron 的建议。 (在索引现在占用的空间之上增加了 1.2 倍)。所以基本上我会清除最旧的数据,直到可用空间是 sp_spaceused tablename 报告的当前索引大小的 1.2 到 1.5 倍。然后创建索引。
【问题讨论】:
您说“日志文件的无限制自动增长不是一个选项。”我不是 Express 的大用户,但您确定日志文件大小是计算的一部分吗? (我没有运行任何测试,但我很确定它不是。)你确定这与你的问题有关吗?运行此操作时,您是否看到大量日志使用、数据文件扩展或两者兼而有之? 感谢 Aaron 和 JNK。当我尝试在完整或几乎完整的 express db 上创建索引时,我将检查收到的错误消息。将很快在这里发布错误。我们在生产中使用 express db 来降低成本。该逻辑会在其最大化时清除较旧的数据。我们有一种情况,我们需要使用某些报告应用程序的索引来升级我们的 express db,这就是背景。 这是 Microsoft 的用户友好错误消息 :) 当我尝试创建索引时 Msg 1105, Level 17, State 2, Line 1 无法为对象 'dbo.SORT 临时运行存储分配空间:422212493901824 ' 在数据库 'MyDB' 中,因为 'PRIMARY' 文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组中添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。 【参考方案1】:大小限制仅针对每个数据库。您是否考虑过将一些垃圾、静态或至少不稳定的数据放入单独的数据库中?您可以创建同义词以使代码不会意识到某些数据位于其自己的 4GB 空间中。在一个实例上,您很难通过拆分来注意到任何性能差异,最大的问题是备份一致性,因为您将单独备份数据。但这是避免索引空间需求的一种方法。
另外,不要使用这个旧版本的 SQL Server 2005 Express,为什么不迁移到最新发布的版本 (SQL Server 2008 R2),您可以在其中多使用 6 GB(数据库大小限制为 10 GB而不是 4 GB)。此外,您还可以获得一些新功能、T-SQL 语法和性能优势。
【讨论】:
是的。我们正在升级到2008 express。令我惊讶的是,考虑到数据库的当前大小、正在创建索引的表的大小、正在创建的索引的列和列大小以及可用空间等,没有公式或一般准则来计算创建索引所需的空间... 重建索引的传统观点是,您需要在索引现在占用的空间之外再增加 1.2 倍。但是,正如 JNK 指出的那样,这可能会因实际使用的数据、填充因子、索引的更改而有很大差异……所以不,在您真正需要做之前,没有神奇的数学可以告诉您需要什么它。 好的。如果需要反复试验,那么我会喝杯咖啡并立即投入其中。谢谢【参考方案2】:我认为不可能确定。
不仅创建了索引,还创建了用于解析索引叶节点的 b-tree,以及支持统计信息。
这两个因素都会受到数据值分布、选择性等的影响。
还有一些其他选项会影响使用的空间,例如填充因子、包含的字段等。
此外,无论上述因素如何,为 varchar
或 nvarchar
字段计算此值都是一个真正的挑战,因为长度(以及因此使用的空间)因行而异。
获得 SQL Server 许可证更有意义,而不是花费数百个工时来确保准确并在不可避免地出现问题时处理重新编码。
【讨论】:
+1 找出执行此类任务需要多少空间的方法是执行任务。与其尝试根据需要多少空间来决定要清除多少数据,不如清除所有不需要的数据。如果您仍然没有空间,那么您需要向外扩展或向上扩展。 购买 SQL Server 许可证!!看看他们的定价。忘记工时。如果我们每次销售我们的产品都获得许可,我们可能会关闭商店,我将不得不回到印度再次成为软件苦力。 microsoft.com/sqlserver/2008/en/us/pricing.aspx谷歌苦力:-) 如果您没有在问题中明确说明您正在通过软件分发 Express,而不是仅使用内部数据库的副本,那么很难对建议嗤之以鼻。 没有嘲笑的意思。道歉。同意我的问题不清楚。谢谢以上是关于sql server 2005 快速创建索引公式所需的空间的主要内容,如果未能解决你的问题,请参考以下文章
数以千万计的插入索引表性能/策略(Sql Server >= 2005)
SQL Server 2005 事务复制无法发布包含索引创建的存储过程
如果存在可在 SQL Server 2005 和 SQL Server Compact 3.5 中使用的索引,则删除该索引的脚本