首先,我理解主键在SQL中的表或任何数据库中的作用。
但是,当谈到用户定义的表类型时,我发现自己无法理解为什么要创建主键。根据我的经验,我发现他们没有任何性能上的好处,但我怀疑我的发现可能来自我对它们的一般用法和有限的经验,而不是更有经验的观点。
例如,我通常使用表值参数进行插入/更新过程,或者传递创建select查询时使用的值数组。我发现它们没有性能上的好处,如果有的话,我的性能下降很小(但我们说的最多只有10毫秒,所以它几乎可以忽略不计)。
我应该披露,他们内部传递的任何数据都已经过仔细清理/订购,因此我可能没有看到这样的好处,但我无法轻易了解。
因此,问题是,我是否应该在用户定义的表格类型上使用主键,或者它不是那么重要?
如果这是重复的道歉。我做了相当多的搜索,但后来我可能使用了错误的关键字组合。
您的见解将永远受到高度赞赏。
答案 0 :(得分:-1)
您可以在用户定义的表类型上创建主键,从而形成聚簇索引。但是无法在用户定义的表类型上创建非聚簇索引。
有关您的信息,请参阅以下页面
http://technet.microsoft.com/en-us/library/bb522526(v=sql.105).aspx
答案 1 :(得分:-1)
如果您传递的数组是一个id数组,以便在与其他表连接时直接匹配,那么拥有一个聚簇主键就足够了。
为了避免在插入之前花时间订购数据,您应该已经在应用程序端订购了它。
在这种情况下,我经历了大约400毫秒的收益。
必须逐案评估。
答案 2 :(得分:-1)
实际上,我对同一件事感到好奇,只是从不同的角度...
我们有一个动态查询,该查询是根据用户输入进行组合而成的,导致查询类似
"SELECT A.*
FROM A
<some joins, etc>
WHERE A.ID IN ('" + String.Join("','", List<UserInputs>) + "')"
我想用tvp关闭sql注入孔,但是查询性能完全下降(数量级变慢)。
带有文字的计划始于一个漂亮的,干净的索引,它在id列中向下扫描,并且非常迅速。
TVP的计划在加入选择性部分之前,由于加入了TVP而陷入各种麻烦,并实现了整个表格。
我想知道是否在tvp类型上放置主键可能会使优化器生成更好的计划。