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

Откуда:
Сообщений: 44
with bts as (
select
	ne_macro_region_name
	,ne_region_name
	,ne_range_type
	,ne_oper_status
	,COUNT(*) cnt
from (
	select * 
	from (
		select 	
			ne_macro_region_name
			,ne_region_name
			,ne_site_name
			,ne_oper_status
			,ne_range_type
			,ne_site_id
			,SUBSTRING(ne_range_type, 1, charindex('-', ne_range_type)-1) standart
		from
			v_nioss_bts_report_latest
		) bts
	where not exists (
		select null
		from v_mtsbts_latest mtsbts
		where bts.ne_site_id = mtsbts.NE_SITE_ID
			and standart = replace(replace(stnd, '2', ''), '900', '')
	)
) t
group by
	ne_macro_region_name
	,ne_region_name
	,ne_range_type
	,ne_oper_status
)
select * from bts
--where ne_oper_status  = 'Включён' -- Вот он, падла!!!
order by
	ne_macro_region_name
	,ne_region_name
	,ne_range_type

без where: 520 строк, 2 секунды.
с where: отменяю после 3 минут.
Что нужно сделать, подскажите пожалуйста.

К сообщению приложен файл. Размер - 69Kb
26 ноя 12, 14:16    [13529537]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Из-за REPLACE, вестимо.
Чтобы его посчитать для каждой строки, сканировать таблицу приходится.
26 ноя 12, 14:23    [13529594]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Andrey Metelyov
Member

Откуда:
Сообщений: 44
Почему фильтр по where не применяется к результирующей выборке из 520 строк? А делается для всей таблицы?
26 ноя 12, 14:27    [13529627]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
можно во временную таблицу а потом фильтр по where
а можно совсем неспортивно ne_oper_status +cast(cnt as varchar(32))= 'Включён'+cast(cnt as varchar(32))
26 ноя 12, 14:41    [13529769]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andrey Metelyov
Почему фильтр по where не применяется к результирующей выборке из 520 строк? А делается для всей таблицы?

Потому что план строится для всего запроса.
Ваше поле ne_oper_status (неизвестного типа) относится к представлению v_nioss_bts_report_latest
Которое тоже содержит неизвестный нам запрос.
26 ноя 12, 14:42    [13529775]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Andrey Metelyov
Member

Откуда:
Сообщений: 44
Мистер Хенки,

блин, работает :-)
26 ноя 12, 15:15    [13530142]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Andrey Metelyov
Member

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

Вот таблица и представление:
CREATE TABLE [dbo].[nioss_bts_report](
	[dat] [date] NULL,
	[NE_MACRO_REGION_NAME] [varchar](200) NULL,
	[NE_REGION_CODE] [varchar](32) NULL,
	[NE_REGION_NAME] [varchar](200) NULL,
	[NE_SITE_NAME] [varchar](200) NULL,
	[NE_NAME] [varchar](200) NULL,
	[NE_ADDRESS] [varchar](4000) NULL,
	[NE_BSC_NAME] [varchar](4000) NULL,
	[NE_RNC_NAME] [varchar](4000) NULL,
	[NE_RANGE_TYPE] [varchar](200) NULL,
	[NE_BTS_TYPE_NAME] [varchar](4000) NULL,
	[NE_VENDOR_NAME] [varchar](4000) NULL,
	[NE_BTS_ON_AIR_DATE] [datetime2](0) NULL,
	[NE_BTS_SIGN_DATE] [datetime2](0) NULL,
	[NE_BTS_LAUNCH_DATE] [datetime2](0) NULL,
	[NE_ADM_STATUS] [varchar](4000) NULL,
	[NE_OPER_STATUS] [varchar](32) NULL,
	[NE_CONFIG_USED] [varchar](4000) NULL,
	[NE_CONFIG_MOUNTED] [varchar](4000) NULL,
	[NE_ID] [numeric](20, 0) NULL,
	[NE_SITE_ID] [numeric](20, 0) NULL
) ON [PRIMARY]

CREATE VIEW [dbo].[v_nioss_bts_report_latest]
AS
SELECT     dat, NE_MACRO_REGION_NAME, NE_REGION_CODE, NE_REGION_NAME, NE_SITE_NAME, NE_NAME, NE_ADDRESS, NE_BSC_NAME, NE_RNC_NAME, 
                      NE_RANGE_TYPE, NE_BTS_TYPE_NAME, NE_VENDOR_NAME, NE_BTS_ON_AIR_DATE, NE_BTS_SIGN_DATE, NE_BTS_LAUNCH_DATE, NE_ADM_STATUS, 
                      NE_OPER_STATUS, NE_CONFIG_USED, NE_CONFIG_MOUNTED, NE_ID, NE_SITE_ID
FROM         dbo.nioss_bts_report
WHERE     (dat =
                          (SELECT     MAX(dat) AS Expr1
                            FROM          dbo.nioss_bts_report AS nioss_bts_report_1))

Я надеюсь вы это хотели увидеть?
26 ноя 12, 15:18    [13530162]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Andrey Metelyov
Member

Откуда:
Сообщений: 44
Это вообще нормальное поведение SQL сервера?
Может есть возможность повлиять на план запроса?
27 ноя 12, 10:05    [13534257]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
так а NE_ID это первичный ключ на nioss_bts_report ? Он кластерный?
27 ноя 12, 10:27    [13534399]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
Andrey Metelyov
Это вообще нормальное поведение SQL сервера?
Может есть возможность повлиять на план запроса?
1. А что Вам не нравится?
2. Да
27 ноя 12, 10:32    [13534433]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Andrey Metelyov
Member

Откуда:
Сообщений: 44
Мистер Хенки
так а NE_ID это первичный ключ на nioss_bts_report ? Он кластерный?

Нет, не ключ.
27 ноя 12, 13:53    [13536048]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Andrey Metelyov
Member

Откуда:
Сообщений: 44
PaulYoung
Andrey Metelyov
Это вообще нормальное поведение SQL сервера?
Может есть возможность повлиять на план запроса?
1. А что Вам не нравится?
2. Да

1. Нелогично он себя ведет блин! :-)
2. Как?
27 ноя 12, 13:54    [13536059]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Andrey Metelyov
Мистер Хенки
так а NE_ID это первичный ключ на nioss_bts_report ? Он кластерный?

Нет, не ключ.

а кто ключ на этой таблице?
27 ноя 12, 14:14    [13536334]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
можно так попробовать
create index ix_v_mts_bts_dat2  on 	dbo.nioss_bts_report (dat,ne_oper_status) include(ne_macro_region_name
			,ne_region_name
			,ne_site_name
			,ne_oper_status
			,ne_range_type)
go			

with bts as (
select
	ne_macro_region_name
	,ne_region_name
	,ne_range_type
	,ne_oper_status
	,COUNT(*) cnt
from (
	select * 
	from (
		select 	
			ne_macro_region_name
			,ne_region_name
			,ne_site_name
			,ne_oper_status
			,ne_range_type
			,ne_site_id
			,bts.standart
		from
			(select ne_macro_region_name
			,ne_region_name
			,ne_site_name
			,ne_oper_status
			,ne_range_type 
			,ne_site_id,SUBSTRING(ne_range_type, 1, charindex('-', ne_range_type)-1) standart
							FROM         dbo.nioss_bts_report
				WHERE     (dat =
										  (SELECT     MAX(dat) AS Expr1
											FROM          dbo.nioss_bts_report AS nioss_bts_report_1)))
		) bts
		
	where not exists (
		select null
		from v_mtsbts_latest mtsbts
		where bts.ne_site_id = mtsbts.NE_SITE_ID
			and standart = replace(replace(stnd, '2', ''), '900', '')
	)
) t
group by
	bts2.ne_macro_region_name
	,bts2.ne_region_name
	,bts2.ne_range_type
	,bts2.ne_oper_status
)
select * from bts
where ne_oper_status  = 'Включён' -- Вот он, падла!!!
order by
	ne_macro_region_name
	,ne_region_name
	,ne_range_type
27 ноя 12, 14:21    [13536423]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
Andrey Metelyov
PaulYoung
пропущено...
1. А что Вам не нравится?
2. Да

1. Нелогично он себя ведет блин! :-)
2. Как?
2. Если существует индекс по полю ne_oper_status, то он бы и использовался, иначе - скан, о чем Вам оптимизатор и показал в плане. Как-то так.
27 ноя 12, 14:27    [13536508]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andrey Metelyov
1. Нелогично он себя ведет блин! :-)

Индекса по полю ne_oper_status нет.
Статистика по полю ne_oper_status наверное тоже нет.
Запрос содержит самообъединение.
27 ноя 12, 14:28    [13536526]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Andrey Metelyov
Member

Откуда:
Сообщений: 44
Мистер Хенки
Andrey Metelyov
пропущено...

Нет, не ключ.

а кто ключ на этой таблице?


ничего
27 ноя 12, 15:00    [13536927]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Andrey Metelyov
Member

Откуда:
Сообщений: 44
Мистер Хенки
можно так попробовать

план становится таким, скорость не увеличивается:

К сообщению приложен файл. Размер - 16Kb
27 ноя 12, 15:07    [13537008]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Andrey Metelyov,
планы в формате xml более информативны и нет проблем с помещением на экран
27 ноя 12, 15:29    [13537232]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
Andrey Metelyov
Мистер Хенки
можно так попробовать

план становится таким, скорость не увеличивается:
Что-то Вы нам не договариваете... Да и план новый показали лишь частично...
27 ноя 12, 15:34    [13537281]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Andrey Metelyov
Member

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

К сообщению приложен файл (bad.sqlplan - 66Kb) cкачать
27 ноя 12, 15:56    [13537464]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
Andrey Metelyov
Member

Откуда:
Сообщений: 44
PaulYoung
2. Если существует индекс по полю ne_oper_status, то он бы и использовался, иначе - скан, о чем Вам оптимизатор и показал в плане. Как-то так.

Индекс есть, используется. Но почему же он это делает на всём объеме данных? Как сделать так, чтобы он фильтровал только 523 строки результирующей выборки?
27 ноя 12, 16:10    [13537635]     Ответить | Цитировать Сообщить модератору
 Re: Добавление where приводит к другому тормозному плану  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
Andrey Metelyov
PaulYoung
2. Если существует индекс по полю ne_oper_status, то он бы и использовался, иначе - скан, о чем Вам оптимизатор и показал в плане. Как-то так.

Индекс есть, используется. Но почему же он это делает на всём объеме данных? Как сделать так, чтобы он фильтровал только 523 строки результирующей выборки?
А если фильтровать данные в своей первой "внутренней" выборке и кинуть их во времянку, с которой потом все "внешние" операции и проделать?
27 ноя 12, 17:01    [13538134]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить