4

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

现在运行查询后,对于一些非常简单的事情,我的响应时间很慢,例如:

function Bash(){


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

查询远程数据库后。(SQL 服务器 2008)

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

a) 是否有其他人在使用 codeigniter 中的 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 驱动程序的活动记录界面有问题。

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

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

注意:这些已经使用 SQL Azure 进行了测试并且可以正常工作。

$query->num_rows(); 不适用于这些驱动程序,因此我建议您改用 count。或者创建自己的包装器。

此外,日期现在是结果集中的日期对象类型。

我希望这有帮助。

解决方案 2

如果由于某种原因您发现了一个使此程序完全无法使用的错误。恢复到最初提供的 sqlsrv 接口。您会发现导致问题的原因是原始接口执行查询的方式,因此,创建了一个数据库帮助器类;使用 $sql = $this->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 构造查询的方式。

这不是一个理想的解决方案,但在 codeigniter 对他们的 SQLSRV 类进行排序之前,我们无能为力。

4

5 回答 5

3

解决方案

最新 SQLSRV 驱动程序的活动记录界面有问题。

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

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

注意:这些已经使用 SQL Azure 进行了测试并且可以正常工作。

$query->num_rows(); 不适用于这些驱动程序,因此我建议您改用 count。或者创建自己的包装器。

此外,日期现在是结果集中的日期对象类型。

解决方案 2

如果由于某种原因您发现了一个使此程序完全无法使用的错误。恢复到最初提供的 sqlsrv 接口。您会发现导致问题的原因是原始接口执行查询的方式,因此,创建了一个数据库帮助器类;使用 $sql = $this->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 构造查询的方式。

这不是一个理想的解决方案,但在 codeigniter 对他们的 SQLSRV 类进行排序之前,我们无能为力。

于 2013-04-10T13:57:18.117 回答
3

在答案已被接受后添加答案,因为我找到了不同的解决方案。我遇到了同样的问题......遍历结果集非常非常慢。我打开 system/database/drivers/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())

-大学教师

于 2013-05-28T15:54:58.360 回答
1

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

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

"提供者=sqloledb;数据源=190.190.200.100,1433;网络库=DBMSSOCN;初始目录=pubs;用户ID=myUsername;Password=myPassword;"

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

很多时候,你不需要这个。但我参加过几次客户旅行,这就是神奇的尘埃。

于 2013-04-08T21:20:43.597 回答
1

您可能希望将 db_debug 设置为 FALSE,这样可以节省调试数据库的时间。

此外,建议将 cache_on 设置为 FALSE 并指定 cachedir 并$this->db->cache_on();用于不太动态的查询,即不经常更改。

于 2013-04-09T17:18:48.680 回答
0

为了将获取速度提高 3 倍,请在 sqlsrv_connect 连接选项中使用“MultipleActiveResultSets”=>'0'。

前任:

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

            ));
于 2014-12-19T21:04:46.753 回答