|
|
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
Привет всем! Желая ускорить работу запросов, я перестроил все индексы в БД. Проверил на нескольких запросах, вроде они стали быстрее раза в 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 я не могу толком разобраться. Кто-нибудь может хотя-бы приблизительно сказать куда копать? Может, какие-нибудь подсказки оптимизатору помогут? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 17:16:44 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
как это понять? 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 17:29:36 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
Проверь наличие автостатистик или перестрой их. Здесь много говорилось уже о перестройке индексов и статистиках. Кляди ниже, капай дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 17:36:28 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
2Nickolay > как это понять? Что именно? "@DateCalculated VARCHAR(100) = NULL"? Как параметр, у которого значение по умолчанию NULL, а не по умолчанию -- какое угодно. > если не считать последнего условия, которое по моим > понятиям всегда истинно, код получается примерно таким: М-дя... 2KirillovA: > Проверь наличие автостатистик или перестрой их. Сделал. Не помогает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 17:52:08 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
Вот странно! Вот, надыбал из своих сырцов - гуру прошу не стебать!: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Натрави ее на базу и погляди - у всех ли таблиц везде стоит флаг - ON. Жду... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 18:05:40 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
> Натрави ее на базу и погляди - у всех ли таблиц везде > стоит флаг - ON. Как назло -- у всех стоит. :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 18:20:19 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
Желая ускорить работу запросов, я перестроил все индексы в БД. Проверил на нескольких запросах, вроде они стали быстрее раза в 4 Вы напрасно считаете, что оптимизируя выполнения SELECT-ов, вы не влияете на скорость работы UPDATE-ов. Если вы, например, построили кластерный индекс по a1+b1 да еще с FUILLFACTOR = 100, то я не удивляюсь, что "несколько запросов" стали работать в 4 раза быстрее. А "бедному" UPDATE-у теперь приходится физически пермещать записи в соответствии с новыми значениями (SET a1 = a2 ,b1 = b2 ) да еще наверное попутно с расщеплением страниц и перестройкой некластерных индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 18:32:20 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
Копай тады во вьюхе ... Или поочередно в каждой таблице... count по вьюхе большой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 18:37:47 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
Вот и Глори ответил. Самый профессиональный ответ. Полностью согласен с ним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 18:40:15 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
Блин! Перенес @DateCalculated IS NULL из начала WHERE в конец; и -- готово -- 12 секунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2002, 18:48:15 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
думаю что проца выглядела так 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2002, 10:59:59 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
> нужно так..... > WHERE DateCalculated IS NULL > OR DateCalculated = CONVERT(DATETIME,DateCalculated,120) Не, @DateCalculated IS NULL -- нужно. Это означает, что если перцедура вызвана без параметра, то -- надо изменить все представление. Мне кажется, что когда @DateCalculated IS NULL стоит первым во WHERE -- дубовый оптимизатор проверяет на это условие каждую строку представления (а их там -- 7 млн.). А когда последним -- только строки, прошедшие через фильтр других условий (несколько тысяч). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2002, 12:33:18 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
Чего-то я не понимаю? Если @DateCalculated IS NULL то и все условие в WHERE будет истино. Тогда обновляется вся таблица, а если оно ложно то update можно упростить и оставить только DateCalculated IS NULL OR DateCalculated = CONVERT(DATETIME,DateCalculated,120) Что я понял не правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2002, 13:16:36 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
> Чего-то я не понимаю? Если @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. Это уже так -- в порядке общей жалобы на жизнь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2002, 14:26:19 |
|
||
|
Бредовые планы оптимизатора
|
|||
|---|---|---|---|
|
#18+
В начале было CONVERT(DATETIME,DateCalculated,120) а в последнем ответе стало CONVERT(datetime,@DateCalculated, 120) Если правильный второй вариант, то почему в update нельзя использовать переменную, а не результат функции? Кроме того, есть индекс начинающийся на DateCalculated и сколько всего индексов используют это поле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2002, 15:20:43 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32070612&tid=1818605]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 357ms |

| 0 / 0 |
