3

我有一个超过 3,000,000 行的数据库,每行都有一个带有 varchar(6000) 的 id 和 xml 字段。

如果我这样做SELECT id FROM bigtable,则需要 +- 2 分钟才能完成。有什么方法可以在 30 秒内完成吗?

4

5 回答 5

3

在 id 列上构建聚集索引

请参阅http://msdn.microsoft.com/en-us/library/ms186342.aspx

于 2013-03-15T10:25:58.273 回答
2

您可以将索引应用于您的表。在您的情况下是聚集索引。

聚集索引:

http://msdn.microsoft.com/en-gb/library/aa933131(v=sql.80).aspx

我还建议过滤您的查询,这样它就不会每次都返回所有 300 万行,这可以通过使用TOPor来完成WHERE

最佳:

SELECT TOP 1000 ID
FROM bigtable

在哪里:

SELECT ID FROM
bigtable
WHERE id IN (1,2,3,4,5)
于 2013-03-15T10:25:20.757 回答
0

您可以索引您的表以获得更好的性能。

您还可以使用其他选项来提高性能,例如分区功能。

于 2013-03-15T14:58:15.973 回答
0

首先,300 万条记录不会构成“巨大”表。

要优化您的查询,您应该执行以下操作。

  1. 过滤您的查询,为什么需要获取所有 ID?
  2. 为 ID 列创建聚集索引,以便在指向选定行之前先搜索一个较小的查找表。

有用的线程,这里这里

于 2013-03-15T10:29:21.323 回答
0

好吧,你为什么要重新调整所有的Ids 给客户端?

即使您的表没有聚集索引(我怀疑),绝大多数处理时间将在客户端,Id通过网络传输值并将它们显示在屏幕上。

查询所有值反而会破坏拥有查询引擎的意义。


我能想到(也许我缺乏想象力)获取所有Ids 的唯一原因是某种被误导的缓存。

如果你想知道很多你有做

SELECT count(*) FROM [bigtable]

如果你想知道是否Id存在做

SELECT count([Id[) FROM [bigtable] WHERE [Id] = 1 /* or some other Id */

这将返回 1 行,其中 1 或 0 表示指定的存在Id

这两个查询都将极大地受益于聚集索引,Id并将返回最少的数据和最多的信息。

这两个查询都将在 30 秒内返回,如果您有一个聚集索引,则在 30 毫秒内返回Id

选择所有Ids 将不会提供比这些查询更有用的信息,它所实现的只是对您的网络和客户端的锻炼。

于 2013-03-15T10:36:24.890 回答