Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Бредовые планы оптимизатора / 15 сообщений из 15, страница 1 из 1
20.11.2002, 17:16:44
    #32070330
TurPOKbIC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
Привет всем!

Желая ускорить работу запросов, я перестроил все индексы в БД. Проверил на нескольких запросах, вроде они стали быстрее раза в 4. Но вот есть такая процедура:


CREATE PROCEDURE DoCalc
@DateCalculated VARCHAR(100) = NULL
AS

UPDATE view1
SET a1 = a2 ,b1 = b2
WHERE @DateCalculated IS NULL
OR DateCalculated IS NULL
OR DateCalculated = CONVERT(DATETIME,DateCalculated,120)
GO

Процедура работает минут 5, после чего я ее останавливаю, так и не дождавшись результата. До перестроения индексов она отрабатывала минуты за 2. Теперь вставляю такой комментарий:



CREATE PROCEDURE DoCalc
@DateCalculated VARCHAR(100) = NULL
AS

UPDATE view1
SET a1 = a2 ,b1 = b2
WHERE /*@DateCalculated IS NULL
OR */DateCalculated IS NULL
OR DateCalculated = CONVERT(DATETIME,DateCalculated,120)
GO


Процедура отрабатывает секунд за 10. Маразм крепчал.
view1 довольно сложный и в плане UPDATE я не могу толком разобраться.

Кто-нибудь может хотя-бы приблизительно сказать куда копать? Может, какие-нибудь подсказки оптимизатору помогут?

Заранее спасибо.
...
Рейтинг: 0 / 0
20.11.2002, 17:29:36
    #32070339
Nickolay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
как это понять?
UPDATE view1
SET a1 = a2 ,b1 = b2
WHERE @DateCalculated IS NULL
OR DateCalculated IS NULL
OR DateCalculated = CONVERT(DATETIME,DateCalculated,120)

если не считать последнего условия, которое по моим понятиям всегда истинно, код получается примерно таким:
Код: plaintext
1.
2.
3.
4.
5.
6.
if @DateCalculated IS NULL 
  UPDATE view1 
  SET a1 = a2 ,b1 = b2 
else
  UPDATE view1 
  SET a1 = a2 ,b1 = b2 
  WHERE DateCalculated IS NULL 
...
Рейтинг: 0 / 0
20.11.2002, 17:36:28
    #32070344
KirillovA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
Проверь наличие автостатистик или перестрой их.
Здесь много говорилось уже о перестройке индексов и статистиках. Кляди ниже, капай дальше.
...
Рейтинг: 0 / 0
20.11.2002, 17:52:08
    #32070354
TurPOKbIC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
2Nickolay
> как это понять?
Что именно? "@DateCalculated VARCHAR(100) = NULL"? Как параметр, у которого значение по умолчанию NULL, а не по умолчанию -- какое угодно.

> если не считать последнего условия, которое по моим
> понятиям всегда истинно, код получается примерно таким:
М-дя...


2KirillovA:
> Проверь наличие автостатистик или перестрой их.
Сделал. Не помогает.
...
Рейтинг: 0 / 0
20.11.2002, 18:05:40
    #32070362
KirillovA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
Вот странно!
Вот, надыбал из своих сырцов - гуру прошу не стебать!:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare	@tablename sysname

declare	Обработка cursor local for
select	table_name
from	information_schema.tables 
where	table_type = 'base table'
order	by  1 
open	Обработка
fetch	next from Обработка into @tablename
while	@@fetch_status =  0  
begin
	print	@tablename
	execute	sp_autostats @tablename
	fetch	next from Обработка into @tablename
end
close	Обработка
deallocate Обработка


Натрави ее на базу и погляди - у всех ли таблиц везде стоит флаг - ON.
Жду...
...
Рейтинг: 0 / 0
20.11.2002, 18:20:19
    #32070370
TurPOKbIC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
> Натрави ее на базу и погляди - у всех ли таблиц везде
> стоит флаг - ON.

Как назло -- у всех стоит. :-(
...
Рейтинг: 0 / 0
20.11.2002, 18:32:20
    #32070379
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
Желая ускорить работу запросов, я перестроил все индексы в БД. Проверил на нескольких запросах, вроде они стали быстрее раза в 4

Вы напрасно считаете, что оптимизируя выполнения SELECT-ов, вы не влияете на скорость работы UPDATE-ов.
Если вы, например, построили кластерный индекс по a1+b1 да еще с FUILLFACTOR = 100, то я не удивляюсь, что "несколько запросов" стали работать в 4 раза быстрее.
А "бедному" UPDATE-у теперь приходится физически пермещать записи в соответствии с новыми значениями (SET a1 = a2 ,b1 = b2 ) да еще наверное попутно с расщеплением страниц и перестройкой некластерных индексов.
...
Рейтинг: 0 / 0
20.11.2002, 18:37:47
    #32070382
KirillovA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
Копай тады во вьюхе ...
Или поочередно в каждой таблице...
count по вьюхе большой?
...
Рейтинг: 0 / 0
20.11.2002, 18:40:15
    #32070384
KirillovA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
Вот и Глори ответил.
Самый профессиональный ответ.
Полностью согласен с ним.
...
Рейтинг: 0 / 0
20.11.2002, 18:48:15
    #32070387
TurPOKbIC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
Блин! Перенес @DateCalculated IS NULL из начала WHERE в конец; и -- готово -- 12 секунд.
...
Рейтинг: 0 / 0
21.11.2002, 10:59:59
    #32070612
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
думаю что проца выглядела так
CREATE PROCEDURE DoCalc
@DateCalculated VARCHAR(100) = NULL
AS
UPDATE view1
SET a1 = a2 ,b1 = b2
WHERE @DateCalculated IS NULL
OR DateCalculated IS NULL
OR DateCalculated = CONVERT(DATETIME, @DateCalculated ,120)
GO
....
нужно так.....
WHERE DateCalculated IS NULL
OR DateCalculated = CONVERT(DATETIME,@DateCalculated,120)
...
Рейтинг: 0 / 0
21.11.2002, 12:33:18
    #32070683
TurPOKbIC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
> нужно так.....
> WHERE DateCalculated IS NULL
> OR DateCalculated = CONVERT(DATETIME,DateCalculated,120)

Не, @DateCalculated IS NULL -- нужно. Это означает, что
если перцедура вызвана без параметра, то -- надо изменить
все представление.

Мне кажется, что когда @DateCalculated IS NULL стоит первым во WHERE -- дубовый оптимизатор проверяет на это условие каждую строку представления (а их там -- 7 млн.). А когда последним -- только строки, прошедшие через фильтр других условий (несколько тысяч).
...
Рейтинг: 0 / 0
21.11.2002, 13:16:36
    #32070710
AISOFT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
Чего-то я не понимаю? Если @DateCalculated IS NULL то и все условие в WHERE будет истино. Тогда обновляется вся таблица, а если оно ложно то update можно упростить и оставить только DateCalculated IS NULL OR DateCalculated = CONVERT(DATETIME,DateCalculated,120)
Что я понял не правильно?
...
Рейтинг: 0 / 0
21.11.2002, 14:26:19
    #32070770
TurPOKbIC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
> Чего-то я не понимаю? Если @DateCalculated IS NULL то и
> все условие в WHERE будет истино. Тогда обновляется вся
> таблица, а если оно ложно то update можно упростить и
> оставить только DateCalculated IS NULL OR DateCalculated =
> CONVERT(DATETIME,DateCalculated,120)
> Что я понял не правильно?

Ну да, так все и есть. Я пробовал сделать

IF @DateCalculated IS NULL BEGIN
UPDATE view1
SET a1 = a2, b1 = b2
END
ELSE BEGIN
UPDATE view1
SET a1 = a2, b1 = b2
WHERE DateCalculated IS NULL
OR DateCalculated = CONVERT(datetime,@DateCalculated, 120)
END

но это на скорость не вляет.

Кстати, на счет применения @DateCalculated IS NULL после того, как строки прошли отсев по другим условиям, я не прав. Это было бы верно в случае объединения условий опреатором AND, а тут -- OR.

Вобщем, логика оптимизатора мне совсем не понятна. К тому же, при каждом серьезном изменении структуры БД или самих данных он может так поменять план запроса, что прийдется заново настраивать производительность запросов. А если применять подсказки, то -- сегодня они могут помочь, а через полгода -- начнут мешать. Может лучше вместо 1 сложного запроса или представления писать процедуру с кучей простых запросов, с временными таблицами и максимальным
использованием процедурных возможностей T-SQL.

Это уже так -- в порядке общей жалобы на жизнь.
...
Рейтинг: 0 / 0
21.11.2002, 15:20:43
    #32070830
AISOFT
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Бредовые планы оптимизатора
В начале было
CONVERT(DATETIME,DateCalculated,120)

а в последнем ответе стало
CONVERT(datetime,@DateCalculated, 120)

Если правильный второй вариант, то почему в update нельзя использовать переменную, а не результат функции?
Кроме того, есть индекс начинающийся на DateCalculated и сколько всего индексов используют это поле.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Бредовые планы оптимизатора / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]