ADO.NET DataTable的约束如何影响性能?

7

DataTable上的约束(例如PrimaryKey和UniqueContraint)是否像在SQL Server中一样使选择更有效率?还是它们只是用于强制执行数据规则的目的?

myDT.Constraints.Add("PK", myDT.Columns["UniqueID"], true); //add a primary key
myDT.Constrinats.Add(new UniqueConstraint(new DataColumn[] { //add a unique constraint for UserID
    myDT.Columns["UserID"], myDT.Columns["UniqueID"]
})); 

当通过 UniqueIDUserID 在 DataTable 中查找数据时,这些示例是否可能具有更好的性能?


我认为第二版是正确的标题,Terrapin。在这种情况下,“Affect”比“Effect”更好。我看到你一直在两者之间反复,所以如果你同意的话,我会让你编辑它。 - Matt Hamilton
3个回答

4
我认为你混淆了主键和约束(业务领域模型)的使用与索引(性能)的使用。
外键可以影响优化器,通常会在外键上创建索引。
在SQL Server世界中,主键经常被误解为聚簇索引,因为更常见的情况是选择一个代理键(例如自增身份列)作为主键和聚簇索引。
这篇文章可能会有所帮助:ADO.NET 2.0中的DataSet和DataTable
针对您的评论:

对于重复的非主键搜索,请使用DataView如果需要重复使用非主键数据进行搜索,请创建具有排序顺序的DataView。这将创建可用于执行搜索的索引。这最适合于重复搜索,因为创建索引需要一定的成本。

DataView对象公开了Find和FindRows方法,以便查询基础DataTable中的数据。如果只执行单个查询,则创建索引所需的处理会降低使用索引获得的性能。

创建DataView对象时,请使用带有Sort、RowFilter和RowStateFilter值的DataView构造函数作为构造函数参数,以及基础DataTable。使用DataView构造函数可确保仅构建一次索引。如果创建空DataView并在之后设置Sort、RowFilter或RowStateFilter属性,则索引至少会构建两次。


1
有没有一种方法可以向 ADO.NET DataTable 添加索引,以便在这些列上进行高效的查找?我没有看到这样的方法,因此使用了 UniqueConstraint,在 SQL Server 中会给我一个隐式索引。我只是不知道同样的效率是否适用于 .NET。 - Seibar
你应该对其进行基准测试,看看它是否能够改善你的情况。结果可能会让你惊讶。 - Jim Counts

0

通常情况下,约束会减慢程序的运行速度。但是对于查询操作,唯一约束可以提高速度(我可以找到微软的参考资料),同时它也可能受到查询条件的限制。大多数参考资料都强调了约束会降低程序的运行速度。

因此,在您的情况下,使用唯一约束可能会提高性能。

http://msdn.microsoft.com/en-us/library/49z48hxc.aspx


我找到了这个链接: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-03/msg00379.html - user117499

0

DataTable是使用B-树(或其某种变体)实现的。快速查看Reflector可以看到DataTable类中有一个Index类加上LiveIndexes属性,这意味着存在一些索引,但我真的不知道它们在哪里。

从我的(非常有限的)经验来看:对主键进行查询非常快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接