Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];

Вниз

Запрос работает по разному.   Найти похожие ветки 

 
KAA   (2002-10-31 22:27) [0]

Проблема достаточно своеобразная, но уже хоть о стену головой бейся. Есть хранимая процедура, в ней запрос. Клиент вызывает ее с одними и теми же параметрами, но периодически возвращается разное число записей. В процедуре ничего не меняю, и когда она некоторые записи не выводит, работает немного дольше.
В чем может быть проблема, кроме фазы луны?


 
wicked   (2002-10-31 22:29) [1]

в ДНК.... :)) (шучу я так)
а запрос приведи, хотя бы схематично...


 
3JIA9I CyKA   (2002-10-31 23:01) [2]

Удалено модератором


 
Dr_Mike   (2002-11-01 01:49) [3]

>KAA © (31.10.02 22:27)

Ну неужели текст запроса является таким секретом ???



 
KAA   (2002-11-04 10:47) [4]

Извеняюсь за свое отсутствие.
Текст запроса секретом не является, но это не один конкретный запрос, что-то на базу глобально напало.
Есть еще одна "аномалия".
Существует запрос, его можно отработать из квери аналайзера или из хранимой процедуры. Запросы одинаковае, даже один скопирован с другого, но один из них выполняется 2-3 секунды, а другой 4 минуты. Также у них разный план запроса и используемые индексы.
В чем причина такого различия и как заставить медленный вариант запроса работать быстрее (ведь он может же)?


 
dias   (2002-11-04 12:19) [5]

Скорей всего стучишся к базе через BDE+ODBC
Я сталкивался с таким на Pervasive.SQL 2000.
Решилось установкой SP4 для Pervasive.SQL 2000
Без устанки SP пришлось на время отказаться от
хранимых процедур.


 
KAA   (2002-11-04 12:23) [6]

У меня вся база на хранимых процедурах построена. Разница в работе уже при вызове ХП из квери аналайзера и вызова самого запроса из аналайзера, скопированного из этой же процедуры.
Что такое Pervasive.SQL 2000 ? И о каком SP4 идет речь?


 
dias   (2002-11-04 12:53) [7]

Pervasive.SQL 2000 - это СУБД такая наследница Btrieve
SP4 - это сервис пак к нему
Я проводил эксперемент при выполнении запросов с вызовом хранимой процедуры и просто без BDE работало все отлично
с BDE+ODBC наблюдался ранее описанный глюк
Глючила BDE, попробуте поменять версию BDE


 
KAA   (2002-11-04 13:02) [8]

Был выявлен своеобразный глюк.
Если в процедуру присылается параметр, а потом этот параметр используется в запросе, начинаются дикие тормоза.
Если в процедуре создать переменную, присланный параметр присвоить этой переменной, а переменную использовать в запросе, все будет работать.
Есть научное объяснение?


 
wicked   (2002-11-04 13:04) [9]

2 KAA ©
ммм... триггера?... статистика?....
а если пересоздать процедуры?....
всё же приведи запросы, можно не все, а типичный пример...


 
wicked   (2002-11-04 13:07) [10]

2 KAA ©
а такое действительно на глюк похоже.... версия mssql?....


 
KAA   (2002-11-04 14:38) [11]

2 wicked ©

Триггеры вообще не использую, статастику тоже не трогал, вроде по идее она должна автоматически обновляться.
Процедуры пересоздавал, тот же эффект, помогло только неиспользование передаваемого параметра в запросе, причем до этого все работало, глюк напал неожиданно.
Все проверял на двух разных базах (одна - копия другой для тестов) на двух разных серверах. Один сервер оригинальный SQL 8.00.194 , другой сервер пропатченый 8.00.534 .

Вот один из запросов:

CREATE PROCEDURE FreeRoom
@CaptionRoom varchar(50) = NULL,
@IDTypeRoom int = NULL,
@IDLocate int = NULL,
@IDQuality int = NULL,
@DTIn datetime = NULL,
@DTOut datetime = NULL,
@Combination int = NULL,
@CountPlaceMin float = NULL,
@CountPlaceMax float = NULL,
@TaxrateMin int = NULL,
@TaxrateMax int = NULL

AS

DECLARE @Vari_buffer sql_variant

IF (@IDTypeRoom=0) SET @IDTypeRoom=NULL
IF (@IDLocate=0) SET @IDLocate=NULL
IF (@IDQuality=0) SET @IDQuality=NULL
IF (@Combination IS NULL) SET @Combination=0

IF (@DTIn>=@DTOut) BEGIN
RAISERROR ("Дата поселения должна быть меньше даты выселения",16,1)
RETURN
END


EXEC ConstVal "buffer_after_change", @Vari_buffer OUT
SET @DTOut=Convert(datetime,(Convert(float,@DTOut)+0.04166667*Convert(float,@Vari_buffer)))


SELECT TOP 1000
room.ID,
room.Caption AS CaptionRoom,
room.IDLocate,
locate_room.Caption AS CaptionLocate,
journal.Taxrate,
journal.CountPlace,
journal.IDQuality,
journal.IDTypeRoom,
journal.CaptionTypeRoom,
journal.CaptionQuality,
isnull(max_d_al.AllCountPlace,0) AS Occupied,
sex.Sex
FROM
room
LEFT OUTER JOIN locate_room ON room.IDLocate=locate_room.ID
LEFT OUTER JOIN (SELECT
room_var.IDRoom,
service_taxrate.Taxrate,
room_var.CountPlace,
room_var.IDQuality,
room_var.IDTypeRoom,
type_room.Caption AS CaptionTypeRoom,
quality.Caption AS CaptionQuality
FROM
room_var
LEFT OUTER JOIN type_room ON room_var.IDTypeRoom = type_room.ID
LEFT OUTER JOIN quality ON room_var.IDQuality = quality.ID
LEFT OUTER JOIN service ON room_var.IDService = service.ID
LEFT OUTER JOIN service_taxrate ON service.ID = service_taxrate.IDService
LEFT OUTER JOIN (SELECT IDRoom, max(DTActual) AS DTMax FROM room_var WHERE (@DTIn>=DTActual) or (@DTIn IS NULL) GROUP BY IDRoom) AS room_var_maxdt ON room_var.IDRoom=room_var_maxdt.IDRoom
LEFT OUTER JOIN (SELECT IDService, max(DTActual) AS DTMax FROM service_taxrate WHERE (@DTIn>=DTActual) or (@DTIn IS NULL) GROUP BY IDService) AS service_taxrate_maxdt ON service_taxrate.IDService=service_taxrate_maxdt.IDService
WHERE
(room_var.DTActual=room_var_maxdt.DTMax) and
(service_taxrate.DTActual=service_taxrate_maxdt.DTMax)
) AS journal ON room.ID = journal.IDRoom

LEFT OUTER JOIN (SELECT allocation.IDRoom,
max(allocation.CountPlace+CASE WHEN (allocation.ID<>ja.ID) THEN isnull(ja.CountPlace,0) ELSE 0 END) AS AllCountPlace
FROM allocation
LEFT OUTER JOIN man ON allocation.IDMan=man.ID
LEFT OUTER JOIN allocation AS ja ON (allocation.IDRoom=ja.IDRoom) and (ja.DTOut>allocation.DTIn) and (ja.DTIn<allocation.DTOut) --and (allocation.ID<>ja.ID)
WHERE (@DTOut>allocation.DTIn) and (@DTIn<allocation.DTOut) and
((@DTOut>ja.DTIn) or (ja.DTIn IS NULL)) and ((@DTIn<ja.DTOut) or (ja.DTOut IS NULL)) and
(allocation.CountPlace>0) and
(allocation.ID NOT IN (SELECT IDReason FROM allocation WHERE (IDReason IS NOT NULL) GROUP BY IDReason)) and
((ja.ID NOT IN (SELECT IDReason FROM allocation WHERE (IDReason IS NOT NULL) GROUP BY IDReason)) or (ja.ID IS NULL))
GROUP BY allocation.IDRoom
) AS max_d_al ON (room.ID=max_d_al.IDRoom)

LEFT OUTER JOIN (SELECT
max_d.IDRoom,
CASE WHEN (count(max_d.Sex)>1) THEN 4
ELSE max(max_d.Sex)
END AS Sex

FROM room
LEFT OUTER JOIN (SELECT
allocation.IDRoom, man.Sex
FROM allocation
LEFT OUTER JOIN man ON allocation.IDMan=man.ID
WHERE (@DTOut>allocation.DTIn) and (@DTIn<allocation.DTOut) and
(man.Sex IS NOT NULL) and
(allocation.CountPlace>0) and
(allocation.ID NOT IN (SELECT IDReason FROM allocation WHERE (IDReason IS NOT NULL) GROUP BY IDReason))
GROUP BY allocation.IDRoom, man.Sex
) AS max_d ON (room.ID=max_d.IDRoom)
GROUP BY max_d.IDRoom
) AS sex ON (room.ID=sex.IDRoom)

WHERE
(room.Folder=0) and
((((isnull(journal.CountPlace,0)-isnull(max_d_al.AllCountPlace,0))>=@CountPlaceMin)) or
((max_d_al.IDRoom IS NULL) and ((isnull(journal.CountPlace,0)>=@CountPlaceMin) or (@CountPlaceMin IS NULL)))) and
((isnull(journal.CountPlace,0)<=@CountPlaceMax) or (@CountPlaceMax IS NULL))
ORDER BY room.Caption
GO


 
wicked   (2002-11-04 15:17) [12]

2 KAA ©
а если разбить эти запросы на что то более управляемое?.... маловероятно, но возможно, ты где-то что-то не так передаешь.....

также прибавку к скорости даст замена IN на EXISTS - у меня были случаи, когда вместо 4 минут запрос исполнялся 4 секунды... хотя я специально экспериментов не ставил, поэтому за чистоту не ручаюсь...


 
KAA   (2002-11-04 15:54) [13]

Весь прикол состоит в том, что глюки и тормоза НАПАЛИ НЕОЖИДАННО, единственное изменение в базе - это стало больше записей.
Разбивать не хотелось бы, ибо сейчас процедура одним селектом возвращает все необходимые значения.


 
wicked   (2002-11-04 22:23) [14]

2 KAA ©
разбей на отдельные view и из них запрос составляй...


 
KAA   (2002-11-05 09:27) [15]

Собственно говоря с одной стороны проблемы решаются, но решаются очень своеобразно. Как я уже писал выше, достаточно было не использовать параметр передаваемый в процедуру в самом селекте. Другое дело что это как-то ненормально.


 
wicked   (2002-11-05 11:12) [16]

не нормально.... но мне кажется, проблема механическая - где то не там закрыта скобка, что-то пропущено и т. д....
разбей запросы и отладь/просмотри результаты каждого из них...


 
KAA   (2002-11-05 16:49) [17]

Разбивал запрос, и отдельно все работает. Не работает все всместе при определенных НЕПОНЯТНЫХ МНЕ обстоятельствах. Или я какой нюанс не знаю, или сам SQL глючит.


 
Delirium   (2002-11-05 18:53) [18]

sp_updatestats



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.01 c
14-82949
Pumpkin
2002-11-05 23:51
2002.11.25
Как заставить NetWare client не логиниться при загрузке Windows


1-82861
race1
2002-11-14 14:36
2002.11.25
ascii


1-82857
RTZ
2002-11-14 13:52
2002.11.25
Easy question


4-83076
zarum
2002-10-14 19:29
2002.11.25
как бы создать виртуальный диск в памяти (ex RAMDRIVE)


14-82917
Катерина
2002-11-04 11:56
2002.11.25
Посоветуйте компонент...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский