代码之家  ›  专栏  ›  技术社区  ›  C Bauer

大数据集(SQL到C),长加载时间修复

  •  3
  • C Bauer  · 技术社区  · 16 年前

    我有一个网站,我正在建设,它是一个应用程序,创建邮件合并(或多或少…)的基础上几个用户的喜好。它可以毫无问题地生成大量的笛卡尔连接数据,但随之而来的是企业的需要,让生活变得更加困难。。。

    我必须构建应用程序,以便在验证远程员工的邮政编码后,它根据媒体目标与该员工的距离创建发送给媒体目标的电子邮件。比如说,员工是他们工作的著名志愿者。企业希望通过电子邮件向这些员工周围5英里范围内的媒体发送有关员工所做工作的信息。这就是事情变得一团糟的地方。。。我在这里有几个选择,我将概述这些尝试和失败:

    1. 最大半径为20英里。我创建了一个数据库表,其中保存了美国每个邮政编码的记录,并与该邮政编码20英里内的每个邮政编码连接。数据集看起来像(名称不同,这是为了参数):
      [SourceZip]|[City]|[State]|[CloseZip]|[City]|[State]|[Distance]

    2. (由于物流问题,这一个从未实现过)我为每个员工建立了一个数据库连接,每个员工的zip到媒体目标zip的距离不超过x。除了源文件和媒体目标的组合可以达到34k以上的个性化电子邮件。34k数据库连接?即使我能想出一种重复使用邮政编码搜索的方法,我也在DB中做了一些测试检查,发现在员工工作的纽约有500个不同的邮政编码。500分贝连接?我怀疑这会奏效,但我可能会感到惊讶。

    3. 我最新的解决方案是希望web服务器通过获取新数据集运行比.net数据集对象更好的游戏,如下所示:
      [zip]|[经度]|[纬度]
      然后做一个距离公式来计算数据是否有效。这在很大程度上依赖于web服务器上的处理器。这是一场值得的赌博,还是我会在这次尝试中发现同样的加载时间伤害?

      有更好的办法吗?

      我感谢任何意见,即使它证实了我对这个项目的担忧 只是可能行不通 .

    附加说明 :我无法控制服务器,我正在运行SQL2k:(。我正在visual studio 2005 framework 2.0中对该网站进行编程。不过,可能在未来几个月内升级到SQL2005和VS2008。

    5 回复  |  直到 16 年前
        1
  •  2
  •   Community CDub    8 年前

    如果您有一个带有经度/纬度坐标的邮政编码数据库,您可以使用my Haversine函数(参见my answer to this question ).

    查询类似于以下内容:

    select * from zip where 
       dbo.udf_Haversine(zip.lat,zip.long, @lat, @lon) < 20   -- (miles)
    

    您不会将此应用于每个收件人的地址,但您将首先确定半径范围内的邮政编码(在嵌套查询中,或使用CTE),然后加入需要向其发送邮件的所有地址。

        2
  •  1
  •   Seth Seth    16 年前

    如果您有一个用于员工的数据集,一个用于媒体的数据集,以及第三个用于源拉链和目标拉链之间距离的数据集,那么将这三个表连接在一起可能会节省一些时间。。。

    SELECT *
    FROM Employees_List
       INNER JOIN 
           (Media_List INNER JOIN Distance_List ON Media_List.Zip = Distance_List.Target_Zip)
       ON Employees_List.Zip = Distance_List.Source_Zip
    WHERE distance_Miles <=5
    

    这样,您可以使用距离设置员工和媒体之间的关系。

        3
  •  0
  •   neouser99    16 年前

    编辑 经过调查,哈弗森函数的答案是我将采取的路线。。。它没有db使用的函数那么密集(将被修复:)

    你应该 每次都要计算距离,从long/lat到long/lat,这是一个繁重的计算,如果你不止一次这样做,那就没有必要了。

    话虽如此,我不确定你为什么已经注销了选项2。我们实际上正在做类似的事情。也许我被这些数字弄糊涂了,但您所提到的对SQL2k来说应该没什么可担心的。

    即使你离线计算一下美国从一个邮政站到另一个邮政站的距离,也只有约20亿行。是的,很多,但是它是非常静态的,如果速度慢,可能会被切碎,等等。

        4
  •  0
  •   Dave Pullin    16 年前

        5
  •  -1
  •   James Orr    16 年前

    您正在使用SQL 2008吗?如果是这样,新的空间数据功能可能正是您在这里寻找的。您可以很容易地在另一个范围内找到坐标,就像在字符串上使用“LIKE”比较一样。

    http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx

    推荐文章