문제

저는 일부 DB 루틴을 작성 중이고 준비된 명령문을 사용하고 있습니다.내 환경은 PHP5를 사용하는 PDO입니다.

준비된 명령문은 주로 성능 이점을 제공할 뿐만 아니라 입력 데이터를 수동으로 SQL 이스케이프하지 않아도 되는 것과 같은 일부 보조 보너스도 제공한다는 것을 알고 있습니다.

제 질문은 성능 부분에 관한 것입니다.

아래에는 제품 ID를 가져와 해당 가격을 반환하는 getPrice 함수의 두 가지 구현이 있습니다.

getPrice_A는 동일한 스크립트 실행 내의 후속 호출에서 동일한 PDOStatement 개체를 재사용합니다.이것이 필요합니까 아니면 권장됩니까?그렇다면 모든 단일 모델의 모든 단일 get*()에서 이 추가 코드가 중복되는 것을 방지할 수 있는 방법이 있습니까?

getPrice_B는 호출할 때마다 새 PDOStatement 개체를 만듭니다.DBMS는 이 명령문이 이미 준비되어 있음을 인식하고 일부 작업을 건너뛸 수 있습니까?즉, 이 구현은 준비된 문의 성능 이점을 적절하게 활용합니까?

이 모든 내용을 작성하고 다시 읽어본 결과 getPrice_B는 괜찮고 getPrice_A는 그 외에 무시할 만한 이점을 제공한다고 생각합니다. 이는 추가 복잡도를 감수할 가치가 있을 수도 있고 그렇지 않을 수도 있습니다.

그래도 좀 더 잘 아는 사람에게서 확실히 듣고 싶습니다.

가정 $pdo 아래 예에서는 유효하고 연결된 PDO 개체입니다.

<?php
class Product {
    static function &getPrice_A($id) {
        static $stmt;
        if (!$stmt) {
            $stmt = $pdo->prepare('SELECT price FROM products WHERE id = ?');
        }
        $stmt->execute(array($id));
        return $stmt->fetchColumn(0);
    }

    static function &getPrice_B($id) {
        $stmt = $pdo->prepare('SELECT price FROM products WHERE id = ?');
        $stmt->execute(array($id));
        return $stmt->fetchColumn(0);
    }
}

// example usage:
$price = Product::getPrice(4982);
echo "Product 4982 costs $price\n";
도움이 되었습니까?

해결책

내가 이해한 바에 따르면 준비된 문은 생성된 SQL 계획이 동일한 문인 경우 생성된 SQL 계획을 재사용하므로 데이터베이스는 동일한 준비된 문을 볼 수 있으며 데이터베이스를 쿼리하는 방법을 알아내기 위해 작업을 수행할 필요가 없습니다.준비된 진술을 저장하는 추가 작업을 Product::getPrice_A 성능 문제보다는 코드를 모호하게 만들 수 있기 때문에 일반적으로 그다지 도움이 되지 않습니다.성능을 다룰 때 항상 코드 명확성에 초점을 맞춘 다음 문제를 나타내는 실제 통계가 있을 때 성능에 초점을 맞추는 것이 가장 좋다고 생각합니다.

나는 "예, 추가 작업은 불필요합니다"라고 말하고 싶습니다(실제로 성능이 향상되는지 여부에 관계없이).그리고 저는 아주 큰 DB 전문가는 아니지만 준비된 문의 성능 향상은 다른 사람에게서 들은 내용이고 코드 수준이 아닌 데이터베이스 수준에 있습니다(그래서 코드가 실제로 매개변수화된 문을 호출하는 경우 실제 DB인 경우 DB는 이러한 실행 계획 캐싱을 수행할 수 있습니다.하지만 데이터베이스에 따라 매개변수화된 문 없이도 이점을 얻을 수 있습니다.

어쨌든, 데이터베이스 성능 문제가 정말로 걱정되고 보인다면 캐싱 솔루션을 살펴봐야 합니다...그 중 제가 강력히 추천하고 싶은 것은 멤캐시드.이러한 솔루션을 사용하면 쿼리 결과를 캐시할 수 있으며 자주 액세스하는 항목에 대해서는 데이터베이스에 접근하지 않아도 됩니다.

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