Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么内联查询或子查询中的绑定参数会生成多个执行计划?_Php_Sql Server_Parameters_Binding - Fatal编程技术网

Php 为什么内联查询或子查询中的绑定参数会生成多个执行计划?

Php 为什么内联查询或子查询中的绑定参数会生成多个执行计划?,php,sql-server,parameters,binding,Php,Sql Server,Parameters,Binding,这两个示例在PHP7.1和SQLServer2008R2中进行了测试 例1: 结果:这创建了1个执行计划并使用了3000次,这太棒了! 例2: 结果:每个周期创建一个执行计划 多谢各位 问题是dblib,使用sqlsrv驱动程序,这不会发生,非常感谢大家。 问题解决了 问题是dblib,使用sqlsrv驱动程序,这不会发生,非常感谢大家。 问题解决了 你能分享你的执行计划吗?您的查询不同,第二个查询非常迟钝。它们应该产生相同的结果集和计划,但是,考虑到所涉及的名称,很可能您已经更改了发布的查

这两个示例在PHP7.1和SQLServer2008R2中进行了测试 例1:

结果:这创建了1个执行计划并使用了3000次,这太棒了! 例2:

结果:每个周期创建一个执行计划

多谢各位


问题是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();