临时表索引在会话中是唯一的还是共享的?

时间:2017-07-10 09:21:27

标签: sql sql-server tsql

我有一个包含许多临时表的大型查询(Web仪表板查询)。我在临时表上创建了索引。使用该查询的应用程序具有一个具有不同权限级别的用户管理模块。我的问题是索引像temp db这样的每个会话创建? 我不希望跨会话共享索引。

我一直在做类似

的事情
EXEC('CREATE INDEX idx_test'+ @sessionId + 'ON #TempTable (id1,id2)');

这是必要的。我已经看到一些开发人员已经完成了它。

1 个答案:

答案 0 :(得分:1)

临时表(#t,而不是## t)上的索引不会在会话中共享,也不需要为临时表上的索引创建唯一索引名称。

有什么不同(可能是您在其他开发人员的代码中看到的)是{{1}} NAME。对于不同的表,索引名称可以重复多次,但约束名称在数据库中必须是唯一的。

因此,您可能会看到存储过程的代码,该代码通过引用会话来创建约束名称,这是尝试为约束提供唯一名称。因为如果你在两个会话中启动一个创建临时表#t的存储过程,那么每个会话都会创建自己的表,并使用它自己的名称(不仅仅是#t,系统会在表名中添加额外的符号,使其唯一)< / p>

但是如果同一个proc尝试创建CONSTRAINT PK_t,第一个会话将成功但第二个会得到一个错误,即约束PK_t已存在于数据库中(tempdb)