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

Откуда:
Сообщений: 208
Привет, есть запрос:
select * from
(
select * from Table1 as t1, Table2 as t2
where t1.Code=t2.Code and (t2.TDate between @DateBeg and @DateEnd)
) as t
left outer join Table3 as t3on ((t.TDate between 
cast(convert(varchar(20),t3.DateBeg,102) as datetime) and 
cast(convert(varchar(20),t3.DateEnd,102)+' 23:59:59' as datetime)) and 
(t3.RCOD2 = 'code2') AND (t3.RCOD1 = 'code1'))

он выполняется не быстро из-за конверирования дат. У DateBeg время в базе 0:00:00 и у DateEnd время - 0:00:00. Если одна и та же дата, например 22.05.2005, а t2.TDate="22.05.2005 14:35:45" уже не попадает в интервал и приходится их преобразовывать вот таким способом. Может есть другой более быстрый?
22 июн 05, 15:43    [1640801]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Matvey B
Member

Откуда:
Сообщений: 69
а в каком виде приходят @DateBeg and @DateEnd?
22 июн 05, 15:49    [1640837]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
а индексы у вас есть какие
22 июн 05, 15:52    [1640854]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Matvey B
Member

Откуда:
Сообщений: 69
t.TDate between 
cast(convert(varchar(20),t3.DateBeg,102) as datetime) and 
cast(convert(varchar(20),t3.DateEnd,102)+' 23:59:59' as datetime)

и если можно подробнее смысл этой проверки
22 июн 05, 15:55    [1640894]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Bagin
Member

Откуда:
Сообщений: 838
возможно быстрее будет:
CAST (DATEDIFF(dd, 0, @DateB) AS DATETIME)
22 июн 05, 15:56    [1640904]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Matvey B
Member

Откуда:
Сообщений: 69
если бы был INNER JOIN
тогда понятно, а так?
22 июн 05, 15:58    [1640914]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
select * 
from Table1 as t1
join Table2 as t2 on (t1.Code=t2.Code) 
left outer join Table3 as t3 on ((cast(cast(t2.Date as float)as integer) between
                                  cast(cast(t3.DateBeg as float)as integer)and
                                  cast(cast(t3.DateEnd as float)as integer)) 
                                 and(t3.RCOD2 = 'code2') 
                                 and(t3.RCOD1 = 'code1'))
where t2.TDate between @DateBeg and @DateEnd
22 июн 05, 16:03    [1640956]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Matvey B
Member

Откуда:
Сообщений: 69
select * from Table1 as t1 INNER JOIN Table2 as t2
ON t1.Code=t2.Code and (t2.TDate between @DateBeg and @DateEnd)
LEFT OUTER JOIN Table3 as t3 ON 
t3.DateBeg < t1.TDate AND t1.TDate < DATEADD(dd,1,t3.DateEnd) AND t3.RCOD2 = 'code2' AND t3.RCOD1 = 'code1'
22 июн 05, 16:07    [1640997]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Kulavert
Member

Откуда:
Сообщений: 341
2 DimonNew:
А Вы уверены, что замедление из-за конвертации дат? Но это другой вопрос... Предлагаю убрать конвертацию дат следующим образом:
select * from
(
select * from Table1 as t1, Table2 as t2
where t1.Code=t2.Code and (t2.TDate between @DateBeg and @DateEnd)
) as t
left outer join Table3 as t3on (t.TDate>=t3.DateBeg and t.TDate<t3.DateEnd+1
  and t3.RCOD2 = 'code2' AND t3.RCOD1 = 'code1')
Здесь "t.TDate>=t3.DateBeg and t.TDate<t3.DateEnd+1" - замена ваших издевательств над Convert-ами :)
Выполнение условия, для которого вы написали "... 23:59:59..." сохранено, посмотрите сами.
22 июн 05, 16:09    [1641017]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Kulavert
Member

Откуда:
Сообщений: 341
Прошу прощения за "t3.DateEnd+1" - я имел ввиду то же, что Matvey B: "DATEADD(dd,1,t3.DateEnd)"
22 июн 05, 16:11    [1641029]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
DimonNew
Member

Откуда:
Сообщений: 208
Matvey B - смысл - например, в БД храниться DateBeg="2005-05-05 0:00:00" DateEnd="2005-05-05 0:00:00", если прверять between дату "2005-05-05 20:05:30", то она не попадает.

