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

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

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

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

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

В общем хотелось бы попросить совета у сообщества.
...
Рейтинг: 0 / 0
Как временно попросить оптимизатор не использовать тот или иной индекс?
    #39607395
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как временно попросить оптимизатор не использовать тот или иной индекс?
    #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
Как временно попросить оптимизатор не использовать тот или иной индекс?
    #39607419
KRS544
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlanDenton, дубль таблицы нельзя создать?
...
Рейтинг: 0 / 0
Как временно попросить оптимизатор не использовать тот или иной индекс?
    #39607423
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KRS544, можно конечно. Потом переименовать и подменить. Но штука в том что таблица весит под 1Тб (без индексов).
Плодить еще одну таблицу - печаль. И данные в ней могут апдейтится хоть за вчера, хоть за сегодня, хоть за год назад.
Долго потом синхронизировать. Как вариант триггер и тогда синхронизация упроститься. Но у клиента такие финты ушами не пройдут.

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

Plan guide?
...
Рейтинг: 0 / 0
Как временно попросить оптимизатор не использовать тот или иной индекс?
    #39607441
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, хм. Вариант, но тут вопрос как мне план закрепить за 500 хранимок? Планов с участием этой таблицы - тьма.
...
Рейтинг: 0 / 0
Как временно попросить оптимизатор не использовать тот или иной индекс?
    #39607442
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри за орфографию. Реально буду благодарен помощи.
...
Рейтинг: 0 / 0
Как временно попросить оптимизатор не использовать тот или иной индекс?
    #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
Как временно попросить оптимизатор не использовать тот или иной индекс?
    #39607449
KRS544
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlanDenton,

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

лол :)


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

В общем я не теряю боевого настроя. Только начал исследовать и всех мучать. Может ребята с майкрософта что скажут :)
...
Рейтинг: 0 / 0
Как временно попросить оптимизатор не использовать тот или иной индекс?
    #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
Как временно попросить оптимизатор не использовать тот или иной индекс?
    #39607462
KRS544
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlanDentonKRS544, выше написал что юзать DISABLE не вариант увы. Если мне нужно потом включить индекс - это будет ребилд.
А ну да. Ну тут похоже индекс или жив или мертв.
...
Рейтинг: 0 / 0
Как временно попросить оптимизатор не использовать тот или иной индекс?
    #39607465
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Minamoto,

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

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

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

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


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