2011-02-25 70 views
0

我有一个缓慢的SQL Server 2005中的查询。它有3个内部联接(在有几万行到一百万行的表上),以及一个由条款。SQL Server 2005与联接和订单缓慢查询通过

所有的连接键都是uuid列,但其中一个表只有一个索引(每个表的主键都是uniqueidentifier类型,而另一个表的列有一个作为外键的列)相同的值加入,但它没有索引)。

我假设在作为外键的列上添加一个索引将对此有极大的帮助。

我的其他选择是如何最大限度地优化此查询?

注意:我的分贝似乎有一个CPU瓶颈,认为这个查询(这是经常运行)可能会导致它?数据库只有大约2GB,我有4GB RAM,所以我怀疑有很多I/O问题。订单是否会吃掉CPU?

+2

我建议你发布确切的表定义和所有索引,而不是结构的描述。 – 2011-02-25 20:23:46

回答

2

你需要索引你的连接密钥!如果您加入多个字段,请添加涵盖所有这些字段的覆盖索引(与它们在查询中的顺序相同)。这可能会处理90%的性能问题。

这样的查询可能会遇到CPU瓶颈,因为服务器必须对所有连接执行表扫描。

+0

但奇怪的是,即使我缺少索引,检查查询计划显示它只做集群或非集群索引查找。这怎么可能? – 2011-02-25 21:38:11

+0

您正在查看实际的还是预计的执行计划?你能给我们Remus要求的信息,表格结构和索引吗?基于不完整的信息很难诊断。 – JNK 2011-02-25 21:42:25

+0

我无法发布实际的表数据,但我所描述的基本上是完整的(除了按顺序使用的表上的某些列的例外)。除了每个表中的uuid pk以外,不存在其他键(不存在外键)。但要回答你的问题,这是一个估计的执行计划。 – 2011-02-25 21:59:08

0

如果您的连接是内连接,您可以创建索引视图。这会为您提供运行时性能,就好像没有连接并且根本没有排序。它不会比这更快(以磁盘空间为代价)。如果您的连接是外连接,则有一种解决方法:插入一个充当“空”类值的虚拟行并切换到内连接。

正如JNK指出的那样,索引外键列仍然很重要。尽管可能,但不太可能,你可以逃避不索引它们。

+0

有人可以解释为什么这是downvoted? – 2011-02-25 20:50:50

+0

@Joda - 我猜是因为这是不正确的。 – JNK 2011-02-25 21:26:02

+0

那么请告诉我为什么! – usr 2011-02-25 21:29:03