Database 我应该在用户定义的表类型上有主键吗?
首先,我了解主键在SQL表或任何数据库中的作用 然而,当涉及到用户定义的表类型时,我发现自己不明白为什么要创建主键。根据我的经验,我没有发现它们对性能有任何好处,但我怀疑我的发现可能来自于我对它们的普遍使用和有限的经验,而不是一个更有经验的观点 例如,我通常在插入/更新过程中使用表值参数,或者传递在创建select查询时使用的值数组。我没有发现它们对性能有任何好处,如果说有什么的话,我也经历了一个小的性能下降(但我们最多说10毫秒,所以它可以忽略不计) 我应该透露,在它们内部传递的任何数据都已被非常小心地清理/订购,因此我可能没有看到由此带来的好处,但我无法轻易知道 因此,问题是,我应该在用户定义的表类型上有一个主键,还是没有那么重要 如果这是一个重复的道歉。我做了大量的搜索,但是我可能使用了错误的关键字组合Database 我应该在用户定义的表类型上有主键吗?,database,sql-server-2012,table-valued-parameters,Database,Sql Server 2012,Table Valued Parameters,首先,我了解主键在SQL表或任何数据库中的作用 然而,当涉及到用户定义的表类型时,我发现自己不明白为什么要创建主键。根据我的经验,我没有发现它们对性能有任何好处,但我怀疑我的发现可能来自于我对它们的普遍使用和有限的经验,而不是一个更有经验的观点 例如,我通常在插入/更新过程中使用表值参数,或者传递在创建select查询时使用的值数组。我没有发现它们对性能有任何好处,如果说有什么的话,我也经历了一个小的性能下降(但我们最多说10毫秒,所以它可以忽略不计) 我应该透露,在它们内部传递的任何数据都已被
将非常感谢您的见解。您可以在用户定义的表类型上创建主键,从而形成聚集索引。但不可能在用户定义的表类型上创建非聚集索引 有关您的信息,请参见下页
如果要传递的数组是一个ID数组,在连接时直接与其他表匹配,那么使用集群主键是完全有意义的 为了避免在插入之前花费时间对数据进行排序,您应该已经在应用程序端对其进行了排序 在这种情况下,我经历了大约400毫秒的增益
它必须逐案评估。事实上,我对同样的事情很好奇,但从不同的角度 我们有一个动态查询,它是根据用户输入组合在一起的,结果是一个类似
"SELECT A.*
FROM A
<some joins, etc>
WHERE A.ID IN ('" + String.Join("','", List<UserInputs>) + "')"
“选择一个*
从
其中A.ID位于(“+”String.Join(“,”,List)+”)中
我想用tvp关闭sql注入漏洞,但查询性能完全崩溃了(慢了几个数量级)
带有文本的计划从一个漂亮、干净的索引开始,沿着id列向下扫描,速度非常快
带有TVP的计划与TVP的连接进行了各种复杂的操作,并在进入选择性部分之前实现了整个表
我想知道在tvp类型上放置主键是否可以让优化器生成更好的计划 由于必须构造聚集索引,因此性能下降很小。如果数据是预先排序的,并且您不会对数据执行选择性查询,那么索引只是浪费资源。如果您不想在集合上强加新的顺序或重复调用集合上的某些选择性查询,这将受益于索引,如果集合足够大,则创建聚集索引和其他潜在的非聚集索引是值得的。@Jodrell,谢谢,这很有意义。出于某种疯狂的原因,我没有考虑构建聚集索引的开销!!!很高兴知道我对预定数据的假设是准确的。谢谢。我事先花了很多时间看那一页。虽然我了解所有这些,但在这种情况下,它并没有真正回答我所经历的“应该/不应该”难题。