Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Оптимизация простых, но тяжелых для сервера запросов  [new]
Joy Yen
Member

Откуда:
Сообщений: 15
Прошу помочь оптимизировать, простой запрос:

create table t1 (c_obj_id int);

insert into t1 (c_obj_id) select c_obj_id from ct855 where c_is_del=1;

update ct857 set cm3358=null where cm3358 in (select c_obj_id from t1);

update ct857 set cm3360=null where cm3360 in (select c_obj_id from t1);

pdate ct855 set cm3339=null where cm3339 in (select c_obj_id from t1);

delete from at855_3408 where cm3408 in (select c_obj_id from t1);

drop table t1;

В принципе все работает, но проблема в том что в таблице t1 оказывается 670 000 строк, что приводи к тому что первое же обновление выполнялось 41 час и так и не выполнилось, т.к. не ясно вообще как долго он может выполняться. Смущает, что после перезапуска на сервере PIV 3000 MHz 1024 MB DDR, процесс запущенный 6 часов надаз в sp_who2 дает такие характеристики: CPUTime 20314890 DiskIO 38783. Как построить запрос, чтобы сервер справилься с задачей за короткий срок?
20 июл 09, 13:32    [7435583]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
использовать JOIN вместо IN
, ну и на индексы посмотреть
20 июл 09, 13:35    [7435606]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
Glory
Member

Откуда:
Сообщений: 104760
Для начала сделайте индекс для t1.c_obj_id
Потом посмотрите план выполнения вашего запроса
20 июл 09, 13:36    [7435611]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36800
Индекс хоть один в базе есть?
20 июл 09, 13:36    [7435612]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
Joy Yen
Member

Откуда:
Сообщений: 15
ветерочек
использовать JOIN вместо IN
, ну и на индексы посмотреть


но проблема же при UPDATE как предлагается записать JOIN?!
20 июл 09, 13:37    [7435626]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36800
Joy Yen
ветерочек
использовать JOIN вместо IN
, ну и на индексы посмотреть


но проблема же при UPDATE как предлагается записать JOIN?!
Вы представляете, в апдейтах тоже join'ы писать можно. Прикольно, да?
20 июл 09, 13:38    [7435641]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
Joy Yen
Member

Откуда:
Сообщений: 15
Гавриленко Сергей Алексеевич
Индекс хоть один в базе есть?


есть не уникальный, некластеризованный
20 июл 09, 13:40    [7435652]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
Joy Yen
ветерочек
использовать JOIN вместо IN
, ну и на индексы посмотреть


но проблема же при UPDATE как предлагается записать JOIN?!


update t
set cm3358=null
from ct857 t 
join t1 t1
on t1.c_obj_id =t.cm3358
20 июл 09, 13:41    [7435656]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36800
Joy Yen
Гавриленко Сергей Алексеевич
Индекс хоть один в базе есть?


есть не уникальный, некластеризованный
Так. Щас все дружно напрягутся и угадают на какой таблице и по какому полю.
20 июл 09, 13:41    [7435660]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
Joy Yen
Гавриленко Сергей Алексеевич
Индекс хоть один в базе есть?


есть не уникальный, некластеризованный

что правда 1 на всю базу?
20 июл 09, 13:42    [7435665]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
ветерочек
использовать JOIN вместо IN

совершенно не факт.
20 июл 09, 13:48    [7435715]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
Joy Yen
Member

Откуда:
Сообщений: 15
ветерочек
Joy Yen
ветерочек
использовать JOIN вместо IN
, ну и на индексы посмотреть


но проблема же при UPDATE как предлагается записать JOIN?!


update t
set cm3358=null
from ct857 t 
join t1 t1
on t1.c_obj_id =t.cm3358


помогло запрос выполнятся 2 мин., блин какой же криворукий разработчик написал первоначальный скрипты, до этого запрос выполнялся 41 час и так и не закончился, спасибо, что касается индексов, то их в базе огромное множесто, и на поля по которым производится обновления тоже есть, ка наждую таблицу по 7 штук.
20 июл 09, 13:49    [7435722]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
йцу!
Guest
ветерочек


update t
set cm3358=null
from ct857 t 
join t1 t1
on t1.c_obj_id =t.cm3358


зачем все так усложнять?? вот...

update ct857
set cm3358=null
from t1
where ct857.cm3358 = t1.c_obj_id
20 июл 09, 13:49    [7435724]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
locky
ветерочек
использовать JOIN вместо IN

совершенно не факт.


можешь привести пример когда это не так?

PS. вобще-то in оптимизатор превращает в or ....
20 июл 09, 13:53    [7435760]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
йцу!
ветерочек


update t
set cm3358=null
from ct857 t 
join t1 t1
on t1.c_obj_id =t.cm3358


зачем все так усложнять?? вот...

update ct857
set cm3358=null
from t1
where ct857.cm3358 = t1.c_obj_id


привычка всегда использовать алиасы для таблиц...
20 июл 09, 13:54    [7435769]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
Glory
Member

Откуда:
Сообщений: 104760
ветерочек


PS. вобще-то in оптимизатор превращает в or ....

Какой OR, там ведь подзапрос. 670 000 OR-ов что ли ?
20 июл 09, 13:54    [7435774]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
йцу!
ветерочек


update t
set cm3358=null
from ct857 t 
join t1 t1
on t1.c_obj_id =t.cm3358


зачем все так усложнять?? вот...

update ct857
set cm3358=null
from t1
where ct857.cm3358 = t1.c_obj_id
Это абсолютно то же самое
20 июл 09, 13:55    [7435781]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
Joy Yen
Member

Откуда:
Сообщений: 15
а тогда это как отпимизировать:

delete from at855_3408 where cm3408 in (select c_obj_id from t1)
20 июл 09, 13:58    [7435811]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
Glory
Member

Откуда:
Сообщений: 104760
Joy Yen
а тогда это как отпимизировать:

delete from at855_3408 where cm3408 in (select c_obj_id from t1)

Вы не поверите, но в delete тоже можно использовать join-ы
20 июл 09, 14:00    [7435823]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
Joy Yen
Member

Откуда:
Сообщений: 15
Glory
Joy Yen
а тогда это как отпимизировать:

delete from at855_3408 where cm3408 in (select c_obj_id from t1)

Вы не поверите, но в delete тоже можно использовать join-ы


а можно пример?
20 июл 09, 14:02    [7435839]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
йцу1
Guest
iap
Это абсолютно то же самое


это понятно...
только читается лучше, хотя это дело привычки...
20 июл 09, 14:03    [7435845]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36800
Joy Yen
а можно пример?
В хелпе полно разных примеров. Уже давно надо было туда заглянуть.
20 июл 09, 14:03    [7435846]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
Glory
ветерочек


PS. вобще-то in оптимизатор превращает в or ....

Какой OR, там ведь подзапрос. 670 000 OR-ов что ли ?


если их через запятую в in указать то да
, если подзапрос то как оптимизатор захочет...
20 июл 09, 15:12    [7436270]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
Glory
Member

Откуда:
Сообщений: 104760
ветерочек
Glory
ветерочек


PS. вобще-то in оптимизатор превращает в or ....

Какой OR, там ведь подзапрос. 670 000 OR-ов что ли ?


если их через запятую в in указать то да
, если подзапрос то как оптимизатор захочет...

Не придумывайте то, чего нет.
Для того, чтобы преобразовать подзапрос в OR-ы, серверу придется извлечь все значения подзапроса при составлении плана. Чего он никогда делать не будет.
20 июл 09, 15:25    [7436328]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация простых, но тяжелых для сервера запросов  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
Glory
ветерочек
Glory
ветерочек


PS. вобще-то in оптимизатор превращает в or ....

Какой OR, там ведь подзапрос. 670 000 OR-ов что ли ?


если их через запятую в in указать то да
, если подзапрос то как оптимизатор захочет...

Не придумывайте то, чего нет.
Для того, чтобы преобразовать подзапрос в OR-ы, серверу придется извлечь все значения подзапроса при составлении плана. Чего он никогда делать не будет.


да не прав
в простом подзапросе он преобразует в in в Right Semi Join
как-то не приходилось использовать in(select ...)
хотя совет вроде помог
20 июл 09, 15:58    [7436501]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить