1

我们正面临以下问题,我们正在努力提出最佳解决方案。

我们使用的是 SQL Server 2008。我们有一个包含 6 亿多条记录的表,大约有 25 列。其中一列是一个 ID,并已编入索引。我们需要从该表中获取记录的子集。主要有2种情况:

a) 子集包含 1000 到 2 亿行之间的任何地方;要获取的行的 ID 存储在 SQL Server 的索引表中;

b) 子集包含少于 100 万行;要获取的行的 ID 存储在应用程序的服务器内存(.NET Web 应用程序)中。

我们的挑战是尽快获得这个子集。我们确实需要这在几秒钟内发生。

到目前为止我们的解决方案:

a)我们在两个表之间进行连接。这行得通,但这还不够快。查询看起来像SELECT * FROM Big_Table JOIN IndexTable ON Big_Table.ID = IndexTable.ID.

b) 我们并没有真正的解决方案。我们尝试运行 WHERE IN 查询,但如果子集接近百万行 ( SELECT * FROM Big_Table WHERE ID IN (ID1, ID2, ID3...)),这将永远耗时。一种解决方案可能是将索引存储在临时表中,但随后又回到案例 a。

我们正在尝试尽可能地优化 SQL Server,特别是使用良好的索引和分区。我今天更多地询问您认为最好的方法是在两种情况下(a 和 b)提取子集。

任何想法或建议表示赞赏。

谢谢

4

2 回答 2

3

由于您正在进行分页,您不能先从 IndexTable 中选择一系列行,然后将其连接到大表中吗?

就像是:

select * from big_table where id in (select top 100 id from indextable)
于 2011-03-10T13:37:11.750 回答
1

对于您的问题 a)(SELECT * FROM Big_Table JOIN IndexTable ON Big_Table.ID = IndexTable.ID查询),最明显的问题是:您确定ID在两个表中的列上都有索引吗?

于 2010-10-22T09:39:30.113 回答