具有id列的表的索引建议

时间:2013-05-01 13:51:02

标签: sql sql-server sql-server-2008 tsql

我有一个表,其中所有列都存储其他表(巨大的表)的ID。

CREATE TABLE  #mytable (
Table1Id int,
Table2Id int,
Table3Id int,
Table4Id int,
Table5Id int,
)

现在我的select已连接到其id存储在我的表的列中的所有表。

select T1.col1, t2.Col1, T3.col1... from 
#mytable MyTable inner join table1 T1 on MyTable.Table1Id = T1.Id
inner join table2 T2 on MyTable.Table2Id = T2.Id
inner join table3 T3 on MyTable.Table3Id = T3.Id
inner join table4 T4 on MyTable.Table4Id = T4.Id
inner join table5 T5 on MyTable.Table5Id = T5.Id
order by T1.Col1, T2.col1

目前我只有Table1Id的索引和其他表的所有id列。任何改善表现的建议。

3 个答案:

答案 0 :(得分:1)

您没有说明当前在哪个列上定义了索引,但根据您的示例查询,您应该为所有五列创建索引;

Table1Id, Table2Id, Table3Id, Table4Id, Table5Id

这允许SQL引擎仅通过读取索引来解析查询,索引应该比读取索引更快,然后读取表。

如果您运行查询以访问某些列,那么您还需要这些列的索引。假设您在Table3Id和Table4Id上运行查询。然后你需要在;

上创建一个索引
Table3Id, Table4Id

如果这些索引应该是唯一的或非唯一的,我无法从您在问题中提供的信息中看出来。你必须做出决定。

答案 1 :(得分:1)

检查#mytable
您在该表上没有搜索条件
没有 没有订单

没有小组

你只是按顺序排列这些行 #mytable上的任何索引都没有用 该查询不使用索引Table1Id,并且会降低插入速度

我怀疑#mytable只是一个输出表,where条件用于填充该表。

联接将使用要加入的表上的ID 因此,如果可以,请将table1-x上的索引ID作为PK(聚集)索引。
如果该索引碎片化,则碎片整理 这种联合应该是一个指数寻求,你不能做得更好 验证查询计划是否在连接上有索引搜索 如果您没有对这些联接进行索引搜索,则发布查询计划 您可以尝试在连接上提示,但我怀疑查询优化器会正确 - 这可能是一个大查询,但它不是一个复杂的查询。

如果您按单个列排序#mytable,SQL将抓取页面,因此您更有可能将该页面存入内存。
如果您可以按照PK的顺序插入PK,则PK是免费的 在这种情况下,您可以将具有最多值的列放在最后位置 实际上会把最紧密的PK分组放在最后一个位置 然后按PK排序。

答案 2 :(得分:0)

对于你提出的问题的陈述,你可能做的很少。实际上,如果您处于内存有限的环境中,索引在某些情况下甚至会受到伤害。

但是,作为第一步,您应该在id列的编号表中包含索引。也就是说,您应该存储然后加入这些表的主键(索引在主键上是自动的)。

通常,索引的目的是防止扫描整个表以查找特定的记录集。在这种情况下,看起来您仍然需要所有记录,因此需要进行全表扫描。这限制了索引的适用性。 SQL Server很有可能将这些连接转换为散列连接,这是在需要读取所有行时加入表的有效方法。

根据wheregroup by条款,可能需要其他索引。