“无限”的sql语句?

Posted

技术标签:

【中文标题】“无限”的sql语句?【英文标题】:"infinite" sql statement? 【发布时间】:2009-03-02 15:49:10 【问题描述】:

我遇到了一个非常奇怪的 sql 相关问题。

我正在使用 php (odbc) 访问 MSSQL Server 2005,当我分析 sql 语句时,会执行以下操作:

declare @p1 int
set @p1=180150003
declare @p3 int
set @p3=2
declare @p4 int
set @p4=1
declare @p5 int
set @p5=-1
exec sp_cursoropen @p1 output,N'SELECT  fieldA,  fieldB, fieldC, fieldD, fieldE FROM mytable WHERE fieldB IS NULL',@p3 output,@p4 output,@p5 output
select @p1, @p3, @p4, @p5

exec sp_cursorfetch 180150003,2,1,1

在我自己的服务器上它工作正常,在客户服务器上 sp_cursorfetch 读取无限行并加载完整的 cpu。 当我尝试执行语句本身时

SELECT  fieldA,  fieldB, fieldC, fieldD, fieldE FROM mytable WHERE fieldB IS NULL

在 SQL Server Management Studio 中运行良好(不到 1 秒)。

有什么想法吗?

编辑: 服务器之间的主要区别是我的服务器是x86(Win2003),而客户的服务器是x64(Win2008)。

Edit2:添加 Where 子句

【问题讨论】:

您能否指定您和您的客户是否拥有完全相同的数据集? 不,这不是同一个数据集。我想知道为什么“原始”语句在两台机器上都可以工作,但从 php 执行时却不行...... 【参考方案1】:

该 SELECT 语句中没有 WHERE 子句,因此您将对该表中的每一行进行表扫描。如果您的客户的行数比您的本地服务器多得多,则可以解释时间差异。

【讨论】:

抱歉,我截断了 where 子句。它只是“WHERE fieldB IS NULL”【参考方案2】:

我不了解 SQL 服务器,但 Oracle 甚至不索引 NULL 值。即使是这样,字段 IS NULL 也不是一个选择性标准,因此您可能会进行全表扫描,如果您的客户有大量数据,这可能需要很长时间。

【讨论】:

【参考方案3】:

您的光标被声明为DYNAMIC (@p3 =2)。在Management Studio 中,尝试将其声明为FAST FORWARD (@p3=16),看看是否有帮助。

将您发布的分析器输出粘贴到Management Studio,替换sp_cursorfecth 中的参数:

exec sp_cursorfetch @p1, 2, 1, 1

看看问题是否仍然存在。

【讨论】:

显示的语句是我从 SQL 分析器中得到的。在 PHP 中,我只是在执行 odbc_exec($myconn, "SELECT fieldA, ...")【参考方案4】:

数据集越大,所需的时间就越长。您将希望使用 where 子句限制结果集。不要让您的应用程序服务器完成所有工作。向您要过滤的列添加索引将允许数据库服务器只为您提供您想要的内容,这样您以后就不必循环遍历它。

【讨论】:

【参考方案5】:

好吧,我不确定(我的公司)是否允许我在这里放置完整的 sql 语句。

这是我在 PHP 中实际执行的操作:

SELECT 
A.id, A.empl, A.valid_from,
A.salutation, A.account
FROM persons A
LEFT JOIN persons_comp B 
ON
A.id = B.id 
AND A.empl = B.empl 
AND A.valid_from = B.valid_from 
AND A.salutation = B.salutation 
AND A.account = B.account 
WHERE 
B.empl IS NULL

【讨论】:

以上是关于“无限”的sql语句?的主要内容,如果未能解决你的问题,请参考以下文章

SQL游标进入无限循环

linux之SQL语句简明教程---AND OR

mysql递归查询语句

如何加快 SQL 中的连接更新?我的陈述似乎无限期地运行

SQL查询语句

sql语句加参数