2013-07-18 2 views
1

약 12000 개의 행을 포함하는 테이블 challenge이 있습니다. 모든 점은 그 주변의 네 점에 연결됩니다. 예를 들어 100은 99 101 11 및 189에 연결됩니다. 작은 표로이 작업을 시도했지만 제대로 작동했지만 테이블 크기를 늘리면 쿼리가 기하 급수적으로 느려졌습니다. 끝내지도 않을거야. 내 쿼리는 여기Oracle에서 CONNECT BY를 사용하여 쿼리가 매우 느림 10

SELECT level, origin, destination 
FROM challenge 
WHERE destination = 2500 
START WITH origin = 1 
CONNECT BY NOCYCLE PRIOR destination = origin; 

이 쿼리를 최적화하는 방법에 대한 조언은 크게 감사하겠습니다.

+0

'대상'에 누락 된 색인을 추가 하시겠습니까? – dasblinkenlight

+0

** 테이블 및 인덱스 정의를 표시해야합니다. ** 느린 쿼리를 진단하려면 설명이나 의역이 아닌 전체 테이블 및 인덱스 정의가 필요합니다. 테이블이 잘못 정의 된 것일 수 있습니다. 색인이 올바르게 작성되지 않았을 수 있습니다. 어쩌면 그 칼럼에 당신이 생각한 색인이 없을 수도 있습니다. 테이블과 인덱스 정의를 보지 않고는 말할 수 없습니다. 'EXPLAIN'을하는 방법이나 실행 계획을 얻는 방법을 알고 있다면 그 결과를 질문에 넣으십시오. –

답변

0

그래서 수천 개의 노드로 구성된 차수 그래프 (직사각형 격자)에서 노드 1에서 노드 2500까지의 모든 경로를 찾습니다. 나는 그들 중 상당수가있을 것으로 기대한다. 도전은 단지 당신이 그들을 계산하도록 요청 했습니까? 요점은 수학을하는 것이 얼마나 많은지 알아 내야한다는 겁니다.

예를 들어 노드 1과 노드 2500이 대각선 인 50x50 직사각형 그리드 인 경우 최소 경로 길이는 100 단계입니다. 100 단계의 경로에는 50 개의 수평선과 50 개의 수직선이 있으며 어떤 순서로든 올 수 있습니다. 50 H의 문자열과 50 V의 문자열을 정렬 할 수있는 방법을 몇 가지 파악하면 강력한 오라클이라도 약간의 문제가있는 숫자라는 것을 알 수 있습니다. (계산식을 수행하면 계산식을 작성하기 만하면 오라클이 수식을 말하면 매우 빠르게 수행 할 수있는 대규모 정수 연산이 필요합니다.)

그리고 실제로 쿼리가 그보다 더 나쁩니다. 최소 길이 경로 만 묻는 것은 아닙니다. 따라서 길을 따라 어딘가에있는 목적지로부터 한 걸음 떨어진 거리 102의 모든 경로를 반환합니다. 그리고 길이가 104 인 경로는 2 걸음 뒤로 걸릴 수 있습니다. 거의 모든 노드를 방문하는 길이 2498의 경로! 그 경로를 세는 것은 짧은 경로를 세는 것보다 복잡합니다. 왜냐하면 자신을 가로 지르는 경로를 제외해야하기 때문입니다.

+0

예 Wumpus가 맞습니다. 그것은 매우 큰 그리드 패턴 또는 수천 개의 노드로, 각 노드는 노드 주위에 직접 연결할 수 있습니다. 수학을 사용하는 것의 문제점은 특정 측면에서만 연결되는 많은 특정 노드가 있다는 것입니다. 따라서이 쿼리를 사용하려고합니다. 출발지, 목적지 및 최단 경로 수준을 반환하고 싶습니다. 테이블에 대한 나의 정의는 다음과 같다. create table challenge (origin int, destination int); challenge (origin)에서 색인 challenge_origin을 작성하십시오. 공개 동의어 도전 과제 생성; –

+0

미로 해결사입니다! SQL에서! 확실히 "당신의 창의력을 보여주기 위해 잘못된 도구를 사용하십시오"라는 질문에 도전하십시오. 어쨌든 귀하의 쿼리에 문제가 ** 모든 ** 경로를 찾습니다. 'and rownum = 1'을 추가하면 첫 번째 것을 찾았을 때 멈출 수 있지만, 가장 짧지는 않습니다. 이를 위해서는 너비 우선 탐색이 필요하고 CONNECT BY는 깊이 우선입니다. oracle 설명서에서 "너비 우선"을 검색하면 다음과 같은 결과를 얻을 수 있습니다. http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm –