我正在寻找最快的方法来检查是否存在对象。 这个场景很简单,假设一个目录工具,它读取当前的硬盘。当找到一个目录时,它应该被创建,或者,如果已经存在,则被更新。在NHibernate中查询对象存在的最快方法
首先让只专注于创建部分:
public static DatabaseDirectory Get(DirectoryInfo dI)
{
var result = DatabaseController.Session
.CreateCriteria(typeof (DatabaseDirectory))
.Add(Restrictions.Eq("FullName", dI.FullName))
.List<DatabaseDirectory>().FirstOrDefault();
if (result == null)
{
result = new DatabaseDirectory
{
CreationTime = dI.CreationTime,
Existing = dI.Exists,
Extension = dI.Extension,
FullName = dI.FullName,
LastAccessTime = dI.LastAccessTime,
LastWriteTime = dI.LastWriteTime,
Name = dI.Name
};
}
return result;
}
这是去有关方式:
- 速度
- 相关分离
什么来头脑是以下几点:扫描将始终“整体”执行。意思是,在驱动器C的扫描期间,我知道没有新的东西被添加到数据库(来自其他进程)。因此,在扫描之前“缓存”所有现有的目录可能是一个好主意,并以这种方式查找它们。另一方面,这可能不适合大数据集,如文件(将会是600.000或更多)...
也许某些性能增益可以通过使用“索引列”或类似的东西来实现,但我对这个话题不太熟悉。如果有人有一定的参考,只是点我朝着正确的方向...
谢谢, 克里斯
PS:我使用NHibernate的,流利的接口,自动映射和SQL Express的(可切换到全屏SQL)
注意: 在给定的问题中,路径不是数据库中的ID。该ID是一个自动增量,我不能改变这个要求(其他原因)。所以,真正的问题是,什么是最快的方法“检查对象是否存在等,其中ID是不知道,只是该对象的属性”
而且配料是可能的,通过选择像“以C:Testfiles开头”这样的大团体,但问题仍然存在,我怎么事先知道这个集合有多大。我不能选择“最大1000”,并检查这个缓冲字典,因为我可能会“击中搜索目录旁边......”我希望这个问题是明确的。最重要的部分是缓冲确实影响了性能。如果是这样,是否有意义加载整个数据库在字典中,只包含PATH和ID(即使有1.000.000的对象,我认为..)
好的,谢谢你的回答。大部分是有趣的,我必须详细调查这一点。第一个建议的问题:我不知道ID。路径不是ID,我会在上面的帖子中添加它以使其更清楚。感谢你的回答... – 2009-06-04 16:17:08