SQLSRV司机笨慢?(sqlsrv drivers slow in codeigniter?)

2019-08-20 10:26发布

我已经安装了最新版本2.1.3 CI的

现在运行查询后,我得到一个非常缓慢的响应时间,很简单的东西,如:

function Bash(){


    $sql = “SELECT * FROM Contacts”;
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false) {
  die( print_r( sqlsrv_errors(), true) );
}

查询远程数据库之后。 (SQL Server 2008中)

当我运行在针对同一远程数据库一个简单的PHP脚本这个相同的查询。 我得到的结果瞬间。

一)任何人都经历了这个问题,在笨的SQLSRV驱动程序?

如果是这样,你是怎么解决的呢?

这里是我的连接字符串:

$db['default']['hostname'] = "xxxxx,1433";
$db['default']['username'] = "xx";
$db['default']['password'] = "xxxxxx-xx";
$db['default']['database'] = "xxxxxxxxx";
$db['default']['dbdriver'] = "sqlsrv";
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = TRUE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

更新:

我发现从运行探查以下。

数据库:数据库查询:1(隐藏)从联系人0.0659 *选择

装载时间:基类0.0428的执行时间控制器(欢迎/ AzureBash)58.2173总执行时间58.2602

它好像查询是在0.06秒执行,但该控制器花点时间来加载。

不知道为什么会这样。

该活动记录接口为最新的SQLSRV驱动程序是马车。

因此,下载并覆盖这些现有的接口(覆盖您的SQLSRV文件夹在CI数据库文件夹):

http://www.kaweb.co.uk/blog/mssql-server-2005-and-codeigniter/

注意:这些已经与SQL Azure和工程测试。

$查询 - > NUM_ROWS(); 没有这些驱动程序工作,所以我建议你用计数代替。 或者创建自己的包装。

除了日期是现在在结果集中的日期对象类型。

我希望这有帮助。

解决方案2

如果因任何原因,你会发现使这完全无法使用的错误。 还原到最初提供的SQLSRV接口。 你会发现什么是造成问题的原因是原来的接口都执行查询的方式,因此,创建一个数据库辅助类; 使用$ SQL = $这个 - > DB-> last_query(); 让你正要执行,然后database_helper类中执行它自己的查询:

function MakeDbCall ($sql)
{
$serverName = "xxxxx-xxxx-xxx,1433"; //serverName\instanceName
$connectionInfo = array( "Database"=>"xxx", "UID"=>"xx", "PWD"=>"xxxxx","ConnectionPooling" => "1");



 $conn = sqlsrv_connect($serverName,$connectionInfo);
 $stmt = sqlsrv_query($conn, $sql);

 while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
      $result_array[] = $row;
}

return $result_array;

}

创建一个用于row_array。

您应该能够直接在您的应用程序调用此函数,从任何地方。 虽然采取的方式优势active_records构造查询。

不是一个理想的解决方案,但直到笨排序他们SQLSRV类,没有很多我们可以做的。

Answer 1:

答案后添加一个答案,这已经被接受了,因为我发现了一个不同的解决方案。 我有同样的问题......在结果集循环是非常非常缓慢。 我打开系统/数据库/驱动器/ SQLSRV / sqlsrv_driver.php,发现连接功能。 我注意到,就是在使用SQLSRV_CURSOR_STATIC选项。 我把它改为SQLSRV_CURSOR_CLIENT_BUFFERED和我缓慢的问题就走了。 为此在这里看到的文档:

http://msdn.microsoft.com/en-us/library/hh487160(v=sql.105).aspx

老实说,我不知道PHP的SQL Server驱动程序然而,考虑到加快,做,等我可以猜测,司机可能会使用光标默认。 这似乎是一个可怕的想法。 我也是假设通过选择client_buffered用于查询的数据将没有光标来读取和存储访问的客户端上,好像它是一个游标。 如果是这种情况下,如果你尝试执行,有许多许多行读取查询不好的事情可能发生。 也许是另一种选择(?SQLSRV_CURSOR_FORWARD)可用于无光标读取数据 - 但我敢肯定,用来访问查询的方法将较为有限(例如,不使用result_array())

-Don



Answer 2:

该活动记录接口为最新的SQLSRV驱动程序是马车。

因此,下载并覆盖这些现有的接口(覆盖您的SQLSRV文件夹在CI数据库文件夹):

http://www.kaweb.co.uk/blog/mssql-server-2005-and-codeigniter/

注意:这些已经与SQL Azure和工程测试。

$查询 - > NUM_ROWS(); 没有这些驱动程序工作,所以我建议你用计数代替。 或者创建自己的包装。

除了日期是现在在结果集中的日期对象类型。

解决方案2

如果因任何原因,你会发现使这完全无法使用的错误。 还原到最初提供的SQLSRV接口。 你会发现什么是造成问题的原因是原来的接口都执行查询的方式,因此,创建一个数据库辅助类; 使用$ SQL = $这个 - > DB-> last_query(); 让你正要执行,然后database_helper类中执行它自己的查询:

function MakeDbCall ($sql)
{
$serverName = "xxxxx-xxxx-xxx,1433"; //serverName\instanceName
$connectionInfo = array( "Database"=>"xxx", "UID"=>"xx", "PWD"=>"xxxxx","ConnectionPooling" => "1");



 $conn = sqlsrv_connect($serverName,$connectionInfo);
 $stmt = sqlsrv_query($conn, $sql);

 while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
      $result_array[] = $row;
}

return $result_array;

}

创建一个用于row_array。

您应该能够直接在您的应用程序调用此函数,从任何地方。 虽然采取的方式优势active_records构造查询。

不是一个理想的解决方案,但直到笨排序他们SQLSRV类,没有很多我们可以做的。



Answer 3:

什么是您的连接字符串? 您可以指定“网络协议”明确,这somtimes会影响速度。

http://www.connectionstrings.com/articles/show/define-sql-server-network-protocol

“提供者= SQLOLEDB;数据源= 190.190.200.100,1433;网络库= DBMSSOCN;初始目录=酒吧;用户ID =名为myUsername;密码= MYPASSWORD;”

通过指定IP地址,端口号(1433)和网络图书馆,你提供了一个非常精细的连接字符串。 您的详细信息可能会有所不同,当然。

很多次,你不需要这个。 但我一直在几个客户的旅行,其中这是神奇的灰尘。



Answer 4:

你可能希望把db_debug为FALSE应节省时间调试数据库。

此外,建议把cache_on为FALSE,并指定cachedir和使用$this->db->cache_on(); 对于那些不太动态查询,即不经常变化。



Answer 5:

为了加快取多达3次,请使用“MultipleActiveResultSets” =>“0”在您的sqlsrv_connect连接选项。

例如:

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

            ));


文章来源: sqlsrv drivers slow in codeigniter?