我有一个超过 3,000,000 行的数据库,每行都有一个带有 varchar(6000) 的 id 和 xml 字段。
如果我这样做SELECT id FROM bigtable
,则需要 +- 2 分钟才能完成。有什么方法可以在 30 秒内完成吗?
我有一个超过 3,000,000 行的数据库,每行都有一个带有 varchar(6000) 的 id 和 xml 字段。
如果我这样做SELECT id FROM bigtable
,则需要 +- 2 分钟才能完成。有什么方法可以在 30 秒内完成吗?
在 id 列上构建聚集索引
您可以将索引应用于您的表。在您的情况下是聚集索引。
聚集索引:
http://msdn.microsoft.com/en-gb/library/aa933131(v=sql.80).aspx
我还建议过滤您的查询,这样它就不会每次都返回所有 300 万行,这可以通过使用TOP
or来完成WHERE
。
最佳:
SELECT TOP 1000 ID
FROM bigtable
在哪里:
SELECT ID FROM
bigtable
WHERE id IN (1,2,3,4,5)
好吧,你为什么要重新调整所有的Id
s 给客户端?
即使您的表没有聚集索引(我怀疑),绝大多数处理时间将在客户端,Id
通过网络传输值并将它们显示在屏幕上。
查询所有值反而会破坏拥有查询引擎的意义。
我能想到(也许我缺乏想象力)获取所有Id
s 的唯一原因是某种被误导的缓存。
如果你想知道很多你有做
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
选择所有Id
s 将不会提供比这些查询更有用的信息,它所实现的只是对您的网络和客户端的锻炼。