"Sonsuz"

5 Cevap php

Ben çok garip bir sql ile ilgili bir sorun var.

Ben sql deyimini aşağıdaki yürütüldüğünde profili ne zaman, PHP (ODBC) ile MSSQL Server 2005 erişme ediyorum:

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

On my own server it's working fine, on the customer-server the sp_cursorfetch reads infinite rows and loads the full cpu. When I try to execute the statement itself

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

SQL Server Management Studio bu (1sn altında) çalışıyor.

Herhangi bir fikir?

Edit: the main difference between the servers is that my server is a x86 (Win2003) and the server of the customer is a x64 (Win2008).

Edit2: Nerede-Clause Eklenenler

5 Cevap

Eğer bir tablo bu tablodaki her satır üzerinde tarama yapıyor olacak bu yüzden hiçbir WHERE yan tümcesi, SELECT deyiminde var. Müşteri yerel sunucudan çok daha fazla satır varsa, o zaman tutarsızlığı açıklamak istiyorum.

SQL sunucusu hakkında biliyorum, ama Oracle etmez hatta dizin null değerleri yok. Öyle olsa bile, alan seçici bir kriter değildir IS NULL, böylece müşteri bir çok veri varsa uzun bir zaman alabilir, hangi tam tablo taraması alabilirsiniz.

Sizin imleç olarak ilan edilir DYNAMIC (@p3 =2). Management Studio olarak, FAST FORWARD (@p3=16) olarak ilan etmek denemek ve yardımcı olmadığını görmek.

Eğer parametre yerine, Management Studio içine yayınlanmıştır profiler çıkışını yapıştırın sp_cursorfecth:

exec sp_cursorfetch @p1, 2, 1, 1

sorun devam ederse ve görmek.

Daha büyük veri kümesi o kadar uzun sürer. Sen nerede yan tümcesi ile set sonucunuzu sınırlamak isteyeceksiniz. Uygulama sunucusu tüm iş yapmak yapmayın. Eğer filtreleme sütuna bir dizin ekleme veritabanı sunucusu, sadece bunu daha sonra ona sokmak döngü gerekmez istediğini vermek sağlayacaktır.

Eh, ben burada tam sql-ifadeleri koymak için (benim şirket tarafından) izin ediyorsam emin değildi.

Bu aslında PHP yürütme kulüpler budur:

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