2012-08-08 3 views
0

내 응용 프로그램에 이처럼 많은 쿼리가 있습니다.쿼리를 최적화하는 SQL 인덱스

SELECT DISTINCT STREET_NUMBER, STREET_NAME 
FROM leads 
WHERE STREET_NAME || ',' || SUBURB IN (select VAL from streetFilter) 
    AND USER_ID IN (%@) 
    AND TIMESTAMP >= '%@' 
    AND TIMESTAMP <= '%@' 
    AND GEO_LAT <> '0' 
ORDER BY STREET_NAME, CAST(`STREET_NUMBER` AS SIGNED) ASC 

내 질문은 어떤 값이나 값 집합을 색인에 추가해야하는지입니다.

지금까지 내가 방금 추가 한 모든 즉, 리드 ON INDEX 온도를 CREATE ('아래 참조')

  1. (STREET_NUMBER, STREET_NAME)
  2. (STREET, 교외)
  3. (STREET_NAME | | ','|| 교외)
  4. (USER_ID)
  5. (TIMESTAMP)
  6. (GEO_LAT)
  7. (STREET, SUBURB, USER_ID, TIMESTAMP, GEO_LAT)
  8. (STREET_NAME || ','|| 교외 266 소인 GEO_LAT)
  9. 은 (STREET_NAME)
  10. 은 (STREET_NUMBER)
  11. (CAST (STREET_NUMBER AS 서명))
  12. (STREET_NAME, STREET_NUMBER)
  13. (STREET_NAME, CAST (STREET_NUMBER 맺어))

그러나 나는 이것이 옳지 않다는 것을 알고있다. 이들 중 어느 것이 작동하지 않거나 더 빠르게 내 쿼리를 작성하지 않을 것이라고 지적 할 수 있습니까? NOT 리드 (LEAD_ID BIGINT PRIMARY KEY, USER_ID INTEGER, GEO_LAT, GEO_LONG, CUSTOMER_NAME, UNIT_NUMBER, STREET_NUMBER, STREET_NAME, 교외, 주, 우편 번호를 존재하는 경우 테이블 만들기 "@ :

데이터베이스

문을 만들어 내 sqlite가있다 INTEGER, NMI, DPI_MIRN, STATUS, STATUS_INT INTEGER, OUTCOME INTEGER, OUTCOME_FULL INTEGER, FINAL_CODE INTEGER, NOTES, NOTES_EXTRA, TIMESTAMP) "];

719130; 50; -32.933871, 151.774978, 미스터 데이비드 리 1; 34; 레 노스 PDE, 뉴캐슬, NSW, 2300 ;;; P; 0; 0; 0; 0 : 0 : 0; 20120602174036 719233, 50, -32.9307183, 151.7803428, Mr Mitch James, 1, 1-7, TYRRELL ST, THE HILL, NSW, 2300 ,; P, 0, 0 ;; 0 : 0 : 0; 20120602174036 719234 벤 포스터, 4, BINGLE ST, 뉴캐슬, NSW, 2300, 41021027208, 52404368858, C, 0, 0, 0, 0 : 0 : 0 20120602174036 719300 50; -32.933155; 151.777351; -32.9291125, 151.785025, 151.785025, Ms Marilyn Rajakulenthiran, U 12, 3, KING ST, 뉴캐슬, NSW, 2300 ,; 0 : 0 : 0, 20120602174036

질의는 이제 SELECT LEAD_ID, USER_ID, UNIT_NUMBER, STREET_NUMBER, STREET_NAME, SUBURB, STATE, POSTCODE, STATUS_INT, OUTCOME, CUSTOMER_NAME, NOTES FROM JOIN 결과 ilter ON leads.OUTCOME = outcomeFilter.VAL JOIN suburbFilter on leads.SUBPOST = suburbFilter.VAL USER_ID IN (% @) 및 '% @'및 '% @'사이의 시간차 순서 SUBURB, STREET_NAME, CAST (STREET_NUMBER AS SIGNED)

내 머리 글자가 아직 개선되지 않았습니다. 가장 느리게 수행하여 순서로 보입니다.

+1

나는 그 subselect를 조인으로 다시 작성함으로써 약간의 향상을 얻을 수있는 빛나는 페니를 기꺼이 내기를 원합니다. –

+0

죄송합니다. 이번에는 마크가 아닙니다. 내 쿼리는 이제 SELECT LEAD_ID, USER_ID, UNIT_NUMBER, STREET_NUMBER, STREET_NAME, SUBURB, STATE, POSTCODE, STATUS_INT, OUTCOME, CUSTOMER_NAME, NOTES FROM JOIN에 있습니다. outcomeFilter ON leads.OUTCOME = outcomeFilter.VAL JOIN suburbFilter ON leads.SUBPOST = suburbFilter.VAL '% @'와 '% @'사이의 사용자 _ID (% @) 및 시간대 (SUBURB, STREET_NAME, CAST ('STREET_NUMBER'AS SIGNED) 순서). 또한 인덱스를 더 추가하려고 시도했지만 시작한 때보 다 더 빠릅니다. 나는 문제의 대부분이 결국 주문에 있다고 생각한다. 어떤 아이디어? – davidelias16

답변

0

가장 좋은 방법은 쿼리 실행 계획을 검토하고 제안 된 인덱스가 반환되는지 확인하는 것입니다. 지나치게 많이 색인을 생성하거나 잘못된 위치에 색인을 생성하면 실적에 악영향을 미칠 수 있습니다.쿼리 메뉴에서

실행 계획 표시를 클릭 한 다음 쿼리 창에서 쿼리 을 실행

는 실행 계획에 액세스 할 수 있습니다. 실행 계획 및 쿼리 결과는 이제 창에 별도의 창에 표시되므로 함께 볼 수 있습니다.

+0

* this * 쿼리에 대한 실행 계획을 실행하면 인덱싱이 * this * 쿼리가 아닌 다른 쿼리에만 도움이되며 삽입 비용과 같은 다른 정보는 말할 수 없습니다. –

+0

@RobertHarvey - 수정하십시오. 질문 제목과 OP가 모든 것에 대한 색인을 작성했다고 말하면서 인덱싱에 중점을 둡니다. – RobB

+0

실행 계획을 완료했지만 그게 무슨 뜻인지 전혀 모르겠습니다. addr, opcode, p1, p2, p3, p4, p5, 주석 열 및 134 행을 얻지 만 어떤 의미도 만들 수 없습니다. – davidelias16

0

그럼 테이블의 거의 모든 필드에 범위 스캔이 있습니다.

다음은 더 잘하게하면 나는 다음의 설명을보고보고 제안 : 당신이 MySQL을 사용하는 경우

create index lookup_idx on leads(user_id, timestamp, geo_lat). 

것은, 당신이 사용되도록 인덱스의 geo_lat 부분을 사용할 수 없습니다 (user_id, timestamp). 오라클은 해당 범위에서 SKIP SCANS를 수행 할 수 있으므로 Oracle을 사용하는 경우 색인에 geo_lat를 유지하십시오.

정확하게 사용하고있는 데이터베이스를 알려주고 EXPLAIN PLAN (그러나 RDBMS에 대해 획득 한 경우) 및 리드에 대한 CREATE TABLE을 게시하여 진행 상황을 볼 수 있습니다.

편집이 SQLlite임을 확인했습니다. 이 경우 아마 (user_id, timestamp), 나중에 SQLfiddle로 확인할 수 있습니다.

다시 CREATE TABLE 및 일부 샘플 데이터를 게시하십시오.

0

일반적으로 말해서 검색, 주문, 가입 또는 WHERE 조건과 관련된 필드에만 색인이 필요합니다. 테이블에 해당 범주에 속하지 않는 필드가 여러 개 있습니다. 쿼리 성능에 부정적인 영향을주지 않고 해당 필드의 인덱스를 안전하게 제거 할 수 있습니다.

실행 계획을 실행하면 이되는 범주의 인덱스 중 하나라도 해당 범주에 속하는지 여부를 알 수 있습니다. 예를 들어, 필드의 카디널리티가 너무 작 으면 (즉 고유 값이 거의 없음) 인덱스가 도움이되지 않을 경우 가능합니다.

SQLite의 최적화 및 색인 사용에 대한 자세한 내용은 http://www.sqlite.org/optoverview.html에서 확인할 수 있습니다.

가치 있음 : SQLite는 쿼리의 각 테이블에 최대 하나의 인덱스를 사용합니다. Choosing between multiple indices을 참조하십시오. ANALYZE 명령은 가장 중요한 색인을 판별하는 데 도움을줍니다.

+0

타임 스탬프에 BETWEEN을 사용해 보았지만 속도가 느린 것처럼 보였습니다. 어떤 분야에서 사용할 수 있습니까 아니면 어느 분야에서 사용할 수 있습니까? – davidelias16

관련 문제