大型数据集(SQL到C#),加载时间过长

时间:2009-03-25 02:07:47

标签: c# sql dataset latitude-longitude large-data-volumes

我有一个我正在构建的网站,它是一个基于一些用户首选项创建邮件合并(或多或少......)的应用程序。它可以毫无问题地生成价值数据的笛卡尔连接,但企业需要让生活变得更加困难......

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

  1. 最大半径为20英里。我创建了一个数据库表,其中包含美国每个邮政编码的记录,并加入了该邮政编码20英里范围内的每个邮政编码。数据集看起来像(名称不同,这是为了参数):
    [SourceZip] | [城市] | [国家] | [CloseZip] | [城市] | [国家] | [距离]
    失败:作为一个例子,NY有来自上述数据集的350k记录(其他州更糟糕!)。该页面的平均加载时间? 6分钟......没有发生。我通过设置断点来验证这一点,在dataadapter.fill()阶段期间发生断开连接。

  2. (由于物流问题,这个从未实施)我为每个员工拉链到距离为x或更小的媒体目标拉链进行数据库连接。除了源文件和媒体目标的组合可以达到34k以上的个性化电子邮件。 34k DB连接?即使我可以设计一种重用邮政编码搜索的方法,我在数据库中进行了一些测试检查,发现在纽约有500个不同的邮政编码,员工在这里工作。 500分贝连接?我怀疑这会起作用,但我会感到惊讶。

  3. 我解决问题的最新方案是希望网络服务器通过获取新数据集来运行更好的游戏,然后运行.net数据集对象,如下所示:
    [zip] | [经度] | [纬度]
    然后做一个距离公式来确定数据是否有效。这在很大程度上依赖于Web服务器上的处理器。这是一场有价值的赌博,还是我会在这次尝试中找到相同的加载时间损坏?

    有更好的方法吗?

    我感谢任何意见,即使它确认我担心这个项目可能不起作用

  4. 附加说明:我无法控制服务器,而且我正在运行SQL2k :(。我正在使用visual studio 2005编写网站,框架2.0。可能会升级到SQL2005和VS2008虽然在接下来的几个月内。

5 个答案:

答案 0 :(得分:2)

如果您有一个包含经度/纬度坐标的邮政编码数据库,您可以使用我的Haversine功能动态计算距离(请参阅我的answer to this question)。

这在包含整个美国邮政编码数据的网络应用中表现非常出色。

查询看起来像这样:

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

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

答案 1 :(得分:1)

如果您有员工的数据集,媒体的数据集,以及源和目标拉链之间距离的第三个数据集,您可以节省一些时间加入3个表...

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

这样您可以使用距离设置Employee和Media之间的关系。

答案 2 :(得分:0)

编辑经过调查,使用Haversine函数的答案就是我要采用的路线......它不像我们的数据库使用的函数那样密集(将被修复:))

你应该每次计算距离,这是从长/纬到长/纬的重计算,如果你不止一次,那就没必要了。

话虽这么说,我不确定为什么你已经注销了#2选项。我们实际上正在做类似的事情。也许我对这些数字感到困惑,但是你提到的应该是SQL2k没什么可汗的。

即使您在离线计算美国拉链到拉链的距离,也只有约20亿行。是的,它很多,但它很稳定,如果它很慢就可以分片等等。

答案 3 :(得分:0)

如果您订购表格,那么选择350K行(您的纽约示例)将不会花费6分钟MySQL中的SOURCEZIP索引(ALTER TABLE .. ORDER BY(SOURCEZIP))。它应该只需要几分之一秒...... ALTER将花费很长时间(或者你可以按照这个顺序创建表) - 但由于它是一个静态表,所以没什么值得的。

答案 4 :(得分:-1)

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

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