2010-01-06 4 views
1

인사말!php sqlsrv_fetch_object 성능

사이트에서 자르고있는 몇 가지 성능 문제를 해결하려고합니다. 이 노력의 일환으로 GA에 따라 가장 트래픽이 많은 페이지를 프로파일 링하기 시작했습니다.

본질적으로 내가 처음에는 의심했던 것처럼 대부분의 시간은 데이터베이스 관련 트래픽에 있다고 판단했습니다. 불행히도, 가까이에서 볼 때, 내가 발견 한 것은별로 의미가 없습니다.

예를 들어이 호출 인 MyAlganon_Model_Library_Item :: fetchItemTooltipsByItemIdArray()는 준비 플랫폼에서 돌아 오기 위해 580.41ms를 사용합니다. 이에,

$row = sqlsrv_fetch_object($this->query); 

while ($row) { 
    $results[] = $row; 
    $row = sqlsrv_fetch_object($this->query); 
} 

return $results; 

것 같은데 : 그것의 533.12ms가 fetchAll() 함수에 소요되는 동안 해당 시간의 47.27ms로 다이빙시

단순히 sqlsrv_fetch_object를가하고 루프가() sqlsrv_query에 소요되는 특정 페이지에는 결과 세트에 742 개의 행이 있습니다. 어쩌면 StdClass 객체를 생성하는데 얼마나 오랜 시간이 걸리는지 현실적으로 다루지 않는 것이 문제일까요? 533.12ms는 742 개의 결과를 반복하고 오브젝트 배열로 변환하는 정상적인 시간처럼 보입니까?

+0

쿼리가 무엇입니까 : 당신이 제공 한 조각을 업데이트 할 수 있습니다? 문제는 아마도 쿼리가 아닌 함수를 사용했을 것입니다. –

+0

필요하다면 sproc에서 쿼리를 추출 할 수는 있지만, 47에서 sqlsrv_query가 반환하는 쿼리를 고려해 볼 수는 없습니다.sproc을 실행하는 부분 인 27ms. 나머지 533.12ms는 sqlsrv_fetch_object를 호출하여 결과 집합을 반복합니다. – jdsmith2816

+0

쿼리에서 많은 수의 열을 반환하면 StdClass 개체로 래핑하는 데 시간이 걸립니다. 이 경우 쿼리/테이블을 최적화하면 문제가 해결됩니다. –

답변

1

귀하의 의견에 말씀 하셨듯이, 742 개의 행과 41 개의 열을 쿼리합니다.

사용중인 데이터가 상당합니다. 41 개의 모든 열을 사용하지만 행 중 일부만 사용하는 경우 쿼리를 분리 할 수 ​​있습니다. 더 적은 데이터를 얻기 위해 최적화 할 수 있다면 더 많은 쿼리가 항상 비효율적 인 것은 아닙니다.

모든 742 행의 41 개 열이 사용됩니까? 어쩌면 간단한 쿼리를 통해 모든 데이터가 필요한 742 개의 행을 선택할 수 있습니다. 내 테스트에서 sqlsrv_보다 약 33~60% 빠른 무엇 당신이 mssql_을하고에 따라

+0

모든 742 개의 행과 41 개의 모든 열을 사용하므로 결과 집합은 가능한 한 축소되었습니다. 결과 집합이 그만큼 많을 때 많은 개체를 만들려면 기본적으로 600ms가 필요합니다. 나는 그걸로 일할 수있다. 대신 sqlsrv_fetch_array를 사용할 때 페이지가 어떻게 수행되는지 볼 수 있습니다. 하나의 쿼리 인 경우 600ms를 신경 쓰지 않을 것입니다. 이 페이지에는 네 가지 다른 쿼리가 있습니다. 그들 중 누구도 fetchAll()과 거의 비슷한 시간이 걸리지 만 여전히 더해집니다. – jdsmith2816

+0

지미의 대화에 감사드립니다. 도움을 크게 주셨습니다. :) – jdsmith2816

+0

괜찮습니다. 최적화는 상당한 어려움이 될 수 있습니다. :) –

3

내가 너무 SQLSRV을 사용하려고했는데 그것은 때때로 몇 초 복용, 정말 속도가 느려질 수 있습니다 발견

0

12 개의 행과 소수의 열이있는 테이블에서도 간단한 쿼리를 연결하고 수행 할 수 있습니다. 내 개발 시스템 (로컬 SQL Express에 연결)이 대상 호스트 (실제 SQL Server, 값 비싼 프리미엄 호스팅)보다 빠릅니다.

웹 호스트도 테스트를 거쳤으며 "문제는 웹용 또는 데이터베이스 서버 또는 네트워크 상태가 아닌 PHP 용 Microsoft SQL Server 드라이버에 있다고 제안하는 것 같습니다." 그는 ADODB를 사용하여 그것을 비교했다 : "이것은 ODBC 연결이며 솔직히 불안정하고 피해야하는 네이티브 PHP MSSQL 드라이버를 사용하지 않는다는 점에 유의하십시오. [...] 위의 테스트 스크립트는 일상적으로 크게 수행하고 있습니다 PHP 용 Microsoft SQL Server 드라이버를 사용하여 연결하는 다른 테스트 스크립트보다 뛰어납니다. "

그러나 내 시스템에서 sqlsrv_connect는 $ conn = ADONewConnection ('odbc_mssql'); $ conn-> Connect();보다 연결 속도가 훨씬 빠릅니다 (일반적으로 0.1ms와 100ms 사이). (보통 30-200ms 사이). 다른 속도 테스트 :이 프로젝트는 다른 어떤 것보다 대기 시간에 민감했습니다.

조금 참고 : (약간 청소기)

while (($row = sqlsrv_fetch_object($this->query))) { 
    $results[] = $row; 
} 
return $results;