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

Откуда:
Сообщений: 23
Объясните мне, что я делаю не так.
Есть такой запрос, который выполняется около 1-2 секунды по времени:
select top 1000 kod_s, kname, nn, operations.kod_b, sum(operations.summa)/100 as summa
from [ndb].[dbo].klients, [ndb].[dbo].operations
WHERE 
(
--Фирма ООО Берег
   CAST(kod_s as varchar) like ('____5%')
or CAST(kod_s as varchar) like ('____8%')
or CAST(kod_s as varchar) like ('____11%')
or CAST(kod_s as varchar) like ('____2%')
or CAST(kod_s as varchar) like ('____12%')
or CAST(kod_s as varchar) like ('____6%')
or CAST(kod_s as varchar) like ('____4%')
or CAST(kod_s as varchar) like ('____3%')
--ООО Стройпром
or CAST(kod_s as varchar) like ('____58%')
or CAST(kod_s as varchar) like ('____96%')
or CAST(kod_s as varchar) like ('____87%')
or CAST(kod_s as varchar) like ('____88%')
)
--and not nn in (select vipklient.nn from [ndb].[dbo].vipklient)
and LEN(kod_s) = 11
and not nn like '%-%'
and operations.tip = 0
and operations.kod_b = klients.kod_s

group by operations.kod_b, klients.kod_s, klients.kname, klients.nn
order by summa DESC


если убрать в конце
order by summa DESC
то выполняется полторы минуты
а если раскомментировать строку
--and not nn in (select vipklient.nn from [ndb].[dbo].vipklient)

то 2.5 минуты

а мне нужен как раз с этой строкой
16 июл 13, 09:48    [14571176]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
Anticler
Member

Откуда:
Сообщений: 23
таблица operations = 400 000 строк
klients = 6 000 строк
vipklient = 4 500 строк

Athlon64 4400+(2 x 2310МГц)/4Гб
16 июл 13, 09:55    [14571205]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
gang
Member

Откуда:
Сообщений: 1394
Anticler,

Для сравнения выполнения различных запросов используют их планы. Смотрите Ваши планы, индексы. Магического там ничего нет, инфа 100%.
16 июл 13, 10:00    [14571249]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Зачем там CAST, если без проблем отрабатывает LEN? Ведь получается, kod_s и так varchar(...)
Зачем там LEN, если можно доработать LIKE?
Хорошо бы завязать с запятой во FROMе, но это в данном случае косметика.
operations.kod_b = klients.kod_s - так зачем оба поля в SELECTе и в GROUP BY??
16 июл 13, 10:16    [14571361]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
Anticler
Member

Откуда:
Сообщений: 23
iap,
iap
Зачем там CAST, если без проблем отрабатывает LEN?

каким образом, что-то я не пойму?
iap
Зачем там LEN, если можно доработать LIKE?

да можно, но так меньше символов в запросе и мне понятнее
iap
Хорошо бы завязать с запятой во FROMе, но это в данном случае косметика.

что вы имеете ввиду?
iap
operations.kod_b = klients.kod_s - так зачем оба поля в SELECTе и в GROUP BY??

да, тут я не досмотрел

gang
Для сравнения выполнения различных запросов используют их планы. Смотрите Ваши планы, индексы. Магического там ничего нет, инфа 100%.

да смотрю, только понять трудно, ввиду отсутствия знаний о внутренних механизмах сервера.
Пока, что увидел различия в том при долгом запросе таблицы стрелками соединяются в блок "Вложенные циклы (inner join)",
а в быстром в блок "Hash match (inner join)"
16 июл 13, 10:59    [14571770]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
and not nn in (select vipklient.nn from [ndb].[dbo].vipklient)
лучше переписать через not exists:
and not exists (select * from [ndb].[dbo].vipklient where vipklient.nn=klients.nn)
16 июл 13, 11:01    [14571794]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Anticler
iap,
iap
Зачем там CAST, если без проблем отрабатывает LEN?

каким образом, что-то я не пойму?
Убрать слово CAST каким образом?
Клавишей Delete? Или BackSpace?
16 июл 13, 11:07    [14571838]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
Anticler
Member

Откуда:
Сообщений: 23
Cygapb-007
and not nn in (select vipklient.nn from [ndb].[dbo].vipklient)
лучше переписать через not exists:
and not exists (select * from [ndb].[dbo].vipklient where vipklient.nn=klients.nn)

