【问题标题】:Fastest way to fetch a subset (200M) from a very large table (600M) in SQL Server在 SQL Server 中从一个非常大的表 (600M) 中获取子集 (200M) 的最快方法
【发布时间】: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


【解决方案1】:

既然你在做分页,你不能先从 IndexTable 中选择一系列行,然后将它加入到大表中吗?

类似:

select * from big_table where id in (select top 100 id from indextable)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 是的,所有 ID 列都已编入索引。加入一个100k索引表的大表(600M)大约需要1分钟。这是在具有非分区表的开发服务器上,所以我希望这次在具有分区表的生产服务器上减少一半。然而,即使是 30 多岁也太长了。
    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2018-12-16
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多