2012-08-06 17 views
6

Ho molti componenti che usano il vecchio driver mssql da PHP. Voglio passare al nuovo driver SQLSRV di Microsoft ma le mie query sono molto più lente.PHP - Perché il nuovo driver SQLSRV è più lento del vecchio driver mssql?

Ho molti processi che gestiscono +400 000 righe.

Qui ci sono i miei test con 40 000 righe:

  • testOldDriver_mssql = Righe 40000: 1 secondi
  • testNewDriver_nonPDO = Righe 40000: 7 secondi
  • testNewDriver_PDO = Righe 40000: 4 secondi

Qui il mio più grande processo (+480 000 righe):

  • testOldDriver_mssql = Righe 484856: 27 secondi
  • testNewDriver_nonPDO = Righe 484856: 120 secondi
  • testNewDriver_PDO = Righe 484856: 47 secondi
  • testPDO_ODBC = Righe 484856: 24 secondi

E` il nuovo driver è decisamente più lento? O mi sto perdendo qualcosa?

Edit 1:

Con "vecchio driver" intendo la biblioteca MSSQL deprecato (vedi php.net/mssql).

Il nuovo driver è quella fatta direttamente da Microsoft (vedi http://www.microsoft.com/en-us/download/details.aspx?id=20098)

La mia domanda è

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

e utilizzando una diretta query() (risultato senza la preparazione e la stessa se uso una dichiarazione preparata) .

Edit 2:

prova Aggiunto DOP/ODBC. Sorpresa, è più veloce: o

+0

Che cosa si intende esattamente per 'vecchi' e 'nuovi'? Di quale tipo di attività stiamo parlando? Usi dichiarazioni preparate? Un sacco di incognite ... –

+0

Grazie, ho modificato il mio messaggio originale. –

+0

Potrebbe dipendere dal metodo di prova? Il database di test può essere piuttosto difficile, con il caching delle query in corso e tutto. Inoltre, hai letto le differenze di rendimento? Controlla http://af-design.com/blog/2009/01/30/php-mysql-vs-mysqli-database-access-metrics/ e il http://stackoverflow.com/questions/171400/ "locale" quale-è-più-veloce-in-php-mysql-o-mysqli – Nanne

risposta

2
+0

note quando si utilizza PDO/ODBC con SQL Native Client su Windows: quando si confrontano i datatypes data (timestamp, ecc.), questa configurazione sembra avere un momento difficile, quindi il modo più semplice che ho trovato è quello di e li lancia come date nella tua query ('CAST (? AS DATE) ') ove appropriato o in una stored procedure, assicurarsi che i parametri di input" date "siano varchar e consentire al server SQL di eseguire la conversione implicita nei confronti sul lato server. – AndrewPK

1

Per aumentare la velocità fino a 3 volte, utilizzare "MultipleActiveResultSets"=>'0' nelle opzioni di connessione sqlsrv_connect.

Es:

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

      )); 
+0

Ha funzionato per me. Grazie – ManiMuthuPandi

1

Ho avuto un problema simile con la SQLSRV conducente, la soluzione finale nel mio caso è stato cambiare il "Traceon" opzione "0", questa configurazione impedisce il tracciamento del conducente.

Per ulteriori dettagli, vedere Connection Options

Esempio:

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

Buon lavoro, ci proverò. –

Problemi correlati