2009-03-25 3 views
3

건물에있는 사이트가 있는데, 사용자 환경 설정에 따라 메일 병합을 만드는 응용 프로그램입니다. 문제없이 데이터의 데카르트 조인을 생성 할 수 있지만 삶을 좀 더 어렵게 만드는 기업의 요구가 있습니다 ...대형 데이터 집합 (SQL에서 C#으로), 긴로드 시간 수정

원격 직원의 우편 번호를 확인한 후, 미디어 대상이 해당 직원과 얼마나 멀리 떨어져 있는지를 기준으로 미디어 대상에 대한 전자 메일을 생성합니다. 예를 들어 직원들이 일하는 유명한 자원 봉사자라고 가정 해 봅시다. 기업은이 직원들의 반경 5 마일 이내에있는 미디어에 직원이 수행하는 작업에 관한 메시지를 전자 메일로 보내려고합니다.

  1. 최대 반경 20 마일이 상황이 혼란스러워 어디에 ... 내가 시도와 실패를 개설 것이다, 여기에 몇 가지 선택이있다. 미국 내 모든 우편 번호 레코드를 보유하고있는 데이터베이스 테이블을 만들고 우편 번호의 20 마일 이내에있는 모든 우편 번호에 가입합니다. 데이터 세트는 다음과 유사합니다 (이름이 다릅니다. 이는 인수를위한 것입니다).
    [SourceZip] | [도시] | [주 | [CloseZip] | [도시] | [주 | [거리]
    실패 : 예를 들어 NY는 위의 데이터 세트에서 350k 개의 레코드를 가지고 있습니다 (다른 주에서는 더 나쁩니다!). 해당 페이지의 평균로드 시간은? 6 분 ... 일어나지 않아. 중단 점을 설정하여이를 확인했습니다. 단절이 발생하는 것은 dataadapter.fill() 단계에서입니다.

  2. (이것은 물류 문제로 인해 절대로 구현되지 않았습니다.) x 이하의 거리를 가진 미디어 대상 zip에 대한 각 직원 zip에 대한 데이터베이스 연결을 만듭니다. 소스 파일과 미디어 타겟을 결합하면 34,000 개 이상의 개별 이메일에 도달 할 수 있습니다. 34k DB 연결? 우편 번호 검색을 재사용 할 수있는 방법을 고안 할 수있을지라도 DB에서 몇 가지 테스트를 수행했으며 직원이 근무한 뉴욕에 500 개의 별개 우편 번호가 있다는 것을 알았습니다. 500 db 연결? 그게 효과가 있을지는 모르겠지만 놀랄 수 있습니다. 이 문제를 해결하기 위해

  3. 내 최신 방식은 웹 서버가 새로운 데이터 세트 보이는 얻어서 다음 .NET DataSet 개체를 더 나은 게임을 실행 희망이있는 같은 :
    [우편] | [경도] | [위도]
    그런 다음 거리 공식을 사용하여 데이터가 작동하는지 알아냅니다. 이것은 웹 서버의 프로세서에 크게 의존합니다. 이것은 가치있는 도박입니까, 아니면이 시도에서도 같은 로딩 시간의 피해를 볼 수 있습니까?

    더 좋은 방법이 있습니까?

    이 프로젝트가일지도 모른다는 것에 대한 두려움이 있음에도 불구하고 아무리 감사하겠습니다.

추가 참고 : 나는 서버의 제어가없는, 내가 :(SQL2k을 실행하는거야 내가 비주얼 스튜디오 2005 프레임 워크 2.0의 사이트를 프로그래밍하고있어하는 SQL2005으로 업그레이드 얻을 수 있습니다.. 당신은 위도/경도 좌표와 우편 번호 데이터베이스가있는 경우 향후 몇 개월 이내에 VS2008는하지만.

답변

1

직원 용 데이터 세트 및 미디어 용 데이터 세트가 있고 소스와 소스 사이의 거리에 대한 세 번째 데이터 세트가있는 경우 목표 zip을 사용하면 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 

이렇게하면 거리를 사용하여 직원과 미디어 간의 관계를 설정할 수 있습니다.

+0

아, 나는 내부 조인의 결과 집합에 내부 조인을 할 수 있는지 알지 못했습니다. 이 솔루션은 내가 필요한 것을 정확하게 생성합니다! 감사 –

2

, 당신이 내 하버 사인 기능을 즉석에서 거리를 계산 할 수있다.

이것은 수행 (나의 answer to this question 참조) 전체 미국 우편 번호 데이터로 웹 앱에서 매우 잘됩니다.

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

당신은 각받는 사람의 주소로이 적용되지 않습니다,하지만 당신이 중첩 된 쿼리에서 (먼저 반경 내에서 우편 번호를 확인하거나, 때와 : 쿼리이 비슷한 같을 것이다

CTE)을 작성한 다음 메일을 보내야하는 모든 주소에 가입하십시오.

+0

문제는 데이터가 생성되는 방식에 있습니다. 많은 직원이 여러 미디어 대상에 연결되므로 각 소스에 대해 별도의 데이터베이스 쿼리를 만들어야합니다. 이러한 모든 쿼리로 인해 대량의 데이터 세트가 생성하는로드 시간이 발생합니까? –

+0

좋은 기능, 나는 그것을 사용해야 할 것 같아요. 명백하게 우리가 사용하고 있던 것은 같은 효율성을 가지고 있지 않았습니다. – neouser99

+0

@unknown : 그냥 시도해보십시오. – cdonner

-1

SQL 2008을 사용하고 있습니까? 그렇다면 새로운 공간 데이터 기능이 여기에서 찾고있는 것일 수 있습니다. 문자열 상에 "LIKE"비교를 사용하면 쉽게 다른 좌표 범위 내에서 좌표를 찾을 수 있습니다.

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

+0

나는 작업 할 수있는 응용 프로그램의 버전 하단에 추가 정보를 적어 두었습니다. SQL2008은 가까운 장래에 안타깝게도 :) –

+0

아, 미안하지만, RTFQ를 사용하지 못했습니다. –

0

편집 조사 후 하버 사인 기능 대답은이 기능으로 집중적으로 아니에요 ... 내가 걸릴 경로 우리의 DB를 사용 (고정 될 :))

너는 이 아니야은 매번 거리를 계산해야한다. 이것은 long/lat에서 long/lat로가는 무거운 계산이고, 한번 이상한다면 그것은 불필요하다.

그런데, 나는 왜 당신이 옵션 # 2를 이미 썼는지 확신 할 수 없다. 우리는 실제로 이것과 비슷한 것을하고 있습니다. 어쩌면 나는 숫자에 대해 혼란 스러울 지 모르지만, 당신이 언급 한 것은 SQL2k가 땀을 흘리는 데 아무런 영향을 미치지 않아야합니다.

미국에서 zip에서 zip까지의 거리를 오프라인으로 계산하더라도 ~ 2bn 행만 있습니다. 예, 많지만 정적 일 뿐이며 속도가 느린 경우 부분적으로 분할 될 수 있습니다.

+0

아 - 저는 C#을 걱정하고 있습니다. 수백 개의 데이터베이스 연결을 잘 처리 할 수 ​​있을까요? 그 많은 DB 연결을 만드는 것이 나쁜 모조 일 뿐이라고 생각합니다 :/ –

0

MySQL에서 SOURCEZIP (ALTER TABLE .. ORDER BY (SOURCEZIP)) 테이블 & 인덱스를 주문하면 350K 행의 SELECT (NY의 경우 예)는 6 분이 걸리지 않습니다. 그것은 단지 1 초의 시간이 걸릴 것입니다 ... ALTER는 오랜 시간이 걸릴 것입니다 (또는 그 순서로 테이블을 생성 할 수 있습니다). 그러나 정적 테이블이기 때문에 아무 가치가 없습니다.