Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема: при запросе по View не используется индекс / 3 сообщений из 3, страница 1 из 1
15.10.2018, 12:52
    #39717543
KellyLynch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема: при запросе по View не используется индекс
Мне подсунули такой View (не я его сочинил :-) ):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE VIEW [dbo].[TheView]
	AS
WITH sysParam
	AS (
		SELECT 
		CASE WHEN EXISTS (SELECT TOP 1 1 FROM dbo.[System.Parameters] 
			WHERE dbo.[System.Parameters].Variable = 'TheFlag' 
					AND dbo.[System.Parameters].Value = '1')
				THEN 1
		ELSE 0
		END as theFlag
	)
SELECT	[IPCAEDetailID],
		CASE WHEN sysParam.theFlag = 1
				THEN [IPNameNumber]
		ELSE [CAENumber]
		END as [IPNumber]
FROM    dbo.[IPCAEDetail]
INNER JOIN sysParam
	ON 1 = 1



Задумка создателя View была такая: он хотел, чтобы код, делающий запросы по [TheView], не знал, что в данный конкретный момент прячется за полем [TheView].IPNumber: поле [IPCAEDetail].IPNameNumber или поле [IPCAEDetail].CAENumber. Чтобы можно было это “динамически регулировать” через некую другую таблицу [System.Parameters].

И всё работает, но: при этом НЕ используются индексы, которые таблица [IPCAEDetail] имеет на этих полях [IPCAEDetail].IPNameNumber и [IPCAEDetail].CAENumber. При таком вот запросе:

Код: sql
1.
select * from [TheView] ipc where ipc.IPNumber = '426976225'



происходит Scan по всей таблице [IPCAEDetail]. Тогда как “ select * from [IPCAEDetail] ipc where ipc.CAENumber = '426976225' ” использует индекс, имеющийся для [IPCAEDetail].CAENumber.

Вопрос: можно ли как-то “заставить” SQL использовать эти индексы при поиске по этому “динамически определяемому через CASE ...” полю [TheView].IPNumber ?
...
Рейтинг: 0 / 0
15.10.2018, 12:59
    #39717550
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема: при запросе по View не используется индекс
Все or придется писать через union all.

Т.е. как-то так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE VIEW [dbo].[TheView]
	AS
WITH sysParam
	AS (
		SELECT 
		CASE WHEN EXISTS (SELECT TOP 1 1 FROM dbo.[System.Parameters] 
			WHERE dbo.[System.Parameters].Variable = 'TheFlag' 
					AND dbo.[System.Parameters].Value = '1')
				THEN 1
		ELSE 0
		END as theFlag
	)
SELECT	[IPCAEDetailID],
		[IPNumber] = [IPNameNumber]
FROM    dbo.[IPCAEDetail]
where exists ( select * from sysParam x where x.theFlag = 1 )
union all 
SELECT	[IPCAEDetailID],
		[IPNumber] = [CAENumber]
FROM    dbo.[IPCAEDetail]
where not exists ( select * from sysParam x where x.theFlag = 1 )



Условия из cte тоже неплохо бы убрать из под case.
...
Рейтинг: 0 / 0
15.10.2018, 13:01
    #39717552
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема: при запросе по View не используется индекс
Код: sql
1.
2.
3.
4.
5.
6.
7.
select [IPCAEDetailID],[IPNameNumber] as IPNumber
from dbo.[IPCAEDetail]
where exists (...)
union all
select [IPCAEDetailID],[CAENumber] as IPNumber
from dbo.[IPCAEDetail]
where NOT exists (...)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема: при запросе по View не используется индекс / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]