我有一个使用SQL FILESTREAM来存储图像的应用程序。我插入了 LOT 图像(每天数百万张图片)。
过了一会儿,机器停止响应并且似乎内存不足...看看PC的内存使用情况,我们看不到任何进程占用大量内存(SQL或我们的应用程序)。我们试图杀死我们的进程并且它没有恢复我们的机器......然后我们杀死了SQL服务并且它没有恢复到系统。作为最后的手段,我们甚至杀死了所有进程(系统除外)并且内存仍然很高(我们正在查看任务管理器的性能选项卡)。此时只有重新启动才能完成工作。我们尝试过Win7,WinXP,Win2K3服务器,结果总是一样。
不幸的是,这不是一次性的交易,每次都会发生。
以前有人见过这种行为吗?我们是否使用SQL FILESTREAMS做错了什么?
答案 0 :(得分:4)
你说你每天插入很多图像。你还对图像做了什么?你更新它们,很多读物?
您的文件系统是否针对FILESTREAM进行了优化?
你如何读出图像?
如果您进行了大量更新,请记住SQL Server不会修改文件流对象,而是创建一个新文件,并将旧标记对象标记为垃圾收集器。在某些时候,GC将触发并开始清理旧的混乱。 FILESTREAM的问题在于它不会将大量日志记录到事务日志中,因此GC可能会严重延迟。如果这是问题,可以通过更频繁地强制GC来维持响应性来解决。这可以使用CHECKPOINT语句完成。
更新:您不应将FILESTREAM用于小文件(小于1 MB)。数百万个小文件将导致文件系统和主文件表出现问题。请使用varbinary。另请参阅Designing and implementing FILESTREAM storage
更新2:如果您仍然坚持使用FILESTREAM进行存储(您不应该使用大量小文件),则必须至少相应地配置文件系统。
针对大量小文件优化文件系统(使用这些作为提示,并确保在申请之前了解他们的操作)