【发布时间】:2010-10-22 09:05:00
【问题描述】:
我们正面临以下问题,我们正在努力提出最佳解决方案。
我们使用的是 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)中提取子集。
感谢任何想法或建议。
谢谢
【问题讨论】:
-
很抱歉提出这个问题,但是您需要将数据拉回来吗?你可以只在数据库中工作吗?
-
出于好奇,您为什么要一次性获取 2 亿行?
-
您需要返回所有列吗?我建议只明确命名您想要返回的列。
-
运行sql server的机器内存够吗?它对性能有巨大的影响。
-
看来你需要改变任务:你真的需要拉回200M记录吗?你想用 200M 记录做什么?即使 BigTable 中的所有列都是 int 数据类型,200M 记录也是 20 GB,必须在 RAM 中处理以避免 HDD 性能损失
标签: .net sql sql-server-2008 large-data-volumes