我有一个包含许多临时表的大型查询(Web仪表板查询)。我在临时表上创建了索引。使用该查询的应用程序具有一个具有不同权限级别的用户管理模块。我的问题是索引像temp db这样的每个会话创建? 我不希望跨会话共享索引。
我一直在做类似
的事情EXEC('CREATE INDEX idx_test'+ @sessionId + 'ON #TempTable (id1,id2)');
这是必要的。我已经看到一些开发人员已经完成了它。
答案 0 :(得分:1)
临时表(#t,而不是## t)上的索引不会在会话中共享,也不需要为临时表上的索引创建唯一索引名称。
有什么不同(可能是您在其他开发人员的代码中看到的)是{{1}} NAME。对于不同的表,索引名称可以重复多次,但约束名称在数据库中必须是唯一的。
因此,您可能会看到存储过程的代码,该代码通过引用会话来创建约束名称,这是尝试为约束提供唯一名称。因为如果你在两个会话中启动一个创建临时表#t的存储过程,那么每个会话都会创建自己的表,并使用它自己的名称(不仅仅是#t,系统会在表名中添加额外的符号,使其唯一)< / p>
但是如果同一个proc尝试创建CONSTRAINT PK_t,第一个会话将成功但第二个会得到一个错误,即约束PK_t已存在于数据库中(tempdb)