Большой набор данных (от SQL до C #), исправление длительного времени загрузки

StackOverflow https://stackoverflow.com/questions/679976

Вопрос

У меня есть сайт, который я создаю, это приложение, которое создает почтовые слияния (более или менее ...) на основе нескольких пользовательских настроек.Он может без проблем генерировать данные с декартовыми соединениями, но потребности предприятия немного усложняют жизнь...

Я должен создать приложение таким образом, чтобы после проверки почтовых индексов удаленных сотрудников оно создавало электронные письма для целевых медиа-объектов в зависимости от того, как далеко от этого сотрудника находится целевая медиа-объект.Допустим, например, что сотрудники являются хорошо известными волонтерами там, где они работают.Предприятие хочет отправлять СМИ по электронной почте в радиусе 5 миль от этих сотрудников сообщение о работе, которую выполняет сотрудник.Вот тут-то все и становится беспорядочным...Здесь у меня есть несколько вариантов, в которых я опишу попытки и неудачи:

  1. Самый большой радиус составляет 20 миль.Я создаю таблицу базы данных, которая содержит записи о каждом почтовом индексе в США, присоединенные к каждому почтовому индексу в радиусе 20 миль от этого почтового индекса.Набор данных выглядит примерно так (имена разные, это для наглядности):
    [Исходный код] | [Город] | [Штат] | [Близкий адрес] | [Город] | [Штат] | [Расстояние]
    Терпит неудачу:В качестве примера, в Нью-Йорке имеется 350 тысяч записей из приведенного выше набора данных (а в других штатах ситуация еще хуже!).Среднее время загрузки на этой странице?6 минут...Этого не происходит.Я проверил это, установив точки останова, именно на этапе dataadapter.fill() происходит отключение.

  2. (Этот вариант так и не был реализован из-за проблемы с логистикой) Я устанавливаю соединение с базой данных для каждого почтового индекса employee zip с целевыми почтовыми файлами media на расстоянии x или меньше.За исключением того, что исходные файлы и целевые медиафайлы вместе взятые могут охватывать более 34 тысяч индивидуальных электронных писем.34 тысячи подключений к БД?даже если бы я мог придумать способ повторного поиска по почтовому индексу, я провел несколько тестовых проверок в базе данных и обнаружил, что в Нью-Йорке, где работали сотрудники, существует 500 различных почтовых индексов.соединения на 500 дБ?Я сомневаюсь, что это сработало бы, но я мог бы быть удивлен.

  3. Моя последняя схема обхода проблемы заключается в том, что я надеюсь, что веб-сервер запускает лучшую игру, чем объект .net dataset, получая новый набор данных, выглядит следующим образом:
    [почтовый индекс] | [долгота] | [широта]
    Затем выполните формулу расстояния, чтобы выяснить, работают ли данные.Это в значительной степени зависит от процессоров веб-сервера.Стоит ли рисковать, или я обнаружу такой же ущерб от времени загрузки и при этой попытке?

    Есть ли лучший способ?

    Я ценю любой вклад, даже если он подтверждает мои опасения, что этот проект просто может не сработать.

Дополнительные примечания:У меня нет контроля над сервером, и я использую SQL2k :(.Я программирую сайт в Visual Studio 2005, framework 2.0.Однако в ближайшие несколько месяцев он может быть обновлен до SQL2005 и VS2008.

Это было полезно?

Решение

Если у вас есть набор данных для ваших сотрудников, набор данных для ваших носителей и третий набор данных для расстояния между исходными и целевыми архивами, вы можете сэкономить немного времени, объединив эти 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

Таким образом, вы устанавливаете отношения между Сотрудником и СМИ, используя Расстояние.

Другие советы

Если у вас есть база данных почтовых индексов с координатами долготы / широты, вы могли бы вычислить расстояние на лету с помощью моей функции Haversine (см. Мой ответ на этот вопрос).

Это очень хорошо работает в веб-приложениях со всеми данными о почтовом индексе США.

Запрос будет выглядеть примерно так:

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

Вы не стали бы применять это к адресу каждого получателя, но сначала определили бы почтовые индексы в пределах вашего радиуса действия (во вложенном запросе или с помощью CTE), а затем объединили бы все адреса, на которые вам нужно отправить письмо.

Редактировать После расследования ответ с помощью функции Haversine - это маршрут, который я бы выбрал...это не так интенсивно, как функция, используемая нашей базой данных (которая будет исправлена :))

Ты должен не вычисляйте расстояния каждый раз, это сложное вычисление от long / lat до long / lat, и если вы делаете это более одного раза, в этом нет необходимости.

Тем не менее, я не уверен, почему вы уже списали вариант № 2.На самом деле мы делаем нечто подобное этому.Возможно, меня смущают цифры, но то, что вы упоминаете, не должно вызывать у SQL2k особых проблем.

Даже если вы подсчитаете расстояние от почтового индекса до почтового индекса в США в автономном режиме, всего ~ 2 миллиарда строк.Да, это много, но это грубо статично, может быть искажено, если это медленно, и т.д.

ВЫБОР из 350 тысяч строк (ваш пример для Нью-Йорка) не займет 6 минут, если вы закажете таблицу и индекс с помощью SOURCEZIP (ALTER TABLE ..ПОРЯДОК ПО (SOURCEZIP) ) в MySQL.Это должно занять всего долю секунды ...Изменение займет много времени (или вы могли бы создать таблицу в таком порядке) - но поскольку это статическая таблица, она ничего не будет стоить.

Используете ли вы SQL 2008?Если это так, то новые функции пространственных данных могут быть именно тем, что вы здесь ищете.Вы можете найти координаты в пределах досягаемости другого так же легко, как с помощью сравнения строк "LIKE".

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top