2011-04-24 109 views
0

我在这里面临一个SQL语句的问题,该语句根据类别从新表中提取数据: 新闻:Id(PK)int,标题字符串,主题字符串,Uid int,Cid int。
与使用WHERE子句相关的性能问题

SELECT Id, Subject, Uid, Title FROM News WHERE Uid = @Uid 

这种说法慢慢地进行操作比较不声明WHERE因为它应该去检查每一行,以确保它是否完成的条件。

所以想象一下与1000000条新闻。我应该怎么处理这样的事情?

回答

4

如果Id列是可能已经聚集的主键(它们是默认值),那么您只需要在Uid列上创建非聚集索引 - 特别是Uid列是唯一标识符(GUID)数据类型。

这可以通过运行下面的SQL创建:

CREATE非聚集索引IX_News_Uid对新闻 ( 的Uid )

+0

以及如何!?我一直在阅读关于这个的文章,解决方案是通过实现一个T-SQL查询来创建非聚集索引,但我不知道在哪里写这个查询! – 2011-04-25 16:22:06

+0

我现在编辑了我的原始答案,以包含SQL来创建非聚集索引。注意:格式是创建非专用索引 ON (<列在索引>)。 – 2011-04-25 23:08:24

0

应该可以在Uid列上创建clustered index。这应该会提高性能。注意:每个表只能有一个聚簇索引列。

+1

还是非聚集索引将被罚款/更好,因为它只是找了一个单记录和配置项更适合用于范围查询。 – 2011-04-24 18:59:21

+0

每个表只能有一个聚簇索引吗? – 2011-04-24 18:59:36

+0

@Chad - 是的。所以OP可能已经有一个PK,除非他们明确地创建了非聚集。 – 2011-04-24 19:01:24

0

我会在Uid上创建一个唯一索引。

1

你应该创建一个索引的列Uid,与IdSubjectTitle为包含的列。

这样数据库就可以只使用索引运行查询,而且根本不必触摸表。

+0

你是什么意思创建索引!非聚集索引? – 2011-04-25 16:17:04

+0

@Israa Adb:是的。聚集索引不能包含列。 – Guffa 2011-04-25 23:42:10