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

Откуда:
Сообщений: 660
привет
есть таблица
в ней 500 млн записей
есть ключ по полю t (int )
запрос -
select t from table where t<>0 выполняется меньше секунды - возвращает 300 000 элементов
а вот запрос
update table set t=0 where t<>0 - выполняется около часа
что то мне подсказывает что так не должно быть
13 фев 12, 20:44    [12084748]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Alexander_fx
что то мне подсказывает что так не должно быть


да ладно?? поменять 300 000 элементов должно быть так же быстро как и прочитать их?
13 фев 12, 20:47    [12084754]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Alexander_fx
Member

Откуда:
Сообщений: 660
но не на настолько дольше вроде как
ну или перефразирую вопрос - если базой пользуюсь только я то могу ли я как то перевести базу в какой то режим или пометить запрос как то чтобы он мог выполниться быстрее
13 фев 12, 20:51    [12084765]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
ravt
Member

Откуда: Украина
Сообщений: 233
Alexander_fx
меньше секунды - возвращает 300 000 элементов


Вызывает не доверие.
куда возвращает?

Вы хотите сказать что меньше чем за секунду вам напечатало 300 000 записей?

или вам просто сообщило что таких записей 300 000.
13 фев 12, 20:55    [12084781]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Alexander_fx
но не на настолько дольше вроде как
ну или перефразирую вопрос - если базой пользуюсь только я то могу ли я как то перевести базу в какой то режим или пометить запрос как то чтобы он мог выполниться быстрее
Режима "работать быстро, а не как обычно" нет, как бы вам этого не хотелось. Придется выяснять, чего не хватает вашему запросу.

Начинать можно с анализа плана выполнения.
13 фев 12, 20:55    [12084782]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Crimean
Member

Откуда:
Сообщений: 13147
небось журнал растет :) "кстати"
13 фев 12, 22:24    [12085222]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Alexander_fx
Member

Откуда:
Сообщений: 660
order log - simple
14 фев 12, 12:05    [12087443]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
iljy
Member

Откуда:
Сообщений: 8711
Alexander_fx
order log - simple

ну и что? Вы понимаете разницу между полной и простой моделью восстановления?
14 фев 12, 12:07    [12087467]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
Alexander_fx,
А табличка то какая, не простая наверно?

индексы же есть наверно и сколько, а если еще констрайнты с триггерами добавить, то еще больше может идти обновление.
14 фев 12, 12:18    [12087560]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Gwa
Guest
Alexander_fx,
что это за ключ такой, что его можно взять и обнулить update-ом ?
14 фев 12, 12:24    [12087614]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Crimean
Member

Откуда:
Сообщений: 13147
примерчик сделайте, да. как-то так:

set nocount on
go

use master
go

create database a
go

use a
go

create table a ( id int )
go

create index ia_1 on a ( id )
go

declare @i int; set @i = 0

begin tran

while @i < 300000 begin

set @i = @i + 1
insert into a ( id ) select @i
if @i % 50000 = 0 begin commit tran; begin tran; end

end

commit tran
go

select count(*) from a
go

exec sp_helpdb a
go

select getdate() as start
go

update a set id = -id
go

select getdate() as done
go

exec sp_helpdb a
go

select getdate() as start_2
go

update a set id = -id
go

select getdate() as done_2
go

exec sp_helpdb a
go

drop table a
go

use master
go

drop database a
go


обновление данных занимает в среднем 10 секунд. вычитка - значительно меньше
14 фев 12, 12:33    [12087682]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Alexander_fx
Member

Откуда:
Сообщений: 660
[b][/b]Slava_Nik,

есть 7 индексов по полям
триггеров нет



просто индекс на 500 000 000 записей типа int это меньше 2 гигов
и час его мусолить - долго как то
14 фев 12, 12:35    [12087705]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Alexander_fx
просто индекс на 500 000 000 записей типа int это меньше 2 гигов
и час его мусолить - долго как то
Вы план и структуру таблицы покажете? Или так и дальше будете причитать "че эти записи так долго мусолить-то"?
14 фев 12, 12:36    [12087714]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ну и потом, вы смотрели в каком состоянии соединение, которые выполняет апдейт? Если вам кто на 10 часов залочит одну запись, так оно и 10 часов апдетиться будет.
14 фев 12, 12:38    [12087720]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Alexander_fx
Member

Откуда:
Сообщений: 660
Гавриленко Сергей Алексеевич
Alexander_fx
просто индекс на 500 000 000 записей типа int это меньше 2 гигов
и час его мусолить - долго как то
Вы план и структуру таблицы покажете? Или так и дальше будете причитать "че эти записи так долго мусолить-то"?



а есть разница как построена таблица если я работаю только с одним полем?
и такой вопрос - можно ли как то получить план не выполняя запрос - просто реально время измеряется часами
14 фев 12, 12:40    [12087732]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Alexander_fx
Member

Откуда:
Сообщений: 660
Гавриленко Сергей Алексеевич
Ну и потом, вы смотрели в каком состоянии соединение, которые выполняет апдейт? Если вам кто на 10 часов залочит одну запись, так оно и 10 часов апдетиться будет.


базой пользуюсь только я и другие запросы не выполняются
ну и по сути не могу выполняться так как на время выполнения этих update база умирает для других запросов
14 фев 12, 12:41    [12087743]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Alexander_fx
а есть разница как построена таблица если я работаю только с одним полем?
Ясен пень, есть. Может у вас там 250 форинкеев или триггеров.
Alexander_fx
и такой вопрос - можно ли как то получить план не выполняя запрос - просто реально время измеряется часами
Предварительные покажите для селекта и апдейта. И текст полностью, если он отличается от приведенного вами.
14 фев 12, 12:43    [12087754]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Alexander_fx,

Если вы обновляете ключ индекса, при этом делая по нему выборку, скорее всего вы получаете в плане table spool, для защиты от halloween проблемы. Может быть построение этого спула и занимает столько времени? В любом случае, некорректно сравнивать простой селект с обновлением, вы план выложите, должно стать понятнее.
14 фев 12, 12:48    [12087795]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Alexander_fx
Member

Откуда:
Сообщений: 660
Гавриленко Сергей Алексеевич
Alexander_fx
а есть разница как построена таблица если я работаю только с одним полем?
Ясен пень, есть. Может у вас там 250 форинкеев или триггеров.
Alexander_fx
и такой вопрос - можно ли как то получить план не выполняя запрос - просто реально время измеряется часами
Предварительные покажите для селекта и апдейта. И текст полностью, если он отличается от приведенного вами.



30 полей типов int , date , varchar(10)
10 индексов по 10 полям
нет ниодного триггера

запрос
select count(t) from table where t<>0 выполняется 1 секунду
запрос
update table set t=0 where t<>0 выполняется больше часа

в таблице около 500 000 000 записей
14 фев 12, 12:56    [12087881]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Alexander_fx
30 полей типов int , date , varchar(10)
10 индексов по 10 полям
нет ниодного триггера
Т.е. скрипт показать так и не желаете?
Alexander_fx
запрос
select count(t) from table where t<>0 выполняется 1 секунду
запрос
update table set t=0 where t<>0 выполняется больше часа

в таблице около 500 000 000 записей
Это план выполнения?

Партизанить еще не надоело?
14 фев 12, 13:00    [12087915]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Alexander_fx,

Вы план покажете? spool есть аль нет?
Ну и вообще, что там происходит...
14 фев 12, 13:01    [12087928]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
Гавриленко Сергей Алексеевич
Alexander_fx
но не на настолько дольше вроде как
ну или перефразирую вопрос - если базой пользуюсь только я то могу ли я как то перевести базу в какой то режим или пометить запрос как то чтобы он мог выполниться быстрее
Режима "работать быстро, а не как обычно" нет, как бы вам этого не хотелось. Придется выяснять, чего не хватает вашему запросу.

Начинать можно с анализа плана выполнения.


Как? А SET SLOW_EXECUTION OFF?



(C) Glory

14 фев 12, 13:58    [12088495]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
Alexander_fx
[b][/b]Slava_Nik,

есть 7 индексов по полям
триггеров нет



просто индекс на 500 000 000 записей типа int это меньше 2 гигов
и час его мусолить - долго как то


а как на счет timestamp?
14 фев 12, 14:00    [12088516]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а о чем еще спор? я же пример давал
в нем вычитка менее 1 секунды с получением данных на клиенте, обновление - 10 секунд
затраты на вычитку для этого примера 100 проца и 700 ридсов по профайлеру
а для update затраты 6500 проца, 4 ляма ридсов и 11500 райтсов - надо индексы перестроить и т.д.
или кто-то надеется закон сохранения обойти?
обойти (по времени) можно удалением или отключением индексов на время выполнения update - тогда "всего" 900 ридсов, полляма ридсов и 4500 райтсов + на построение индекса после 300 проца 3000 ридсов и 700 райтсов
простое изменение 12 секунд, с перестроением - 1.7 + 0.3 = 2 секунды, да, работа с индексами очень недешевая при том что у меня табличка должна помещаться в озу целиком
14 фев 12, 14:02    [12088546]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите - update в разы долше select  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Crimean
а о чем еще спор? я же пример давал
в нем вычитка менее 1 секунды с получением данных на клиенте, обновление - 10 секунд
затраты на вычитку для этого примера 100 проца и 700 ридсов по профайлеру
а для update затраты 6500 проца, 4 ляма ридсов и 11500 райтсов - надо индексы перестроить и т.д.
или кто-то надеется закон сохранения обойти?
обойти (по времени) можно удалением или отключением индексов на время выполнения update - тогда "всего" 900 ридсов, полляма ридсов и 4500 райтсов + на построение индекса после 300 проца 3000 ридсов и 700 райтсов
простое изменение 12 секунд, с перестроением - 1.7 + 0.3 = 2 секунды, да, работа с индексами очень недешевая при том что у меня табличка должна помещаться в озу целиком
Отношения времени чтения к записи "1 : 10" в вашем примере, и "1 : 3600" у автора - немножко разные вещи, согласитесь?

Сообщение было отредактировано: 14 фев 12, 14:15
14 фев 12, 14:14    [12088706]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить