我有一个包含超过3,000,000行的数据库,每个行都有一个带varchar(6000)的id和xml字段。
如果我SELECT id FROM bigtable
,则需要+ - 2分钟才能完成。有没有办法在30秒内得到这个?
答案 0 :(得分:3)
在id列上构建聚簇索引
答案 1 :(得分:2)
您可以将索引应用于表格。在您的情况下是聚集索引。
聚集索引:
http://msdn.microsoft.com/en-gb/library/aa933131(v=sql.80).aspx
我还建议过滤您的查询,以便每次都不会返回所有300万行,这可以通过TOP
或WHERE
来完成。
热门:强>
SELECT TOP 1000 ID
FROM bigtable
<强>其中:强>
SELECT ID FROM
bigtable
WHERE id IN (1,2,3,4,5)
答案 2 :(得分:0)
首先,3百万张唱片不能制作一张桌子'巨大'。
要优化查询,您应该执行以下操作。
- 过滤您的查询,为什么需要获取所有ID?
- 为ID列创建聚簇索引,以便在指向所选行之前先获取较小的查找表进行搜索。
醇>
答案 3 :(得分:0)
好的,为什么要将所有Id
重新调回客户端?
即使您的表没有聚集索引(我怀疑),绝大多数处理时间都是客户端,通过网络传输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秒的时间内返回,如果您在Id
上有聚簇索引,则会在不到30毫秒的时间内返回
选择所有Id
将不会提供比这些查询更多的有用信息,它所能实现的只是为您的网络和客户提供锻炼。
答案 4 :(得分:0)