sql-server - Sql Server 字符串实习

标签 sql-server string sql-server-2008 compression

我们有一个表,用于存储所有异常(消息、stackTrace 等),该表变得越来越大,我们希望缩小它。

有大量重复的 StackTrace、消息等,但启用压缩会适度减小大小 (10%),而我认为如果 Sql Server 能够以某种方式实现的话,可能会带来更大的好处 intern the strings在一些每列哈希表中。

如果我规范化表并将 StackTrace 提取到另一个表,我可以获得一些好处,但异常消息、异常类型等也会重复。

有没有办法为 Sql Server 中的某些列启用字符串驻留?

最佳答案

没有内置方法可以执行此操作。您可以轻松地执行以下操作:

SELECT MessageID = IDENTITY(INT, 1, 1), Message 
  INTO dbo.Messages 
  FROM dbo.HugeTable GROUP BY Message;

ALTER TABLE dbo.HugeTable ADD MessageID INT;

UPDATE h
   SET h.MessageID = m.MessageID
   FROM dbo.HugeTable AS h
   INNER JOIN dbo.Messages AS m
   ON h.Message = m.Message;

ALTER TABLE dbo.HugeTable DROP COLUMN Message;

现在您需要做一些事情:

  • 更改日志记录过程以对消息表执行更新插入
  • 向消息表添加适当的索引(不确定消息数据类型)和 PK
  • 将 FK 添加到 MessageID 列
  • 在 HugeTable 上重建索引以回收空间
  • 首先在测试环境中执行此操作!

关于sql-server - Sql Server 字符串实习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10452353/

相关文章:

c# - SqlClient 返回奇怪的 OOM 异常? C#.NET 4

java - Glassfish/Toplink 和 sqljdbc.jar 在断开的数据库连接上永远重试

SQL Server 插入语句成功运行,但即使创建了行,值也不会添加到表中

sql-server - 如何查询当前用户的角色

c++ - char 数组的 cin 和 cin.get() 之间的区别

c# - 以编程方式将 SQL Server 数据库保存到 xml 文件并再次恢复它

sql-server - SQL Server 2008/64Bit - 如何创建包括 Excel 的查询

python - 在python中用通配符分隔字符串

ios - 如何将 Range<String.Index> 转换为 NSRange?

c# - 获取存储在存储二进制数据的数据列中的字节长度