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

Вот это сделает фсе ваши опусы:

declare @t table (uid uniqueidentifier primary key clustered);

insert @t
  select uid from cash_voucher_title 
    where dt BETWEEN '04/04/2013 00:00:00' AND '04/11/2013 23:59:59';
    
    
select CVT.shift_number ,
       CVT.number ,
       CVT.dt ,
       CD.logNumKkm ,
       CD.uid_shop 
      , X.*
from  
	(SELECT
		CVT.uid,
		SUM(CV.goods_count),
		SUM(CV.price * CV.goods_count),
		SUM(CV.overal_sum),
		SUM(CV.discount_sum) 
		FROM
		@t AS T
		INNER JOIN cash_voucher AS CV
		ON T.uid = CV.uid_cash_voucher_title
		GROUP BY T.uid
	) X
    LEFT OUTER JOIN cash_voucher_title AS CVT on X.uid = CVT.uid
    LEFT OUTER JOIN cash_desk AS CD ON CVT.uid_cash_desk = CD.uid
17 апр 13, 18:34    [14194723]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
Maxx
Member [скрыт]

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

вполне возможно , но табличная переменная на 90к записей,тоже не сильно швидка буде
17 апр 13, 18:48    [14194806]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
aleks2
Вот охота вам робяты переливать из пустого в порожнее?

Вот это сделает фсе ваши опусы:

declare @t table (uid uniqueidentifier primary key clustered);

insert @t
  select uid from cash_voucher_title 
    where dt BETWEEN '04/04/2013 00:00:00' AND '04/11/2013 23:59:59';
    
    
select CVT.shift_number ,
       CVT.number ,
       CVT.dt ,
       CD.logNumKkm ,
       CD.uid_shop 
      , X.*
from  
	(SELECT
		CVT.uid,
		SUM(CV.goods_count),
		SUM(CV.price * CV.goods_count),
		SUM(CV.overal_sum),
		SUM(CV.discount_sum) 
		FROM
		@t AS T
		INNER JOIN cash_voucher AS CV
		ON T.uid = CV.uid_cash_voucher_title
		GROUP BY T.uid
	) X
    LEFT OUTER JOIN cash_voucher_title AS CVT on X.uid = CVT.uid
    LEFT OUTER JOIN cash_desk AS CD ON CVT.uid_cash_desk = CD.uid


Все прикольно, только Clustered index insert 48% и время выполнения в два раза больше
17 апр 13, 19:14    [14194910]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
cdsmika
aleks2
Вот охота вам робяты переливать из пустого в порожнее?

Вот это сделает фсе ваши опусы:

declare @t table (uid uniqueidentifier primary key clustered);

insert @t
  select uid from cash_voucher_title 
    where dt BETWEEN '04/04/2013 00:00:00' AND '04/11/2013 23:59:59';
    
    
select CVT.shift_number ,
       CVT.number ,
       CVT.dt ,
       CD.logNumKkm ,
       CD.uid_shop 
      , X.*
from  
	(SELECT
		CVT.uid,
		SUM(CV.goods_count),
		SUM(CV.price * CV.goods_count),
		SUM(CV.overal_sum),
		SUM(CV.discount_sum) 
		FROM
		@t AS T
		INNER JOIN cash_voucher AS CV
		ON T.uid = CV.uid_cash_voucher_title
		GROUP BY T.uid
	) X
    LEFT OUTER JOIN cash_voucher_title AS CVT on X.uid = CVT.uid
    LEFT OUTER JOIN cash_desk AS CD ON CVT.uid_cash_desk = CD.uid


Все прикольно, только Clustered index insert 48% и время выполнения в два раза больше


К сообщению приложен файл (plan5.sqlplan - 44Kb) cкачать
17 апр 13, 19:17    [14194913]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
cdsmika
aleks2
Вот охота вам робяты переливать из пустого в порожнее?

Вот это сделает фсе ваши опусы:

declare @t table (uid uniqueidentifier primary key clustered);

insert @t
  select uid from cash_voucher_title 
    where dt BETWEEN '04/04/2013 00:00:00' AND '04/11/2013 23:59:59';
    
    
select CVT.shift_number ,
       CVT.number ,
       CVT.dt ,
       CD.logNumKkm ,
       CD.uid_shop 
      , X.*
from  
	(SELECT
		CVT.uid,
		SUM(CV.goods_count),
		SUM(CV.price * CV.goods_count),
		SUM(CV.overal_sum),
		SUM(CV.discount_sum) 
		FROM
		@t AS T
		INNER JOIN cash_voucher AS CV
		ON T.uid = CV.uid_cash_voucher_title
		GROUP BY T.uid
	) X
    LEFT OUTER JOIN cash_voucher_title AS CVT on X.uid = CVT.uid
    LEFT OUTER JOIN cash_desk AS CD ON CVT.uid_cash_desk = CD.uid


Все прикольно, только Clustered index insert 48% и время выполнения в два раза больше

Против 14% скана по нему
17 апр 13, 19:19    [14194918]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
Maxx
угу как не крути 200к на 90к .... в средгнем 2 позиции в чеке
а реально ли ,что
select COUNT(1)
from cash_voucher AS CV
WHERE CVT.dt BETWEEN '04/04/2012 00:00:00' AND '04/11/2013 23:59:59'


вернет ~ 90 к записей ?

Так не вернет ничего, т.к. CVT.dt не знает откуда брать
17 апр 13, 19:23    [14194924]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
Maxx
угу как не крути 200к на 90к .... в средгнем 2 позиции в чеке
а реально ли ,что
select COUNT(1)
from cash_voucher AS CV
WHERE CVT.dt BETWEEN '04/04/2012 00:00:00' AND '04/11/2013 23:59:59'


вернет ~ 90 к записей ?

У меня тестовая база. В реалии будет 20 млн на 8 млн )
17 апр 13, 19:36    [14194963]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
aleks2
Guest
cdsmika
Maxx
угу как не крути 200к на 90к .... в средгнем 2 позиции в чеке
а реально ли ,что
select COUNT(1)
from cash_voucher AS CV
WHERE CVT.dt BETWEEN '04/04/2012 00:00:00' AND '04/11/2013 23:59:59'


вернет ~ 90 к записей ?

У меня тестовая база. В реалии будет 20 млн на 8 млн )


В этом случае ты ваще херней маешься. Ибо никакие способы не способны прожевать группировку 20 млн записей "быстро".
18 апр 13, 06:19    [14196176]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
aleks2
cdsmika
пропущено...

У меня тестовая база. В реалии будет 20 млн на 8 млн )


В этом случае ты ваще херней маешься. Ибо никакие способы не способны прожевать группировку 20 млн записей "быстро".

Отличный совет. Я имел в виду не быстро, а оптимально, т.к. база еще вырастет
18 апр 13, 08:21    [14196254]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
cdsmika
aleks2
пропущено...


В этом случае ты ваще херней маешься. Ибо никакие способы не способны прожевать группировку 20 млн записей "быстро".

Отличный совет. Я имел в виду не быстро, а оптимально, т.к. база еще вырастет

Сейчас запрос с интервалом в месяц, выбирающий прим. 80 к записей из реальной базы выполняется на крутом сервере за 1 мин 20 сек.
18 апр 13, 08:30    [14196262]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
cdsmika
cdsmika
пропущено...

Отличный совет. Я имел в виду не быстро, а оптимально, т.к. база еще вырастет

Сейчас запрос с интервалом в месяц, выбирающий прим. 80 к записей из реальной базы выполняется на крутом сервере за 1 мин 20 сек.
Имею в виду тот запрос, что я писал в шапке.
18 апр 13, 08:32    [14196268]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
aleks2
Guest
cdsmika
aleks2
пропущено...


В этом случае ты ваще херней маешься. Ибо никакие способы не способны прожевать группировку 20 млн записей "быстро".

Отличный совет. Я имел в виду не быстро, а оптимально, т.к. база еще вырастет


Оптимально - сменить структуру. Шоб фильтр
where dt BETWEEN '04/04/2013 00:00:00' AND '04/11/2013 23:59:59';
можно было применить прямо к cash_voucher безо фсяких join.

И прихерачить к cash_voucher индекс (dt, все поля группировки).
18 апр 13, 08:55    [14196339]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
1.
create view vCV
with schemabinding
as
SELECT
 CVT.shift_number,
 CVT.number,
 CVT.dt,
 CVT.uid_cash_desk,
 SUM(CV.goods_count) AS goods_count,
 SUM(CV.price * CV.goods_count) AS [sum],
 SUM(CV.overal_sum) AS overal_sum,
 SUM(CV.discount_sum) AS discount_sum,
 count_big(*) as cnt
from cash_voucher AS CV
INNER JOIN cash_voucher_title AS CVT
ON CVT.uid = CV.uid_cash_voucher_title
GROUP BY
 CVT.shift_number,
 CVT.number,
 CVT.dt,
 CVT.uid_cash_desk;
go

create unique clustered index IX_vCV on vCV (dt, shift_number, nummber, uid_cash_desk);
go


2.
SELECT
_V.shift_number AS НомерСмены,
_V.number AS НомерЧека,
_V.dt AS ДатаЧека,
CD.logNumKkm AS НомерКассы,
CD.uid_shop AS Подразделение_uid,
_V.goods_count AS Количество,
_V.[sum] AS СуммаБезСкидки,
_V.overal_sum AS Сумма,
_V.discount_sum AS СуммаСкидки
from
 vCV _V with (noexpand)
LEFT JOIN cash_desk AS CD
ON _V.uid_cash_desk = CD.uid
WHERE _V.dt BETWEEN '04/04/2012 00:00:00' AND '04/11/2013 23:59:59'

ORDER BY
_V.dt DESC
18 апр 13, 09:00    [14196366]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
aleks2
cdsmika
пропущено...

Отличный совет. Я имел в виду не быстро, а оптимально, т.к. база еще вырастет


Оптимально - сменить структуру. Шоб фильтр
where dt BETWEEN '04/04/2013 00:00:00' AND '04/11/2013 23:59:59';
можно было применить прямо к cash_voucher безо фсяких join.

И прихерачить к cash_voucher индекс (dt, все поля группировки).

Как последнее средство да. Слишком много избыточных данных.
18 апр 13, 09:10    [14196413]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
invm
1.
create view vCV
with schemabinding
as
SELECT
 CVT.shift_number,
 CVT.number,
 CVT.dt,
 CVT.uid_cash_desk,
 SUM(CV.goods_count) AS goods_count,
 SUM(CV.price * CV.goods_count) AS [sum],
 SUM(CV.overal_sum) AS overal_sum,
 SUM(CV.discount_sum) AS discount_sum,
 count_big(*) as cnt
from cash_voucher AS CV
INNER JOIN cash_voucher_title AS CVT
ON CVT.uid = CV.uid_cash_voucher_title
GROUP BY
 CVT.shift_number,
 CVT.number,
 CVT.dt,
 CVT.uid_cash_desk;
go

create unique clustered index IX_vCV on vCV (dt, shift_number, nummber, uid_cash_desk);
go


2.
SELECT
_V.shift_number AS НомерСмены,
_V.number AS НомерЧека,
_V.dt AS ДатаЧека,
CD.logNumKkm AS НомерКассы,
CD.uid_shop AS Подразделение_uid,
_V.goods_count AS Количество,
_V.[sum] AS СуммаБезСкидки,
_V.overal_sum AS Сумма,
_V.discount_sum AS СуммаСкидки
from
 vCV _V with (noexpand)
LEFT JOIN cash_desk AS CD
ON _V.uid_cash_desk = CD.uid
WHERE _V.dt BETWEEN '04/04/2012 00:00:00' AND '04/11/2013 23:59:59'

ORDER BY
_V.dt DESC

Спасибо, я попробую позже
18 апр 13, 11:43    [14197383]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
invm
1.
create view vCV
with schemabinding
as
SELECT
 CVT.shift_number,
 CVT.number,
 CVT.dt,
 CVT.uid_cash_desk,
 SUM(CV.goods_count) AS goods_count,
 SUM(CV.price * CV.goods_count) AS [sum],
 SUM(CV.overal_sum) AS overal_sum,
 SUM(CV.discount_sum) AS discount_sum,
 count_big(*) as cnt
from cash_voucher AS CV
INNER JOIN cash_voucher_title AS CVT
ON CVT.uid = CV.uid_cash_voucher_title
GROUP BY
 CVT.shift_number,
 CVT.number,
 CVT.dt,
 CVT.uid_cash_desk;
go

create unique clustered index IX_vCV on vCV (dt, shift_number, nummber, uid_cash_desk);
go


2.
SELECT
_V.shift_number AS НомерСмены,
_V.number AS НомерЧека,
_V.dt AS ДатаЧека,
CD.logNumKkm AS НомерКассы,
CD.uid_shop AS Подразделение_uid,
_V.goods_count AS Количество,
_V.[sum] AS СуммаБезСкидки,
_V.overal_sum AS Сумма,
_V.discount_sum AS СуммаСкидки
from
 vCV _V with (noexpand)
LEFT JOIN cash_desk AS CD
ON _V.uid_cash_desk = CD.uid
WHERE _V.dt BETWEEN '04/04/2012 00:00:00' AND '04/11/2013 23:59:59'

ORDER BY
_V.dt DESC


К сообщению приложен файл (plan6.sqlplan - 15Kb) cкачать
18 апр 13, 15:18    [14199008]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
cdsmika
invm
1.
create view vCV
with schemabinding
as
SELECT
 CVT.shift_number,
 CVT.number,
 CVT.dt,
 CVT.uid_cash_desk,
 SUM(CV.goods_count) AS goods_count,
 SUM(CV.price * CV.goods_count) AS [sum],
 SUM(CV.overal_sum) AS overal_sum,
 SUM(CV.discount_sum) AS discount_sum,
 count_big(*) as cnt
from cash_voucher AS CV
INNER JOIN cash_voucher_title AS CVT
ON CVT.uid = CV.uid_cash_voucher_title
GROUP BY
 CVT.shift_number,
 CVT.number,
 CVT.dt,
 CVT.uid_cash_desk;
go

create unique clustered index IX_vCV on vCV (dt, shift_number, nummber, uid_cash_desk);
go


2.
SELECT
_V.shift_number AS НомерСмены,
_V.number AS НомерЧека,
_V.dt AS ДатаЧека,
CD.logNumKkm AS НомерКассы,
CD.uid_shop AS Подразделение_uid,
_V.goods_count AS Количество,
_V.[sum] AS СуммаБезСкидки,
_V.overal_sum AS Сумма,
_V.discount_sum AS СуммаСкидки
from
 vCV _V with (noexpand)
LEFT JOIN cash_desk AS CD
ON _V.uid_cash_desk = CD.uid
WHERE _V.dt BETWEEN '04/04/2012 00:00:00' AND '04/11/2013 23:59:59'

ORDER BY
_V.dt DESC


Сортировка 50%
18 апр 13, 15:19    [14199016]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
aleks2
Guest
cdsmika
cdsmika
пропущено...


Сортировка 50%


Этот лох ничо не понял.

ЗЫ. Покури Indexed View. Развей туман безграмотности...
18 апр 13, 15:24    [14199054]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
aleks2
cdsmika
пропущено...


Сортировка 50%


Этот лох ничо не понял.

ЗЫ. Покури Indexed View. Развей туман безграмотности...


Товарищ, пойди сам покури. Я тебя не оскорблял
18 апр 13, 15:25    [14199068]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
Maxx
Member [скрыт]

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

на таких размерах.. сам все равно прийдеться добавлять дату в таблицу с цифрами - иначе будете "ловить" кучу времени на сортировках\групировках етц
18 апр 13, 15:29    [14199102]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

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

на таких размерах.. сам все равно прийдеться добавлять дату в таблицу с цифрами - иначе будете "ловить" кучу времени на сортировках\групировках етц

Да, надо бы перенести
18 апр 13, 15:30    [14199108]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
cdsmika
Сортировка 50%
У вас цель какая: избавиться от сортировок в плане или запрос оптимизировать?
18 апр 13, 15:53    [14199270]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
invm
cdsmika
Сортировка 50%
У вас цель какая: избавиться от сортировок в плане или запрос оптимизировать?

Я всегда думал, что от сортировок надо избавляться по возможности. Я не прав? Да и время у запроса со вьюхой чуток выше.
18 апр 13, 15:56    [14199289]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
cdsmika
Member

Откуда:
Сообщений: 193
cdsmika
invm
пропущено...
У вас цель какая: избавиться от сортировок в плане или запрос оптимизировать?

Я всегда думал, что от сортировок надо избавляться по возможности. Я не прав? Да и время у запроса со вьюхой чуток выше.

Хотя нет - меня проглючило. Время со вьюшкой меньше
18 апр 13, 15:59    [14199305]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
cdsmika,

В общем выкладывайте тексты запросов с вью и без, реальные планы выполнения и результаты статистики io и time.
18 апр 13, 16:12    [14199403]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить