2009-03-02 64 views
1

我有一個很奇怪的與SQL相關的問題。「無限」的sql語句?

我訪問MSSQL Server 2005中使用PHP(ODBC),當我執行軌跡下面的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。 當我嘗試在SQL Server Management Studio中執行該語句本身

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

它工作正常(下1秒)。

任何想法?

編輯: 服務器之間的主要區別是,我的服務器是x86(Win2003),而客戶的服務器是x64(Win2008)。

EDIT2:

+0

可以指定你和你的客戶端是否有相同的數據集? – 2009-03-02 15:51:17

+0

不,它不是相同的數據集。我想知道爲什麼「原始」的聲明是在兩臺機器上工作,但不是從php執行時... – chris 2009-03-02 15:56:43

回答

1

有沒有WHERE在SELECT語句子句,所以你會做一個表掃描過的每一行都在該表中添加WHERE子句。如果你的客戶有比你的本地服務器更多的行,這將解釋時間差異。

+0

對不起,我截斷了where子句。它只是「WHERE fieldB IS NULL」 – chris 2009-03-02 15:59:16

0

您的光標被聲明爲DYNAMIC@p3 =2)。在Management Studio中,嘗試將其聲明爲FAST FORWARD@p3=16),看看它是否有幫助。

粘貼您發佈到Management Studio探查器輸出,替換sp_cursorfecth參數:

exec sp_cursorfetch @p1, 2, 1, 1 

,看看問題是否仍然存在。

0

我不知道SQL服務器,但Oracle甚至沒有索引NULL值。即使這樣,字段IS NULL也不是選擇性標準,因此您可能會得到全表掃描,如果您的客戶擁有大量數據,則可能需要很長時間。

0

數據集越大需要的時間越長。你會想用一個where子句限制你的結果集。不要讓你的應用服務器完成所有的工作。向要過濾的列添加索引將允許數據庫服務器僅向您提供您想要的內容,以便以後不必循環。

0

那麼,我不確定是否允許(由我的公司)在這裏放置完整的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