-2

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

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

现在我的选择已加入到所有其 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 列上的索引。任何提高性能的建议。

4

3 回答 3

1

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

Table1Id, Table2Id, Table3Id, Table4Id, Table5Id

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

如果您在访问某些列的地方运行查询,那么您还需要为这些列建立索引。假设您对 Table3Id 和 Table4Id 运行查询。然后你需要创建一个索引;

Table3Id, Table4Id

我无法从您在问题中提供的信息中判断这些索引应该是唯一的还是非唯一的。你必须做出这个决定。

于 2013-05-01T14:06:33.053 回答
1

检查#mytable
您在该表上没有搜索条件
no where
no order by
no group by

您只会以没有特定顺序的方式获取这些行。
#mytable 上的任何索引
都没有用该查询不使用索引 Table1Id 并且会减慢插入速度

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

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

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

于 2013-05-01T15:25:24.040 回答
0

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

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

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

根据whereandgroup by子句,可能需要额外的索引。

于 2013-05-01T14:10:15.743 回答