2012-08-06 25 views
6

He una gran cantidad de componentes utilizando el controlador de edad mssql desde PHP. Quiero cambiar al nuevo controlador SQLSRV de Microsoft, pero mis consultas son mucho más lentas.PHP - ¿Por qué el nuevo controlador SQLSRV es más lento que el antiguo controlador mssql?

He muchos procesos de manipulación +400 000 filas.

Aquí están mis pruebas con 40 000 filas:

  • testOldDriver_mssql = Filas 40000: 1 segundos
  • testNewDriver_nonPDO = Filas 40000: 7 segundos
  • testNewDriver_PDO = Filas 40000: 4 segundos

Aquí mi mayor proceso (+480 000 filas):

  • testOldDriver_mssql = Filas 484856: 27 segundos
  • testNewDriver_nonPDO = Filas 484856: 120 segundos
  • testNewDriver_PDO = Filas 484856: 47 segundos
  • testPDO_ODBC = Filas 484856: 24 segundos

¿Es el nuevo controlador definitivamente más lento? ¿O me estoy perdiendo algo?

Edición 1:

Por "conductor viejo" me refiero a la biblioteca de MSSQL en desuso (ver php.net/mssql).

El nuevo controlador es la hecha directamente por Microsoft (ver http://www.microsoft.com/en-us/download/details.aspx?id=20098)

Mi consulta es

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

y utilizando una directa query() (resultado sin preparar y mismo si uso una declaración preparada) .

Edición 2:

prueba Agregado DOP/ODBC. Sorpresa, que es más rápido: o

+0

¿Qué quiere decir exactamente por 'viejo' y 'nuevo'? ¿De qué tipo de actividad estamos hablando? ¿Utiliza declaraciones preparadas? Un montón de incógnitas ... –

+0

Gracias, he editado mi mensaje original. –

+0

¿Podría depender de su método de prueba? La prueba de la base de datos puede ser bastante difícil, con el caché de consultas en marcha y todo. Además, ¿leíste sobre las diferencias de rendimiento? Compruebe http://af-design.com/blog/2009/01/30/php-mysql-vs-mysqli-database-access-metrics/ y el 'local' http://stackoverflow.com/questions/171400/ which-is-fastest-in-php-mysql-or-mysqli – Nanne

Respuesta

2
+0

notas al usar PDO/ODBC con SQL Native Client en Windows: Al comparar los tipos de datos de fecha (marca de tiempo, etc.), esta configuración parece tener un momento difícil así que la forma más fácil que he encontrado es e a continuación, los arrojaron como fechas en su consulta ('CAST (? AS DATE) ') donde corresponda o en un procedimiento almacenado, asegúrese de que los parámetros de" fecha "de entrada sean varchar y permita que SQL Server realice la conversión implícita en las comparaciones del lado del servidor. – AndrewPK

1

Para la velocidad hasta alcanzar hasta 3 veces por favor utilice "MultipleActiveResultSets"=>'0' en sus opciones de conexión 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

Funcionó para mí. Gracias – ManiMuthuPandi

1

He tenido un problema similar con el SQLSRV conductor, la solución final en mi caso era cambiar la opción "TRACEON" a "0", esta configuración a prevenir el trazado del conductor.

Para más detalles, véase Connection Options

Ejemplo:

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

Buen trabajo, lo intentaré. –

Cuestiones relacionadas