Это ничего не дало по времени, скорость выполнения одна и та же
16 июл 13, 11:30    [14571999]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Cygapb-007
vipklient.nn
Когда появится хоть один vipklient.nn IS NULL,
это будет очень заметно в NOT IN!
16 июл 13, 11:36    [14572038]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
весь ваш OR запросто складываеться в 1 иструкцию ,если я правильно понял что вам надо

declare @t table (n nvarchar(20))
insert into @t(n)
values ('11115'),('11118'),('1111111'),('111112'),('1111112'),('11116'),('11117'),('11113')
select *
from @t
where n like '____[1234568]%' 
16 июл 13, 11:42    [14572084]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Maxx
весь ваш OR запросто складываеться в 1 иструкцию ,если я правильно понял что вам надо

declare @t table (n nvarchar(20))
insert into @t(n)
values ('11115'),('11118'),('1111111'),('111112'),('1111112'),('11116'),('11117'),('11113')
select *
from @t
where n like '____[1234568]%' 
Длина требуется 11
where n like '____[1234568]______'
Но там вроде посложней условие немного.
Например, после 1 требуются только 1 или 2
16 июл 13, 11:45    [14572120]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
Anticler
Member

Откуда:
Сообщений: 23
iap
Anticler
iap,
пропущено...

каким образом, что-то я не пойму?
Убрать слово CAST каким образом?
Клавишей Delete? Или BackSpace?

Это я изначально для верности написал. А переспрашивал потому, что изначально не понял вашего вопроса.
16 июл 13, 11:48    [14572137]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap,

ну вяко бывает + у него возможно перессечение кодо 2х фирм...
бо
CAST(kod_s as varchar) like ('____5%')
покрывает
--ООО Стройпром
or CAST(kod_s as varchar) like ('____58%')
НО нам то об етом ничего не говорят ,да и изначальный лайк не учитывает етого :)
16 июл 13, 11:49    [14572145]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
Anticler
Member

Откуда:
Сообщений: 23
Maxx,

Спасибо, заметил ошибку. На самом деле двузначное значение должно быть.
16 июл 13, 11:57    [14572222]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
Anticler
Member

Откуда:
Сообщений: 23
Вообщем решил пробовал разные модификации этого запроса.
Получилось так, что с вложенным запросом работает еще более менее адекватно 13-16 секунд, хотя причину назвать не могу.

select kname, kod_b, nn, sum(operations.summa)/100 as summa from [ndb].[dbo].operations, [ndb].[dbo].klients
where CAST(kod_b as varchar) in (
	select kod_s
	from [ndb].[dbo].klients
	WHERE 
	(
	--Фирма ООО Берег
	   kod_s like ('____51%')
	or kod_s like ('____84%')
	or kod_s like ('____11%')
	or kod_s like ('____20%')
	or kod_s like ('____12%')
	or kod_s like ('____61%')
	or kod_s like ('____49%')
	or kod_s like ('____35%')
	--ООО Стройпром
	or kod_s like ('____58%')
	or kod_s like ('____96%')
	or kod_s like ('____87%')
	or kod_s like ('____88%')
	)
	--and not nn in (select vipclient.nn from [ndb].[dbo].vipclient)
	and not exists (select *  from [ndb].[dbo].vipclient where vipclient.nn = klients.nn)
	and LEN(kod_s) = 16
	and not nn like '%-%'
)
and operations.tip = 0
and kod_s =  CAST(kod_b as varchar)

group by operations.kod_b, klients.kname, klients.nn
order by summa DESC
16 июл 13, 12:02    [14572248]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
сокращая OR: kod_s like ('____5[18]%') и т.п.
16 июл 13, 12:08    [14572304]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Cygapb-007
сокращая OR: kod_s like ('____5[18]%') и т.п.
Можно ещё здесь же учесть условие для длины.
Кстати! Она уже выросла до 16!
Запасаемся попкорном...
16 июл 13, 12:11    [14572321]     Ответить | Цитировать Сообщить модератору
 Re: ORDER влияет на время выполнения запроса  [new]
Anticler
Member

Откуда:
Сообщений: 23
iap
Можно ещё здесь же учесть условие для длины.
Кстати! Она уже выросла до 16!
Запасаемся попкорном...

опечатался должно быть 11
16 июл 13, 12:18    [14572375]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить