2013-07-11 3 views
0

X와 Y 좌표를 나타내는 2 개의 float 열이 포함 된 간단한 테이블이 있습니다. 클러스터되지 않은 색인은이 두 열에 각각 있습니다. 테스트 케이스에백만 데이터 포인트의 그룹화 느림

SELECT COUNT(X) Count, AVG(X) CenterX, AVG(Y) CenterY 
FROM DataPoints 
GROUP BY FLOOR(X/5), FLOOR(Y/5) 

각 지점이 자신을 얻을 어디 그리드에 815,000 포인트 데이터 세트를 갈라 :이 표에서 이러한 SQL을 사용하여 사용자 정의 그리드에 나는 그룹에 원하는 약 5 백만 데이터 포인트가있다 그리드 셀. SQL 서버 2012 26000 밀리 초은 결과가 너무 길었습니다. 간단한 포인트 배열에서 LINQ를 사용하여 동일한 그룹화의 C# 구현을 만들었습니다. 단지 그랬습니다. 3450ms! 또한 몇 가지 속도 향상을 위해 SQL의 저장 프로 시저를 만들었지 만 그리드 셀을 계산하는 데 26-30 초가 걸립니다.

왜 SQL Server가 해당 그룹을 계산할 수 있는지 이해할 수 없습니다. 그리드 셀 인덱스를 계산하는 데 815000 poit의 시간이 오래 걸리지 만 간단한 C# 프로그램보다 7 배 이상 길어질수록 현실적인 결과는 아닐 수 있습니다.

또한 그리드를 계산하기 위해 공간 유형을 사용하려고했지만 그 해결책은 훨씬 느립니다. 기하학 컬럼과 공간 인덱스 (GEOMETRY_AUTO_GRID)를 사용하여 sp_help_spatial_geometry_histogram에 내장 된 데이터를 포함하는 4 개의 그리드 셀을 계산하려면 2 : 40 분이 필요합니다.

누구나 그런 간단한 SQL을 빠르게하는 방법을 알고 있습니까? 앞으로이 데이터는 브라우저의 맵으로 전송되며 많은 요청이 있으므로 < 100ms가 궁극적 인 목표가됩니다.

답변

0

실행 계획은 무엇을 말합니까? 왜 이렇게 느린가요?

x 및 y (별개가 아닌)에 비 클러스터형 인덱스를 삽입하는 것이 좋습니다. 이 결과가 더 좋습니까?

+0

이것은 실행 계획입니다. http://oi43.tinypic.com/2ufu79j.jpg 무거운 작업은 물론 그룹핑과 평균 계산입니다. 또한 두 개의 열 인덱스를 추가했지만 여전히 쿼리를 완료하는 데 오래 걸립니다. 서버가 아닐 수도 있다는 가정이 있었지만 모든 데이터 행이 클라이언트에 전송 될 때까지는 오랜 시간이 걸립니다. 그리고 클라이언트 통계를 활성화 한 후, 3600ms 후에 첫 번째 응답이 이미 보내 졌음을 알게되었습니다. 기본적으로 C# 코드와 같은 시간입니다. 이 작업을 빨리 완료하기 위해 수행 할 수있는 또 다른 성능 향상이 있습니까? – Danielku15

+0

나는 그것이 가능할지를 알기 위해 데이터를 가지고 놀고 싶다. 나에게 테이블 정의를 보내 줄 수 있고, 그것을 얻은 행의 합계 수를 추가 연구를 위해 다시 만들 것이다! – bonitzenator

+0

데이터가 임의로 생성됩니다. 다음 사이트에서 다운로드 할 수 있습니다. https://docs.google.com/file/d/0BxHJCurpGhQ4YXdGVC1SamhjWjg/edit?usp=sharing 표에는 2 개의 간단한 플로트 열이 있습니다. https://gist.github.com/Danielku15/a2698a028feffd040ed8 – Danielku15

관련 문제