Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 ускорить выполнение запроса  [new]
ikar999
Guest
В тестовом задании был такой вот вопрос:
Исходные данные:
•	таблица tblT, которая хранит записи по продажам производимым в супермаркете, 
a.	RowID – внутренний уникальный идентификатор; 
b.	CheckDate – дата продажи товара; 
c.	SSN – внутренний номер проданного товара; 
d.	val – сумма денег, вырученая за продажу товара; 
e.	CheckDateID – числовое представление даты (cast(convert(varchar, CheckDate,112) as int)).
Скрипт для создания таблицы приведен ниже (рис.2). Данная таблица содержит порядка 30000000
записей. Для перевода значений поля val в другую валюту использовался скрипт (рис.3.)
Необходимо ускорить выполнение этого запроса, путем изменения скрипта.

 	CREATE TABLE tblT (
[RowID] [int] IDENTITY(1,1) NOT NULL,
[CheckDateID] int not null,
[SSN] varchar (10),
[CheckDate] datetime,
[val] money
CONSTRAINT [PK_tblT] PRIMARY KEY CLUSTERED 
[CheckDateID] ASC,
[RowID] ASC
)
)
Рисунок 2

Declare @RowMin [int], 
		@RowMax [int], 
		@Portion [int], 
		@CurMin [int], 
		@CurMax [int],
		@strMessage varchar (100)
set @RowMin = (Select min(RowID) from tblT )
set @RowMax = (Select max(RowID) from tblT  )
set @Portion = 350000
set @CurMin = @RowMin
set @CurMax = @CurMin + @Portion
While @CurMax <> @CurMin
Begin 
Update A
set val = val*8,3,
from tblT  A 
where A.RowID Between  @CurMin and @CurMax
set @CurMin = @CurMax
set @CurMax = Case When (@CurMax+@Portion)<@RowMax Then @CurMax+@Portion Else @RowMax End
End

Рисунок 3
Я на него ответил так
CREATE TABLE tblT (
     [RowID] [int] IDENTITY(1,1) NOT NULL,
     [CheckDateID] int not null,
     [SSN] varchar (10),
     [CheckDate] datetime,
     [val] money
     CONSTRAINT [PK_tblT] PRIMARY KEY CLUSTERED [CheckDateID] ASC,[RowID] ASC)
   )
      необходимо именить порядок чередования полей индекса 
      с " PRIMARY KEY CLUSTERED([CheckDateID] ASC, [RowID] ASC)"
      на " PRIMARY KEY CLUSTERED([RowID] ASC, [CheckDateID] ASC)"
У меня вопрос к специалистам.
Я ответил на вопрос не верно? Если, да то подскажите в чем я не прав, чтоб понять и работать
над ошибками.
Мне недали положительного ответа по результатам тестового задания и это ни повлияет на тестовое задание.
Я пробовал не меняя условие создания таблицы много разных вариаций запросов и влучшем случае получал экономию времени около 10сек.
Всем спасибо.
22 ноя 09, 17:03    [7961167]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
А как это понимать?
set val = val*8,3,
???
IMHO запрос неправильный, ускорять нечего!
22 ноя 09, 17:24    [7961208]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
aleks2
Guest
Я бы переименовал поле
val в xer
и добавил бы вычисляемое поле
val as xer*8.3
.
22 ноя 09, 17:25    [7961209]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
ikar999
Guest
iap,

это у них опечатка set val = val*8.3
22 ноя 09, 17:27    [7961211]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
aleks2
Guest
Но тестирующие, скорее всего, ожидали
переделки под обновление в порядке существующего кластерного индекса.
Ибо переплющивание индекса - это еще хуже.
22 ноя 09, 17:29    [7961216]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
ikar999
Guest
aleks2
Я бы переименовал поле
val в xer
и добавил бы вычисляемое поле
val as xer*8.3
.

а это ускорит?
22 ноя 09, 17:29    [7961217]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
aleks2
Guest
ikar999
aleks2
Я бы переименовал поле
val в xer
и добавил бы вычисляемое поле
val as xer*8.3
.

а это ускорит?


А ты проверь... хе-хе.
22 ноя 09, 17:31    [7961221]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
ikar999
Guest
aleks2
ikar999
aleks2
Я бы переименовал поле
val в xer
и добавил бы вычисляемое поле
val as xer*8.3
.

а это ускорит?


А ты проверь... хе-хе.

как раз сейчас это и собираюсь сделать
22 ноя 09, 17:33    [7961222]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Я такое задание недавно видел. Не могу только вспомнить где.

-------------------------
There’s no silver bullet!
22 ноя 09, 17:39    [7961233]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Мне непонятно, зачем
set @CurMax = Case When (@CurMax+@Portion)<@RowMax Then @CurMax+@Portion Else @RowMax End
Можно короче:
declare @RowMin [int], 
		@Portion [int], 
		@CurMin [int];
select @RowMin = min(RowID) from tblT;
if @RowMin is not null
begin
 set @Portion = 350000;
 set @CurMin = @RowMin-@Portion-1;
 while @ROWCOUNT>0
 begin 
  set @CurMin=@CurMin+@Portion+1;
  update tblT
  set val=val*8.3
  where RowID between @CurMin and @CurMin+@Portion;
 end;
