ADO.NET DataTable约束如何影响性能?
对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"] }));
在通过UniqueID
或UserID
查找DataTable中的数据时,这些示例是否可能具有更好的性能?
我认为您使用索引(性能)会混淆主键和约束(业务域模型)的使用。
外键可以影响优化器,并且通常在外键上创建索引。
在SQL Server世界中,主键通常与聚簇索引混淆,因为选择代理键(认为自动增量标识列)的次数通常是主键和聚簇索引。
本文可能很有用: ADO.NET 2.0中的DataSet和DataTable 。
回应你的评论:
使用DataView进行重复非主键搜索如果需要使用非主键数据重复搜索,请创建具有排序顺序的DataView。 这将创建一个可用于执行搜索的索引。 这最适合重复搜索,因为创建索引需要一些成本。
DataView对象公开Find和FindRows方法,以便您可以查询基础DataTable中的数据。 如果仅执行单个查询,则创建索引所需的处理会降低使用索引所获得的性能。
创建DataView对象时,请使用DataView构造函数,该构造函数将Sort,RowFilter和RowStateFilter值作为构造函数参数以及基础DataTable。 使用DataView构造函数可确保索引构建一次。 如果您创建一个空的DataView并在之后设置Sort,RowFilter或RowStateFilter属性,则索引至少构建两次。
使用B树 (或其一些变体)实现DataTable
。 快速浏览一下Reflector,可以看出在DataTable
类中有一个Index
类加上LiveIndexes
属性,这意味着有一些索引,但我真的不知道它们在哪里。
从我(真正有限的)经验来看:对PK的查询非常快。
一般而言,约束会减慢速度。 但是对于选择,唯一约束可以加快速度(但我可以找到MS参考),也可以根据选择限制。 我发现的大多数参考文献都谈到了限制减慢的限制因素。
因此,在您的情况下,它可以提高性能。