2012-08-06 13 views
6

Mam wiele komponentów przy użyciu starego sterownika mssql z PHP. Chcę przełączyć na nowy sterownik SQLSRV firmy Microsoft, ale moje zapytania są dużo wolniejsze.PHP - Dlaczego nowy sterownik SQLSRV działa wolniej niż stary sterownik mssql?

Mam wiele procesów obsługujących +400 000 wierszy.

Oto moi testy z 40 000 rzędów:

  • testOldDriver_mssql = Rzędy 40000: 1 sekundy
  • testNewDriver_nonPDO = rzędy 40000: 7 sekund
  • testNewDriver_PDO = rzędy 40000: 4 sekundy

Tutaj mój największy proces (+480 000 wierszy):

  • testOldDriver_mssql = Rz 484856: 27 sekund
  • testNewDriver_nonPDO = rzędy 484856: 120 sekund
  • testNewDriver_PDO = rzędy 484856: 47 sekund
  • testPDO_ODBC = rzędy 484856: 24 sekund

Czy nowy sterownik zdecydowanie wolniej? Czy może czegoś brakuje?

Edit 1:

Przez "starego sterownika" mam na myśli przestarzałej biblioteki MSSQL (patrz php.net/mssql).

Nowy sterownik jest jeden bezpośrednio przez Microsoft (patrz http://www.microsoft.com/en-us/download/details.aspx?id=20098)

Moje zapytanie jest

SELECT * FROM myTable 
WHERE pdvSaisie IN 
     (SELECT number FROM pdvs WHERE nom LIKE 'ZUEE %') 

i za pomocą bezpośredniego query() (bez przygotowania i sam wynik, jeśli mogę użyć przygotowane oświadczenie) .

Edit 2:

Test Dodany PDO/ODBC. Niespodzianka, to szybciej: o

+0

Co dokładnie masz na myśli przez 'stare' i 'nowe'? O jakim rodzaju działalności mówimy? Czy korzystasz z przygotowanych wyciągów? Wiele niewiadomych ... –

+0

Dzięki, zredagowałem moją oryginalną wiadomość. –

+0

Czy to może zależeć od metody testowania? Testowanie bazy danych może być dość trudne, z buforowaniem zapytań i wszystkimi. Czy też przeczytałeś o różnicach w wydajności? Sprawdź http://af-design.com/blog/2009/01/30/php-mysql-vs-mysqli-database-access-metrics/ oraz "local" http://stackoverflow.com/questions/171400/ który jest najszybszy w php-mysql-or-mysqli – Nanne

Odpowiedz

2
+0

notatek podczas korzystania z PDO/ODBC z SQL Native Client w systemie Windows: Podczas porównywania datatypów dat (znacznik czasu, itp), to ustawienie wydaje się mieć ciężki czas, więc najprostszy sposób, jaki znalazłem, to e ither rzucił je jako daty w zapytaniu ('CAST (? AS DATE) ') w razie potrzeby lub w procedurze przechowywanej upewnij się, że parametry wejściowe" date "są varchar i pozwalają serwerowi SQL wykonać niejawną konwersję w porównaniu po stronie serwera. – AndrewPK

1

Aby przyspieszyć pobieranie do 3 razy, użyj opcji "MultipleActiveResultSets"=>'0' w opcjach połączenia sqlsrv_connect.

Ex:

$db = sqlsrv_connect('127.0.0.1', array('Database'=>'dbname','UID'=> 'sa','PWD'=> 'pass',"CharacterSet" =>"UTF-8","ConnectionPooling" => "1" 
        ,"MultipleActiveResultSets"=>'0' 

      )); 
+0

To zadziałało dla mnie. Dzięki – ManiMuthuPandi

1

Miałem podobny problem z sqlsrv kierowcy, ostateczne rozwiązanie w moim przypadku było zmienić opcję „TRACEON” na „0”, to konfiguracja uniemożliwić śledzenie kierowcy.

Aby uzyskać więcej informacji, zobacz Connection Options

Przykład:

$connectionInfo = array("Database"=>"dbName", "TraceOn" => "0"); 
$conn = sqlsrv_connect($serverName, $connectionInfo); 
+0

Dobra robota, spróbuję. –