遇到一个需求,需要保存每天产生的大量的日志记录,内容长度不定,一般不会超过300个字节,需要按时间排序,支持查询指定时间段内的记录,这样的需求如何设计表结构?谢谢回复!

解决方案 »

  1.   

    如果你仅仅保存的话,可以考虑使用2008新特性:FILESTREAM功能。这样文件存放在磁盘,但是可以通过数据库来管理。在表中只需要存个连接就可以了。到时要用再读取。其实有点想SQLServer的错误日志,都存放在磁盘。
      

  2.   

    这个功能不需要用FILESTREAM,只要存在数据库中就可以了。可以用IDENTITY设置为主键,如果数据量大了后可以在时间字段上加索引。 
      

  3.   

    存放到数据库有一个问题,就是格式问题,除非用xml,不然很难保证原有格式,但是用xml检索和读取分析的开销也还是要考虑的。
      

  4.   

    来自微软的官方文档:
    In SQL Server, BLOBs can be standard varbinary(max) data that stores the data in tables, or FILESTREAM varbinary(max) objects that store the data in the file system. The size and use of the data determines whether you should use database storage or file system storage. If the following conditions are true, you should consider using FILESTREAM:Objects that are being stored are, on average, larger than 1 MB.Fast read access is important.You are developing applications that use a middle tier for application logic.For smaller objects, storing varbinary(max) BLOBs in the database often provides better streaming performance. 
    针对你说的碎片问题其实可以用指定FILLFACTOR,因为这些数据不会频繁的被更改所以加索引也不会有太大的影响,而且通过Rebuild index可以解决你说的碎片问题(当然内部碎片可能会有),这个无法避免,但是影响不会太大。而且这个查询是以时间为条件的,所以可以针对时间做分区,这样查询性能是完全可以保证的。
      

  5.   


    都放在一张表中的话,会不会导致表中记录快速增长?查询效率会不会受到影响?另外,表记录数有没有限制?
    如果把内容都存进数据库,并且按你说法是大量日志,那么数据量会暴增,随着表、索引的增……因为是IDENTITY作为主键,不明白为什么页的分裂次数会快很多?据我了解分页是因为更新导致原有的页无法容纳数据,所以才会产生分页。而这个Log只是增加,不会频繁的更新,所以不太会有你说的这种现象。 使用Filestream一般是针对1M以上的文件使用的。 
      

  6.   


    如果你每条日志记录都用Filestream放到磁盘,你考虑过文件太多导致的性能问题吗? 如果OS上面一个文件夹下有10000W个文件,你要多久才可以打开这个目录? 
      

  7.   

    论坛不讨论还论个啥呢操作系统另外一个别名叫:文件系统。刚安装好的Windows都不止10万个文件拉。filestream本来就是为了解决存放图片之类所带来的性能问题才引入的。
      

  8.   

    其实楼主是要存日志内容,一条记录不会超过varchar(300),所以可以存到数据库。 如果是2008以后的版本还可以启用压缩功能减小数据存储空间。