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

Откуда:
Сообщений: 5
Есть 2 запроса, query cost (relative to batch) 1-го 95%, 2-го 5%
План выполнения говорит, что 89% первого запроса это сортировка, но CPU и IO относительно маленькое.
Статистика IO/CPU что-то не учитывает, есть какой-то другой важный фактор или я не знаю что-то важное про особенности сортировки?

SET STATISTICS IO  ON 
SET STATISTICS TIME  ON

DECLARE @Period DATE = '99991231'
print '#1'

SELECT
	TabSpr.ROW_ID
	,TabSpr.ID
	,TabConst4.Value AS СостояниеДоговора
,TabConst4.DATE AS [СостояниеДоговора.Период]
FROM [dbo].[SC28112] as TabSpr WITH(NOLOCK)
 outer apply (select top 1 Value, date from [dbo]._1SCONST WITH(NOLOCK)  where ID = 28935 and objid = TabSpr.ID and DATE<=@Period order by [date] desc, ROW_ID desc)  AS TabConst4

print '#2'

SELECT
	TabSpr.ROW_ID
	,TabSpr.ID
	,TabConst4.Value AS СостояниеДоговора
	,TabConst4.DATE AS [СостояниеДоговора.Период]
FROM [dbo].[SC28112] as TabSpr WITH(NOLOCK)
 outer apply (select max(date) as Max_period from [dbo]._1SCONST WITH(NOLOCK)  where ID = 28935 and objid = TabSpr.ID and DATE<=@Period )  AS TabConst4MP
 outer apply (select max(Row_ID) as Max_RowID  from [dbo]._1SCONST WITH(NOLOCK)  where ID = 28935 and objid = TabSpr.ID and DATE = TabConst4MP.Max_period)  AS TabConst4MRID
 outer apply (select Value, Date from [dbo]._1SCONST WITH(NOLOCK)  where ID = 28935 and objid = TabSpr.ID and ROW_ID = TabConst4MRID.Max_RowID)  AS TabConst4


#1

(232233 row(s) affected)
Таблица "_1SCONST". Число просмотров 232233, логических чтений 1768049, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "SC28112". Число просмотров 9, логических чтений 462, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.

Время работы SQL Server:
Время ЦП = 5766 мс, затраченное время = 2577 мс.
#2

(232233 row(s) affected)
Таблица "_1SCONST". Число просмотров 444150, логических чтений 1922049, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "SC28112". Число просмотров 9, логических чтений 1840, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "Worktable". Число просмотров 0, логических чтений 0, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.

Время работы SQL Server:
Время ЦП = 6080 мс, затраченное время = 2591 мс.
20 фев 14, 00:35    [15594566]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Если честно - разницы особой по времени нет: 2577 против 2591 мс.
Даже не хочется вдаваться в подробности.

Но как отправная точка - стоимость не отражает время, отражаеттолько ресурсы и то ресурсы оценки.
20 фев 14, 00:56    [15594662]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
krae
Member

Откуда:
Сообщений: 5
SomewhereSomehow,
Вопрос как раз в том каким образом происходит оценка стоимости. По IO запрос 95% даже выгоднее, по ЦПУ немного хуже. Откуда тогда стоимость 95%. Оставил бы первый, как более лаконичный и понятный и будущем, возможно, после очередного сервис пака работающий лучше. Но стоимость 95% смущает. Как тут поступить, какой выбрать?
20 фев 14, 10:51    [15596024]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
krae
Откуда тогда стоимость 95%.

Это соотношение стоимостей запросов к друг другу.
У всего батча стоимость всегда 100%. И она делится между всеми командами в нем.

Сообщение было отредактировано: 20 фев 14, 10:54
20 фев 14, 10:53    [15596046]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
krae
Member

Откуда:
Сообщений: 5
Glory, Это я понимаю. Я не понимаю вот этого

Запрос 95% стоимости, статистика:
Время ЦП = 5766 мс, затраченное время = 2577 мс.
Таблица "_1SCONST". Число просмотров 232233, логических чтений 1768049, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "SC28112". Число просмотров 9, логических чтений 462, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.

Запрос 5% стоимости, статистика
Время ЦП = 6080 мс, затраченное время = 2591 мс.
Таблица "_1SCONST". Число просмотров 444150, логических чтений 1922049, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "SC28112". Число просмотров 9, логических чтений 1840, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.