end;
22 ноя 09, 18:02    [7961269]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
ikar999
Guest
aleks2,

Да, но у нас просто добавляется еще один столбец(вычисляемый), а по условию требуется обновить существующее поле.
Есть еще какие - нибудь предложения?
22 ноя 09, 18:04    [7961272]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
ikar999
Guest
iap,

но это же, я так думаю, на скорость выполнения запроса существенно не повлияет, но всеравно попробую
22 ноя 09, 18:09    [7961281]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
ikar999
iap,

но это же, я так думаю, на скорость выполнения запроса существенно не повлияет, но всеравно попробую
А где сказано про "существенно"?
22 ноя 09, 18:19    [7961299]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
ikar999
Guest
iap
ikar999
iap,

но это же, я так думаю, на скорость выполнения запроса существенно не повлияет, но всеравно попробую
А где сказано про "существенно"?

в условии задания
22 ноя 09, 18:23    [7961312]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
aleks2
Guest
ikar999
aleks2,

Да, но у нас просто добавляется еще один столбец(вычисляемый), а по условию требуется обновить существующее поле.
Есть еще какие - нибудь предложения?


Хе-хе... вы условия то перечитайте:

>>Необходимо ускорить выполнение этого запроса
>>Для перевода значений поля val в другую валюту

а уж потом критикуйте... революционное решение по переводу поля val во все БУДУЩИЕ валюты в кратчайшие строки.

Однако повторюсь

aleks2
Но тестирующие, скорее всего, ожидали
переделки под обновление в порядке существующего кластерного индекса.
Ибо переплющивание индекса - это еще хуже.
22 ноя 09, 18:26    [7961315]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
ikar999
Guest
aleks2,

ну тогда наверно само задание не корректно составлено ибо не понятно чего требуется, а из изложенного самый очевидный вариант при создании таблицы именно поменять местами столбцы кластера.
22 ноя 09, 18:31    [7961324]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
ikar999
Guest
и при этом ускоряется этот же запрос в трое.
22 ноя 09, 18:35    [7961328]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
green_2005
Guest
ребят, а цикл-то зачем?
Он все равно по всем записям проходит по-моему.
мот все проще:
  Update A
  set val = val*8.3
  from tblT  A
22 ноя 09, 18:38    [7961332]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
aleks2
Guest
ikar999
и при этом ускоряется этот же запрос в трое.


Глюпый,
1. время переиндексации изволь добавить ко времени выполнения запроса.
2. все прочие запросы системы встанут "раком" - т.е. будут безбожно тормозить.
22 ноя 09, 18:39    [7961335]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
aleks2
Guest
green_2005
ребят, а цикл-то зачем?
Он все равно по всем записям проходит по-моему.
мот все проще:
  Update A
  set val = val*8.3
  from tblT  A


Не сканает - транзакция слишком большая - лог начнет расти, шо медленно...

НО! мысль не остановить: тупо коммитить транзакцию - тоже полезное усовершенствованиеЮ особливо если SET IMPLICIT_TRANSACTION ON... ну или еще проще SET IMPLICIT_TRANSACTION OFF.
22 ноя 09, 18:43    [7961344]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
ikar999
Guest
green_2005
ребят, а цикл-то зачем?
Он все равно по всем записям проходит по-моему.
мот все проще:
  Update A
  set val = val*8.3
  from tblT  A

set @Portion = 350000
set @CurMin = @RowMin
set @CurMax = @CurMin + @Portion
цикл то
от 0 до 350000
22 ноя 09, 18:43    [7961346]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
ikar999
Guest
aleks2
ikar999
и при этом ускоряется этот же запрос в трое.


Глюпый,
1. время переиндексации изволь добавить ко времени выполнения запроса.
2. все прочие запросы системы встанут "раком" - т.е. будут безбожно тормозить.

Я писал
автор
самый очевидный вариант при создании таблицы
22 ноя 09, 18:45    [7961349]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
green_2005
Guest
ikar999,
тело цикла :
While @CurMax <> @CurMin
..
  set @CurMin = @CurMax
  set @CurMax = Case When (@CurMax+@Portion)<@RowMax Then @CurMax+@Portion Else @RowMax End
22 ноя 09, 18:48    [7961353]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
aleks2
Guest
ikar999
aleks2
ikar999
и при этом ускоряется этот же запрос в трое.


Глюпый,
1. время переиндексации изволь добавить ко времени выполнения запроса.
2. все прочие запросы системы встанут "раком" - т.е. будут безбожно тормозить.

Я писал
автор
самый очевидный вариант при создании таблицы


Они правильно тебя отшили. Ибо ты НИЧЕГО не понял.
22 ноя 09, 18:48    [7961354]     Ответить | Цитировать Сообщить модератору
 Re: ускорить выполнение запроса  [new]
ikar999
Guest
green_2005
ikar999,
тело цикла :
While @CurMax <> @CurMin
..
  set @CurMin = @CurMax
  set @CurMax = Case When (@CurMax+@Portion)<@RowMax Then @CurMax+@Portion Else @RowMax End

а как же условие
where A.RowID Between  @CurMin and @CurMax
22 ноя 09, 18:53    [7961365]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить