我已经安装了最新版本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类,没有很多我们可以做的。
答案后添加一个答案,这已经被接受了,因为我发现了一个不同的解决方案。 我有同样的问题......在结果集循环是非常非常缓慢。 我打开系统/数据库/驱动器/ 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
解
该活动记录接口为最新的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类,没有很多我们可以做的。
什么是您的连接字符串? 您可以指定“网络协议”明确,这somtimes会影响速度。
http://www.connectionstrings.com/articles/show/define-sql-server-network-protocol
“提供者= SQLOLEDB;数据源= 190.190.200.100,1433;网络库= DBMSSOCN;初始目录=酒吧;用户ID =名为myUsername;密码= MYPASSWORD;”
通过指定IP地址,端口号(1433)和网络图书馆,你提供了一个非常精细的连接字符串。 您的详细信息可能会有所不同,当然。
很多次,你不需要这个。 但我一直在几个客户的旅行,其中这是神奇的灰尘。
你可能希望把db_debug为FALSE应节省时间调试数据库。
此外,建议把cache_on为FALSE,并指定cachedir和使用$this->db->cache_on();
对于那些不太动态查询,即不经常变化。
为了加快取多达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'
));