Что я не учел? Есть же какие-то методы оценки стоимости запроса, которые складываются из операций ввода/вывода и времени ЦПУ + возможно еще какой-то фактор, который и дал эту 95% стоимость.
20 фев 14, 11:51    [15596631]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
krae
Что я не учел?

Непонятен вопрос.
У вас в пакете 2 разных запроса
У них разные планы, т.е. разные реализации одинаковых операций.
Например, для JOIN есть 3 разных стратегии и Hash join будет быстрее, но и дороже Nested loops
20 фев 14, 11:57    [15596698]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а вас так удивлет % ? Забейте на них у вас разные запросы...я не знаю как сейчас ето % считаються..но еще с 2000 сиквела на них не всотрю - ибо ето марсианские хроники
20 фев 14, 12:05    [15596785]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
krae
Что я не учел? Есть же какие-то методы оценки стоимости запроса, которые складываются из операций ввода/вывода и времени ЦПУ + возможно еще какой-то фактор, который и дал эту 95% стоимость.


так оценка она на то и оценка, что не по фактическим IO и времени ЦПУ делается, а по предполагаемым (исходя из статистики и всяких "волшебных" значений, заложенных в механизм оценки). у вас просто предположения разошлись с фактом. посмотрите, кстати, что там в плане с соотношением предполагаемого числа строк к фактическому.
20 фев 14, 14:18    [15598301]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
например для

select * from sysobjects a inner hash join syscolumns b on b.id = a.id
select * from sysobjects a inner merge join syscolumns b on b.id = a.id

в SQL2008R2 стоимость делится как 66 - 34

в то время как статистика чтений почти одинакова
(502 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'syscolpars'. Scan count 1, logical reads 11, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'sysschobjs'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(502 row(s) affected)
Table 'syscolpars'. Scan count 1, logical reads 11, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'sysschobjs'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
20 фев 14, 14:28    [15598402]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
krae
Member

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

автор
select * from sysobjects a inner hash join syscolumns b on b.id = a.id
select * from sysobjects a inner merge join syscolumns b on b.id = a.id

в SQL2008R2 стоимость делится как 66 - 34

в то время как статистика чтений почти одинакова


Тут-то как раз понятно, что стоимость будет выше из-за вычислений hash функций, которое увеличит время ЦПУ при одинаковом количестве операций ввода/вывода.
Я хотел услышать совет по поводу того, какой запрос выбирать и на основании каких магических цифр.
Фраза о том, что результат выполнения разошелся с планом, уже проливает свет на происходящее - там действительно различается количество фактическое и ожидаемое по строкам.
В общем, спасибо, видимо то, какой запрос выбирать, при прочих равных и противоречивых данных, остается на усмотрение человека.
20 фев 14, 15:48    [15599163]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
хмхмхм
Guest
Glory,

цена приводимого вами запроса еще и от кол-ва записей зависит в системных таблицах
20 фев 14, 15:51    [15599183]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
krae
Я хотел услышать совет по поводу того, какой запрос выбирать и на основании каких магических цифр.

Какой из двух _разных_ запросов выбрать ?
Для чего вот во 2ом запросе еще два outer apply ?
20 фев 14, 15:52    [15599194]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
хмхмхм
цена приводимого вами запроса еще и от кол-ва записей зависит в системных таблицах

Ну так я и показал, как может разделяться стоимость между вроде бы одинаковыми запросами одного пакета
В реале же вы будете писать скорее всего select * from sysobjects a inner join syscolumns b on b.id = a.id, т.е. без хинтов. Т.е. вы не будет заранее знать, какой план выберет оптимизатор
20 фев 14, 16:04    [15599303]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
krae
Member

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

автор
Для чего вот во 2ом запросе еще два outer apply ?


для каждой строки нужно выбрать строку по соединению (ID = 28935 and objid = TabSpr.ID) с Max(date), если таких строк несколько, то с max(Row_id). и оттуда уже date и value. Если присмотреться, то в первом запросе order by по 2-м полям.
Оба запроса возвращают одинаковые данные, но кардинально разным способом.
20 фев 14, 17:27    [15600212]     Ответить | Цитировать Сообщить модератору
 Re: откуда такая query cost ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
krae
Оба запроса возвращают одинаковые данные, но кардинально разным способом.

Вот именно разные способы и обуславливают разную оценку
20 фев 14, 21:28    [15601556]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить