2009-06-16 4 views
1

벤치 마크를 계획하고 있었지만 많은 작업이 있기 때문에 이전에 확실한 답을 놓치지 않았는지 확인하고 싶습니다.Sqlite 하위 쿼리 : 하나의 큰 쿼리 또는 for 루프?

서브 쿼리가있는 각 행에 대해 더 자세한 정보를 얻는 거대한 쿼리가 있습니다.

각 행은 ListView에 연결되어있는 ListAdapter에서 사용되므로 다른 루프는 각 행을 하나씩 가져 와서 ListItem으로 만듭니다. 당신은 어떻게 생각하십니까

이 더 효율적입니다 :

  • 는 최적화를 확인하기 위해 SQL 엔진 계산은 SQL 혼란에 하위 쿼리를 유지.
  • ListAdapter 루프에서 하위 쿼리를 가져 와서 디스플레이에 세부 정보를로드하지 않도록합니다. 훨씬 더 읽기 쉽지만 너무 많이 적중하면 프로세스가 느려질 수 있습니다.

두 가지 중요한 일 : 나는 큰 SQL 청크를 다시 작성할 수 없습니다

  • 는 하위 쿼리를 제거합니다. 나는 그것이 더 좋을 것이라는 것을 안다. 그러나 나는 그렇게하지 않았다.
  • 내가 알 수있는 한 목록에는 1000 개가 넘는 항목이 포함되지 않으며 데스크톱 응용 프로그램이므로 동시성이 없습니다. 이 경우에도 perf와 관련이 있습니까? 그렇지 않다면, 나는 여전히 어쨌든 hight 트래픽 웹 사이트에 대한 answser에 관심이있을 것입니다. ...

답변

2

SQlite는 놀랍게도 좋은 작은 엔진이지만, 정말 영리한 최적화에 관한 것이 아니며, "트래픽이 많은 웹 사이트"로 간주하지 않습니다. 하나의 커다란 플러스 (제한 내에서 사용하기 위해)는 프로세스 내에서 실행할 수 있으므로 하나의 큰 쿼리와 비교할 때 여러 쿼리의 오버 헤드가 실제로 적다. 코드 작성이 가장 쉬운 방법이라면 특정 유스 케이스에 대해 실제로 고려해야합니다 (힌트로 "게으른로드"방식으로 처리하면 실제로 데이터의 첫 번째 화면이 더 빠르게 표시 될 수 있습니다!). 예상대로, 이것이 사용상의 병목 현상이 될 가능성은 낮기 때문에 더 간단하고 신뢰성있는 코딩이 중요한 장점입니다.

트래픽이 많은 사이트를 운영하고 PosgtreSQL, Oracle, SQL Server 또는 DB2와 같은 더 풍부하고 "무거운"엔진을 사용한다면 훨씬 더 많은 최적화 프로그램을 신뢰하게 될 것입니다. 그러나 내가 알게 된 사실 중 하나는 하위 쿼리를 조인으로 변경할 수있는 경우 (종종 아님, 항상 그런 것은 아님) 성능을 향상시키는 경향이 있다는 것입니다 (조인을 사용하면 옵티마이 저가 올바른 인덱스를 더 쉽게 사용할 수 있습니다. - 나는 SQL Optimizer를 직접 코딩 한 적이 없지만 다른 형태의 쿼리를위한 많은 엔진의 쿼리 실행 계획을 쳐다 보았습니다. 물론 좋은 인덱스가 있다고 가정합니다. -) -이 은 당연히 문제의 특정 사례의 벤치 마크로 확인되어야합니다. 그러나 그것은 초기 작업 가정 일 것입니다.

1

커서 사용은 어떻습니까?

큰 쿼리를 사용하고 SQL 엔진이 내 쿼리를 최적화하도록하는 것이 더 좋습니다. 또한 "큰"쿼리를 사용하거나 커서를 사용하는 대신 SQL 외부에서 루프를 수행하는 것이 더 좋은 예를 생각할 수 없습니다.

그러나 더 나은 점을 알아내는 가장 좋은 방법은 벤치마킹하는 것입니다.

행운을 빈다.

+0

이미 커서를 사용하고 있지만 문제의 일부를 해결할 수 있는지 몰랐습니다. :-) –