"бесконечное" заявление SQL? - PullRequest
1 голос
/ 02 марта 2009

У меня очень странная проблема, связанная с 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 читает бесконечные строки и загружает весь процессор. Когда я пытаюсь выполнить само заявление

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

в SQL Server Management Studio работает нормально (менее 1 секунды).

Есть идеи?

Edit: Основное различие между серверами заключается в том, что мой сервер - x86 (Win2003), а сервер клиента - x64 (Win2008).

Редактировать2: добавлен пункт «Где»

Ответы [ 5 ]

1 голос
/ 02 марта 2009

В этом операторе SELECT нет предложения WHERE, поэтому вы будете выполнять сканирование каждой строки в этой таблице. Если у вашего клиента намного больше строк, чем у локального сервера, это объясняет расхождение во времени.

0 голосов
/ 03 марта 2009

Ну, я не был уверен, разрешено ли (моей компанией) размещать здесь полные 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
0 голосов
/ 02 марта 2009

Чем больше набор данных, тем больше времени требуется. Вы захотите ограничить свой набор результатов предложением where. Не заставляйте сервер приложений выполнять всю работу. Добавление индекса к столбцу, по которому вы фильтруете, позволит серверу баз данных давать вам только то, что вы хотите, чтобы вам не пришлось проходить через него позже.

0 голосов
/ 02 марта 2009

Я не знаю о сервере SQL, но Oracle даже не индексирует значения NULL. Даже если это так, поле IS NULL не является избирательным критерием, поэтому вы можете получить полное сканирование таблицы, которое может занять много времени, если у вашего клиента много данных.

0 голосов
/ 02 марта 2009

Ваш курсор объявлен как DYNAMIC (@p3 =2). В Management Studio попробуйте объявить его как FAST FORWARD (@p3=16) и посмотреть, поможет ли это.

Вставьте вывод профилировщика, который вы разместили в Management Studio, заменив параметр в sp_cursorfecth:

exec sp_cursorfetch @p1, 2, 1, 1

и посмотрите, сохраняется ли проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...