我有一个复杂的sproc,它填充了大约400,000行的#temp表。有一些row_number()hotness确定重复。稍后在行编号> 1的sproc中删除重复项。 1。
最慢的部分是删除,添加索引有帮助。但是,当生产中运行许多连接执行相同操作时,在临时表上创建同名索引时会发生冲突。
在临时表上创建名称安全的临时索引的正确方法是什么?我认为在row_number列和ID的组合上创建主键可能会起作用,但这可能会更改更多的sproc代码。
所有想法都受到赞赏。
感谢。
答案 0 :(得分:0)
如果您确定不会有任何重复的密钥,那么这确实会产生索引。在需要可以为空的索引列的情况下,您必须使用唯一约束。此外,如果您需要多个索引,那么您只能使用主键提供其中一个
展示
下面的代码将创建一个包含主键和唯一约束的临时表。
CREATE TABLE #t
(
id int,
row_number int,
data varchar(25),
PRIMARY KEY CLUSTERED (id,row_number),
UNIQUE NONCLUSTERED (row_number,id)
)
下一段代码将显示tempdb中用于构成本地临时表基础的数据库对象的元数据
SELECT
QUOTENAME(s.name) SchemaName,
QUOTENAME(t.name) TableName,
QUOTENAME(i.name) IndexName,
i.type_desc IndexType,
i.is_unique is_unique
FROM tempdb.sys.schemas s
JOIN tempdb.sys.tables t ON t.schema_id = s.schema_id
JOIN tempdb.sys.indexes i ON t.object_id = i.object_id
where t.name like '#t[_]%'
您应该看到一个表格具有很长(128个字符)的名称,如
[#t_______....______00000000002B]
(我已经删除了一些得分以使其可读)
您还应该看到一个聚合索引,其名称的格式为
[PK__#t________6AE3842495F16AE5]
和一个唯一的非聚集索引,其名称的格式为
[UQ__#t________6C27FF361E0F4A70]
如果您随后在另一个会话中创建本地表,您将看到tempdb中出现一个额外的表和一对索引,名称略有不同