代码之家  ›  专栏  ›  技术社区  ›  sksamuel

海量SQL查询设计思想

sql
  •  1
  • sksamuel  · 技术社区  · 14 年前

    需要在一个数据库中查询1200万行,处理这些数据,然后将过滤后的数据插入另一个数据库。

    SELECT * 因为显而易见的原因,我的程序会返回太多的数据来处理,而且这是一个实时数据库(客户订单详细信息),我不能让数据库在运行我的查询时在10分钟内停止爬行。

    我在寻找如何写这个程序的灵感。我

    其他建议或反馈?

    4 回复  |  直到 14 年前
        1
  •  0
  •   mjallday    14 年前

    平面文件或快照都是理想的。

    像这样的

    @max_id = 0
    
    while exists (select * from table where seq_id > @max_id)
        select top n * from table where seq_id > @max_id order by seq_id
        ... process...
        set @max_id = @max seq_id from the last lot
    end
    

    insert into some_temp_table 
    select unique_id from table order by your_ordering_scheme
    

    然后像这样处理

    ... do something with top n from table join some_temp_table on unique_id ...
    delete top n from some_temp_table
    

    这样temp\ u表就保存了仍然需要处理的记录标识符。

        2
  •  4
  •   Bill Karwin    14 年前

    我建议你看看医生关于 SELECT...INTO OUTFILE LOAD DATA FROM INFILE .

    这些是将数据转储到平面文件然后将其导入另一个数据库的非常快速的方法。

    可以转储到平面文件中,然后运行脱机脚本来处理行,完成后将结果导入新数据库。

        3
  •  1
  •   Alex Martelli    14 年前

    随着时间的推移分散负荷似乎是唯一可行的解决办法。具体如何做到这一点在某种程度上取决于您的模式、“实时数据库”中的记录如何随时间变化,以及您的处理必须具有什么样的一致性语义。

    尽管如此,您仍然需要在处理过程中保持一致性—这项任务根本不可行,除非您可以依赖关系引擎和/或操作系统的一些特殊支持(例如卷或文件系统“快照”,如Linux的LVM中的快照),它可以让您廉价而快速地“冻结”DB所在卷的副本,以便以后使用另一个配置为从快照卷读取的只读数据库轻松地获取数据。

    但想必你

        4
  •  0
  •   mdma    14 年前

    在您的位置上,我将首先尝试最简单的事情,然后看看它是如何扩展的(在具有模拟用户访问权限的db的开发副本上)