Php 为什么内联查询或子查询中的绑定参数会生成多个执行计划?
这两个示例在PHP7.1和SQLServer2008R2中进行了测试 例1: 结果:这创建了1个执行计划并使用了3000次,这太棒了! 例2: 结果:每个周期创建一个执行计划 多谢各位Php 为什么内联查询或子查询中的绑定参数会生成多个执行计划?,php,sql-server,parameters,binding,Php,Sql Server,Parameters,Binding,这两个示例在PHP7.1和SQLServer2008R2中进行了测试 例1: 结果:这创建了1个执行计划并使用了3000次,这太棒了! 例2: 结果:每个周期创建一个执行计划 多谢各位 问题是dblib,使用sqlsrv驱动程序,这不会发生,非常感谢大家。 问题解决了 问题是dblib,使用sqlsrv驱动程序,这不会发生,非常感谢大家。 问题解决了 你能分享你的执行计划吗?您的查询不同,第二个查询非常迟钝。它们应该产生相同的结果集和计划,但是,考虑到所涉及的名称,很可能您已经更改了发布的查
问题是dblib,使用sqlsrv驱动程序,这不会发生,非常感谢大家。
问题解决了 问题是dblib,使用sqlsrv驱动程序,这不会发生,非常感谢大家。
问题解决了 你能分享你的执行计划吗?您的查询不同,第二个查询非常迟钝。它们应该产生相同的结果集和计划,但是,考虑到所涉及的名称,很可能您已经更改了发布的查询。是这样吗?当然:在第一个例子中,我只得到一个执行计划。第二次,我得到了一个计划,为每一个单一的价值@是的,我试图简化代码,问题是当从表中运行select*from select*from value=:value x时,它将参数转换为文字并将其连接为字符串。您可以共享您的执行计划吗?您的查询不同,第二个查询非常迟钝。它们应该产生相同的结果集和计划,但是,考虑到所涉及的名称,很可能您已经更改了发布的查询。是这样吗?当然:在第一个例子中,我只得到一个执行计划。第二次,我得到了一个计划,为每一个单一的价值@是的,我试图简化代码,问题是当从表中运行select*fromselect*fromselect=:value x时,它会将参数转换为文本并将其连接为字符串
<?php
$pdoMssql = new \PDO('dblib:host=HOST;dbname=DB_NAME;charset=utf8;', 'USER', 'PASSWORD');
$pdoMssql->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$pdoMssql->beginTransaction();
$strq = 'select id_some_table from some_table where id_some_table = :valor';
$stmt = $pdoMssql->prepare($strq);
for ($index = 0; $index < 3000; $index++) {
$stmt->bindValue(':valor', $index, \PDO::PARAM_INT);
$stmt->execute();
}
$pdoMssql->commit();
<?php
$pdoMssql = new \PDO('dblib:host=HOST;dbname=DB_NAME;charset=utf8;', 'USER', 'PASSWORD');
$pdoMssql->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$pdoMssql->beginTransaction();
$strq = 'select id_some_table from ( select id_some_table from some_table ) x where id_some_table = :valor';
$stmt = $pdoMssql->prepare($strq);
for ($index = 0; $index < 3000; $index++) {
$stmt->bindValue(':valor', $index, \PDO::PARAM_INT);
$stmt->execute();
}
$pdoMssql->commit();