Smirnov Anton - индексы толко по ключевым полям, попробовал Index Tuning Wizard, он проставил индексы, но это не помагло.
22 июн 05, 16:14    [1641049]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Kulavert
Member

Откуда:
Сообщений: 341
2 Matvey B:
Только надо написать "t3.DateBeg <= t1.TDate"
22 июн 05, 16:14    [1641055]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Matvey B
Member

Откуда:
Сообщений: 69
согласен
22 июн 05, 16:20    [1641104]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
DimonNew
Member

Откуда:
Сообщений: 208
Спасибо всем за помощь!!!
TDate>=t3.DateBeg and t.TDate<DATEADD(dd,1,t3.DateEnd)
повысил быстродействие намного,
НО
cast(cast(t2.Date as float)as integer) between
cast(cast(t3.DateBeg as float)as integer)and
cast(cast(t3.DateEnd as float)as integer)) 
еще быстрее!
22 июн 05, 16:42    [1641255]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Matvey B
Member

Откуда:
Сообщений: 69
еще быстрее!


сколько времени прошло между двумя тестами?
22 июн 05, 16:46    [1641277]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
DimonNew
Member

Откуда:
Сообщений: 208
Я их почти одновременно запускал. Несколько раз тестировал - в секундах одно и тоже время в разных тестах.
Мой - 1 мин 11 сек
DATEADD - 18 сек
cast(cast(... as float)as integer - 7 сек

Я не в обиду Вам сказал (мой то запрос больше минуты выполняется), просто для информации, может еще кому поможет, мне очень помогло. Еще раз спасибо.

Может есть где-нибудь информация по оптимизации запросов? Или до этого доходят опытным путем?
22 июн 05, 17:00    [1641355]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Kulavert
Member

Откуда:
Сообщений: 341
Движок SQL генерит одинаковый код что для сравнения datetime, что для float, а если разница и есть то ооочень маленькая. Скорее всего "быстрее" получилось из-за кэширования пред. данных.
22 июн 05, 17:00    [1641359]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Matvey B
Member

Откуда:
Сообщений: 69
и я о том же. достоверный тест если разница между запусками >10 мин
22 июн 05, 17:02    [1641367]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Kulavert
Member

Откуда:
Сообщений: 341
Раз так, то значит я ошибаюсь по поводу движка...
22 июн 05, 17:02    [1641368]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
DimonNew
Member

Откуда:
Сообщений: 208
Я их почти одновременно запускал. Несколько раз тестировал - в секундах одно и тоже время в разных тестах.
Мой - 1 мин 11 сек
DATEADD - 18 сек
cast(cast(... as float)as integer - 7 сек

Я не в обиду Вам сказал (мой то запрос больше минуты выполняется), просто для информации, может еще кому поможет, мне очень помогло. Еще раз спасибо.

Может есть где-нибудь информация по оптимизации запросов? Или до этого доходят опытным путем?
22 июн 05, 17:04    [1641377]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Matvey B
Member

Откуда:
Сообщений: 69
2 LexusR

и еще вопрос почему

cast(cast(t2.Date as float)as integer) 

а не

cast(t2.Date as integer) 
???
22 июн 05, 17:04    [1641379]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Matvey B
Member

Откуда:
Сообщений: 69
по оптимизации запросов

Настройка SQL. Для профессионалов

рекомендую
22 июн 05, 17:08    [1641402]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
ChA
Member

Откуда: Москва
Сообщений: 11128
Matvey B
почему
cast(cast(t2.Date as float)as integer) 
а не
cast(t2.Date as integer) 
???
DECLARE @d datetime
SET @d = '2005-01-01 00:01'
SELECT cast(@d as float), cast(@d as integer)
SET @d = '2005-01-01 23:59'
SELECT cast(@d as float), cast(@d as integer)
22 июн 05, 17:10    [1641412]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Matvey B
Member

Откуда:
Сообщений: 69
DECLARE @d datetime
SET @d = '2005-01-01 00:01'
SELECT cast(@d as float), cast(@d as integer), cast(cast(@d as float) as integer)
SET @d = '2005-01-01 23:59'
SELECT cast(@d as float), cast(@d as integer), cast(cast(@d as float) as integer)
22 июн 05, 17:13    [1641437]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с оптимизацией запроса  [new]
Matvey B
Member

Откуда:
Сообщений: 69


К сообщению приложен файл. Размер - 0Kb
22 июн 05, 17:17    [1641457]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить