C# 从大型数据库中选择id

C# 从大型数据库中选择id,c#,sql,sql-server,C#,Sql,Sql Server,我有一个超过3000000行的数据库,每个行都有一个id和带有varchar6000的xml字段 如果我从bigtable中选择id,则需要+-2分钟才能完成。有没有办法在30秒内完成此操作?您可以将索引应用到表中。在您的例子中,是一个聚集索引 聚集索引: 我还建议过滤您的查询,使其不会每次返回所有300万行,这可以通过使用TOP或WHERE来完成 顶部: 其中: 在id列上构建聚集索引 请看首先,300万条记录并不能使一张表“庞大” 要优化查询,您应该执行以下操作 过滤查询,为什么需要获取所有

我有一个超过3000000行的数据库,每个行都有一个id和带有varchar6000的xml字段


如果我从bigtable中选择id,则需要+-2分钟才能完成。有没有办法在30秒内完成此操作?

您可以将索引应用到表中。在您的例子中,是一个聚集索引

聚集索引:

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

顶部:

其中:


在id列上构建聚集索引


请看

首先,300万条记录并不能使一张表“庞大”

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

过滤查询,为什么需要获取所有ID? 为ID列创建聚集索引,以便在指向所选行之前先搜索较小的查找表。
有用的线程,以及

好的,为什么要将所有ID重新调整到客户端

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

查询所有值会破坏查询引擎的功能

我能想到的唯一原因可能是我缺乏获得所有ID的想象力,这是某种误导性的缓存

如果你想知道很多你已经做过的事情

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不会提供比这些查询更有用的信息,它只会为您的网络和客户提供一个锻炼。

您可以选择您的表格以获得更好的性能


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

3.000.000行不多,当然也不多。创建适当的索引。您的表是否已编制索引?id是表上的聚集索引吗?您将从何处检索数字?在屏幕上打印文本并通过netwrok传输确实需要时间吗?引擎将能够迭代Id列,其速度远远快于传输到客户端并在客户端上显示的数字。即使它不是一个杂乱的索引,它显然是,或者应该是。@KennethVeenstra如果它解决了你的问题,你能写下来吗?@Saju Man,今天我想就linq这个话题提出两个答案,但不是很快:谢谢,我认为你没有抓住重点,这不是由于缺少索引而导致的性能问题。@Jodrell为什么你认为这不是一个问题?对于SQL引擎来说,一个没有索引且包含3000000条记录的列是一件非常有用的工作,即使对于数字引擎也是如此field@voo,如果要全部重新运行,则表扫描与索引扫描几乎没有什么不同。@Jodrell如果全部返回,这是什么意思。从他通过id选择的bigtable中选择id,所以索引将被用作引擎。试着模拟这样的表格,填上一些东西,然后建立维护计划。我相信你会在第一步看到索引扫描。如果没有orderby,顶部是毫无意义的,但是,分页数据是很有意义的。
SELECT count(*) FROM [bigtable]
SELECT count([Id[) FROM [bigtable] WHERE [Id] = 1 /* or some other Id */