Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как временно попросить оптимизатор не использовать тот или иной индекс? / 25 сообщений из 33, страница 1 из 2
26.02.2018, 15:34
    #39607355
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
Есть крупная 24/7 OLTP система. На проблемой таблице куча индексов.
При этом все индексы используются в разных хранимках (но нигде нет прибивания индекса хинтом INDEX).
Требуется посмотреть на то как поведет себя система если бы какого-то индекса "не было".

При этом удалять индекс нельзя. Отключить индекс тоже нельзя, что равносильно DROP но с сохранением метаданных об обьекте.
Фактически нужно глобально запретить оптимизатору использовать определенный индекс.

Причина таких извращений в том, что пересоздание индекса крайне сильно ударит по перфомансу.

Взываю к великим мастерам своего дела.
Кто поможет поможет или хотя бы на умную мысль натолкнет?

Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64) Developer Edition (64-bit)
...
Рейтинг: 0 / 0
26.02.2018, 15:39
    #39607358
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
Интуиция подсказывает что-то подшаманить в статистике, чтобы оптимизатор не захотел такой индекс использовать.
А после экспериментов обновить статистику и все бы "вернулось на круги своя".

В общем хотелось бы попросить совета у сообщества.
...
Рейтинг: 0 / 0
26.02.2018, 17:05
    #39607395
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
...
Рейтинг: 0 / 0
26.02.2018, 17:33
    #39607414
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
invm, такой вариант уже пробовал, но будет работать не всегда:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
USE [master]
GO

IF OBJECT_ID('dbo.test1') IS NOT NULL
    DROP TABLE dbo.test1
GO

CREATE TABLE dbo.test1 (a INT IDENTITY, b INT, INDEX pk CLUSTERED (a))
GO

INSERT INTO dbo.test1
SELECT number
FROM [master].dbo.spt_values
GO

ALTER INDEX ALL ON dbo.test1 REBUILD
GO

CREATE INDEX ix ON dbo.test1 (b)
GO

UPDATE STATISTICS dbo.test1 ix WITH ROWCOUNT = 1000000, PAGECOUNT = 10000000
GO

SELECT b
FROM dbo.test1 -- pk

SELECT b
FROM dbo.test1 -- ix -- как тут быть?
WHERE b = 0
GO

DBCC UPDATEUSAGE ('master', 'dbo.test1', ix) WITH COUNT_ROWS
GO

SELECT b
FROM dbo.test1 -- ix 

SELECT b
FROM dbo.test1 -- ix 
WHERE b = 0



У кого какие еще есть идеи?
...
Рейтинг: 0 / 0
26.02.2018, 17:41
    #39607419
KRS544
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
AlanDenton, дубль таблицы нельзя создать?
...
Рейтинг: 0 / 0
26.02.2018, 17:49
    #39607423
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
KRS544, можно конечно. Потом переименовать и подменить. Но штука в том что таблица весит под 1Тб (без индексов).
Плодить еще одну таблицу - печаль. И данные в ней могут апдейтится хоть за вчера, хоть за сегодня, хоть за год назад.
Долго потом синхронизировать. Как вариант триггер и тогда синхронизация упроститься. Но у клиента такие финты ушами не пройдут.

Взываю к адептам тайным трейс-флагов )))
...
Рейтинг: 0 / 0
26.02.2018, 17:52
    #39607426
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
Идеальный вариант к которому стремлюсь. Как-то хитро отключить индекс, чтобы он продолжал жить и апдейтится.
Но не использовался никак оптимизатором. Если за некое время по метрикам не будет печали, то удалить его.
В противном случае - вернуть в строй.
...
Рейтинг: 0 / 0
26.02.2018, 18:06
    #39607439
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
AlanDenton,

Plan guide?
...
Рейтинг: 0 / 0
26.02.2018, 18:09
    #39607441
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
invm, хм. Вариант, но тут вопрос как мне план закрепить за 500 хранимок? Планов с участием этой таблицы - тьма.
...
Рейтинг: 0 / 0
26.02.2018, 18:10
    #39607442
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
Сорри за орфографию. Реально буду благодарен помощи.
...
Рейтинг: 0 / 0
26.02.2018, 18:19
    #39607448
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
AlanDenton,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
sp_rename 'test1', 'test1111', 'OBJECT'

go
create view dbo.test1
with schemabinding
as
select a,b from dbo.test1111 as t
go
CREATE UNIQUE CLUSTERED INDEX pk_view
ON dbo.test1 (a);
go
SELECT b
FROM dbo.test1 WITH (NOEXPAND)-- ix 

SELECT b
FROM dbo.test1 WITH (NOEXPAND)-- ix 
WHERE b = 0



Но это требует добавления хинта с NOEXPAND на все вызовы, и удаления его потом при откате, так что не вариант, наверное, просто направление "на подумать".
...
Рейтинг: 0 / 0
26.02.2018, 18:19
    #39607449
KRS544
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
AlanDenton,

ALTER INDEX .. DISABLE
Помечает индекс как отключенный и недоступный для использования компонентом Компонент Database Engine.
...
Рейтинг: 0 / 0
26.02.2018, 18:20
    #39607453
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
Комменты ваши не убрал, у меня там в плане везде [pk_view]
...
Рейтинг: 0 / 0
26.02.2018, 18:21
    #39607454
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
KRS544,

лол :)


AlanDenton
имхо нет такого... извращениями переместить индексы в отдельную группу и отключить... но моя не уверена в здравости :)
...
Рейтинг: 0 / 0
26.02.2018, 18:22
    #39607456
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
MinamotoКомменты ваши не убрал, у меня там в плане везде [pk_view]
материализовать терабайтную таблицу? ну ну
...
Рейтинг: 0 / 0
26.02.2018, 18:22
    #39607457
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
KRS544, выше написал что юзать DISABLE не вариант увы. Если мне нужно потом включить индекс - это будет ребилд.
...
Рейтинг: 0 / 0
26.02.2018, 18:23
    #39607458
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
TaPaK, ну да, туплю ))
...
Рейтинг: 0 / 0
26.02.2018, 18:24
    #39607459
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
TaPaK, вот так и живем )))

В общем я не теряю боевого настроя. Только начал исследовать и всех мучать. Может ребята с майкрософта что скажут :)
...
Рейтинг: 0 / 0
26.02.2018, 18:26
    #39607461
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
Кстати, способ таки есть, не добавляя хинты везде, но с понятными ограничениями в виде второй копии этой таблицы:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
sp_rename 'test1', 'test3', 'OBJECT'

go
create view dbo.test2
with schemabinding
as
select a,b from dbo.test3 as t
go
CREATE UNIQUE CLUSTERED INDEX pk_view
ON dbo.test2 (a);
go
create view dbo.test1
as
select a,b from dbo.test2  WITH (NOEXPAND)
go
SELECT b
FROM dbo.test1-- ix 

SELECT b
FROM dbo.test1-- ix 
WHERE b = 0
...
Рейтинг: 0 / 0
26.02.2018, 18:27
    #39607462
KRS544
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
AlanDentonKRS544, выше написал что юзать DISABLE не вариант увы. Если мне нужно потом включить индекс - это будет ребилд.
А ну да. Ну тут похоже индекс или жив или мертв.
...
Рейтинг: 0 / 0
26.02.2018, 18:31
    #39607465
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
Minamoto,

авторКстати, способ таки есть, не добавляя хинты везде, но с понятными ограничениями в виде второй копии этой таблицы:

ещё раз, затраты на материализацию таблицы будут даже больше чем ребилд индекса после DISABLE
...
Рейтинг: 0 / 0
26.02.2018, 18:32
    #39607466
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
Minamoto, идея конечно хорошая. Не буду спорить. Но ix не должен юзаться в Вашем примере.
Фактически мы приходим к ситуации что делаем вью с таким именем как у таблицы и хардкодим там кластреный индекс.
Но в таком случае другие сценарии начинают нагибать сервер. Всего на таблице 4 NC индекса.
Проверить "на проф пригодность" нужно лишь один.

Сорри что детали по кусочкам так даю. Не подумал что будет важно сказу сказать.
...
Рейтинг: 0 / 0
26.02.2018, 18:33
    #39607467
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
имхо,
1. подобные задачи нужно решать на тестовом окружении где объём данных не терабайты
2. не вижу смысла изобретать хитро выдуманные велосипеды. если суть теста действительно нужна, убирайте индекс и пересоздавайте если нужно.
...
Рейтинг: 0 / 0
26.02.2018, 18:35
    #39607468
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
Дедушка,

тут 100% согласен, на тестовом окружение пробуем потом переносим...
...
Рейтинг: 0 / 0
26.02.2018, 18:35
    #39607469
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно попросить оптимизатор не использовать тот или иной индекс?
Дедушка, если бы все было так просто - я бы народ честной не мучал своим идиотизмом :)
Но механизм как описал вначале хотел бы найти. Если он существует конечно.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как временно попросить оптимизатор не использовать тот или иной индекс? / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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