문제

게임에서 도시에 대한 정보를 보유하는 테이블이 있습니다. 매 턴마다 하나의 건물을 건설 할 수 있으며 이는 "중고 건물"가치로 기록됩니다.

마다 중고 건물을 0으로 변경하는 스크립트를 실행합니다. 질문은 다음 중 두 가지 방법 중 어느 것이 더 빠르며 실제로 어떤 방식으로 사용되는지는 중요합니까?

UPDATE cities SET usedBuilding = 0;
UPDATE cities SET usedBuilding = 0 WHERE usedBuilding = 1;
도움이 되었습니까?

해결책

일반적으로 두 번째 사례 (Where Where) 조항은 더 빠릅니다. 사용하지 않은 행에서 트리거 평가, 트랜잭션 로깅, 인덱스 업데이트 등이 유발되지 않으므로 더 빠릅니다.

잠재적으로 - 0/1 값의 분포에 따라 비교보다는 모든 행을 업데이트하는 것이 더 빠를 수 있지만, 이는 매우 퇴화 된 경우입니다.

쿼리 비용의 ~ 95%가 I/O이므로 WHERE 절을 사용하여 차이가없고 (열이 색인화되지 않았으므로, 테이블 스캔을 수행하므로) 큰 차이 (열이 색인화 된 경우 큰 차이가 있습니다. 또는 테이블이 분할 된 등). 어느 쪽이든, 그것은 아프지 않습니다.

말하는 데이터의 양에 대해서는 실행 계획이나 속도의 차이를 알지 못할 것입니다. 그래서 나는 당신의 앱에 대해 논리적으로 의미가있는 모든 것을 가지고 가라고 조언합니다.

다른 팁

중고 빌딩이 색인화되면 Where 조항을 사용하는 것이 더 빠릅니다. 중고 빌딩이 사실 인 경우에만 액세스/업데이트하는 경우에만 액세스/업데이트됩니다. 색인이 표시되지 않으면 어쨌든 전체 테이블 스캔을 수행하므로 크게 차이가 없습니다.

루프에서 두 가지 방법을 몇 천 번 시도하고 시간을 보내십시오! 아마도이 테이블에 얼마나 많은 레코드가 있는지, 그리고 모두 메모리에 적합하거나 디스크에 페이징 해야하는지에 따라 다릅니다. 업데이트를 실행하기 전에 얼마나 많은 건물이 가치 1에 있는지

어떤 방식으로 사용되는지는 중요하지 않지만 가장 짧은 사람은 아마도 잘못 될 수있는 최소한의 것을 얻었을 것입니다. 작성하지 않는 코드에는 버그가 없습니다.

이러한 회전이 얼마나 자주 발생합니까? 이 테이블에서 몇 줄을 기대하십니까? 답이 '초 1 초 미만'이고 '10000보다 작다'는 경우 걱정을 멈추십시오.

물론 당신이 이것에 어떤 종류의 학문적 관심이 없다면.

"업데이트 도시 세트를 중고 건물 = 0; 보다 구체적인 쿼리보다 실행하십시오. 내가 이것에 대해 생각할 수있는 주된 이유는 당신이 당신의 칼럼에 둘 이상의 상태를 가지고 있다면 때문입니다. 단순히 부울 인 경우 괜찮을 것입니다. 그러나 항상 그렇다면 생각하는 데 시간을 보내고 싶을 수도 있습니다.

인덱싱으로 인해 WHERE 절을 사용하여 실행 계획이 더 효율적 일 수 있습니다.

결정적인 답변을 얻는 가장 좋은 방법은 다른 시나리오에서 많은 샘플 데이터를 사용하여 프로파일하는 것입니다.

중고 빌딩 = 1 값의 2%와 같은 것이 없다면 인덱싱은 전혀 도움이되지 않습니다.

그러나이 두 가지 진술은 논리적으로 다르며 완전히 다른 것을 의미 할 수 있습니다. 그러나 귀하의 경우에 대해 동일하다면 Where 절없이 사용하십시오.

정확히 얼마나 많은 행을 가질 것인가? 나는 작은 온라인 게임의 경우, 당신은 정말로 신경 쓰지 않는다고 생각합니다.

"도시"테이블에 대한 여러 업데이트를 수행하는 경우 가능하면 하나의 업데이트 문에서 모두 수행하는 것이 좋습니다.

행을 변경하는 것은 전체 행을 작성하는 것만 큼 많은 I/O가 필요할 수 있습니다 (물론 인덱스 된 열을 업데이트하려면 색인 쓰기가 필요합니다). 따라서 많은 행에 몇 가지 업데이트를 통해 잃어 버릴 수 있습니다.

그러나 당신이 <1000 줄을 가지고 있다면, 당신은 정말로 상관하지 않습니다 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top