powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не используется индекс.
48 сообщений из 48, показаны все 2 страниц
Не используется индекс.
    #40122463
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Имеем сервер Microsoft SQL Server 2019 (RTM-CU14) (KB5007182) - 15.0.4188.2 (X64)
Есть таблица 25 млн записей.
Для таблицы есть 2 индекса:
CREATE UNIQUE CLUSTERED INDEX [_AccumRg35623_1] ON [dbo].[_AccumRg35623]
(
[_Period] ASC,
[_RecorderTRef] ASC,
[_RecorderRRef] ASC,
[_LineNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]

CREATE UNIQUE NONCLUSTERED INDEX [_AccumRg35623_2] ON [dbo].[_AccumRg35623]
(
[_RecorderTRef] ASC,
[_RecorderRRef] ASC,
[_LineNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]

Есть запрос

SELECT
0x00000000000000000000000000000000,
MIN(T1._Period)
FROM dbo._AccumRg35623 T1
WHERE
(T1._RecorderTRef = 0x000001EB
AND T1._RecorderRRef = 0x9C575CB90199817511EC632194753AD9)

В какой то момент времени запрос перестал использовать индекс _AccumRg35623_2 и делает сканирование по индексу _AccumRg35623_1. Сканирование занимает около 3,5 сек. Процедурные кэши сбрасывались, статистики обновлялись, индексы перестраивались. Результат тот же.

если добавить 3й индекс только по полям _RecorderTRef и _RecorderRRef то запрос начинает работать по нему. Выборка мгновенная(меньше 1 мс), т.к. обычно в таблице существует 1 запись удовлетворяющая условиям поиска.

Индексы _AccumRg35623_1 и _AccumRg35623_2 поменять нельзя. Запрос тоже. Создавать дублирующий индекс не хочется, выглядит избыточным. Да и подобных ситуаций может быть много. Аналогичные по структуре таблицы исчисляются сотнями. На текущий момент есть проблема только с двумя.

План запроса со сканированием прикладываю.

Прошу помочь разобраться почему сервер не использует индекс _AccumRg35623_2.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122465
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек

Код: sql
1.
2.
3.
4.
UNIQUE NONCLUSTERED INDEX [_AccumRg35623_2] 
	[_RecorderTRef] ASC,
	[_RecorderRRef] ASC,
	[_LineNo] ASC


Есть запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
0x00000000000000000000000000000000,
MIN(T1._Period)
FROM dbo._AccumRg35623 T1
WHERE 
	(T1._RecorderTRef = 0x000001EB 
	AND T1._RecorderRRef = 0x9C575CB90199817511EC632194753AD9)



T1._Period, Карл!!!


Это означает lookup.
Если сервер считает, что lookup-ов будет многовато - он включает сканирование.

Для начала, статистику обнови with FULLSCAN.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122467
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE UNIQUE NONCLUSTERED INDEX [_AccumRg35623_2] ON [dbo].[_AccumRg35623]
(
[_RecorderTRef] ASC,
[_RecorderRRef] ASC,
[_LineNo] ASC
)
INCLUDE ([_Period]) 
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122469
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

Делали, не помогало.
На всякий случай сделал еще раз
UPDATE STATISTICS _AccumRg35623 WITH FULLSCAN, MAXDOP = 0, PERSIST_SAMPLE_PERCENT = ON;
результат не изменился.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122472
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One,

Не работает, это пробовали.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122474
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек
Konst_One,

Не работает, это пробовали.

Не верю! (с) Станиславский.

ЗЫ. Хотя... размеры то данных те же получаются. Может и наплевать.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122478
0wl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
0wl
Гость
aleks222

Это означает lookup.


Это означает Lookup только если во втором индексе поля _Period нет. А оно там есть, т.к. оно используется в ключе кластерного индекса и, соответственно, будет дублироваться во все записи индексов некластерных. (поэтому же и include не помогает)
Кто сомневается - может посмотреть с помощью DBCC PAGE

Аднаэснек, можете получить план с использованием _AccumRg35623_2? Например, прям явно указать через хинт index:

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
0x00000000000000000000000000000000,
MIN(T1._Period)
FROM dbo._AccumRg35623 T1 with (index= _AccumRg35623_2)
WHERE
(T1._RecorderTRef = 0x000001EB
AND T1._RecorderRRef = 0x9C575CB90199817511EC632194753AD9)




А то пока только половина картины есть, непонятно, чем серверу такой план не нравится
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122481
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0wl,

Во вложении
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122492
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек,

План без хинта приведите.

Да странно.

Код: sql
1.
EstimatedRowsRead="13034.4"



при

Код: sql
1.
TableCardinality="25140000"



должен без хинта использовать индекс.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122510
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist
Аднаэснек,

План без хинта приведите.


план прикреплен к первому сообщению
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122520
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек
Konst_One,

Не работает, это пробовали.

попробуйте создать сжатый индекс
это поможет сиквелу принять решение в пользу этого индекса - размер меньше, читать меньше
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122528
ErMiValRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Аднаэснек

...
CREATE UNIQUE NONCLUSTERED INDEX [_AccumRg35623_2] ON [dbo].[_AccumRg35623]
(
[_RecorderTRef] ASC,
[_RecorderRRef] ASC,
[_LineNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]

Немного странные индексы, я правильно понимаю, что они были созданы платформой 1С? и именно поэтому их изменять нельзя ?
Странно:
1. Наименование (у платформенных индексов названия обычно не "_AccumRg35623_2", а "_AccumRg35623_ByRecorder")
2. Состав (начиная с платформы 8.3.8 первым в составе, обычно идёт "_Fld1389", - разделитель данных)
Если состав действительное не
"[_RecorderTRef] ,[_RecorderRRef] ,[_LineNo] "
, а "[_Fld1389], [_RecorderTRef] ,[_RecorderRRef] ,[_LineNo]"

Тогда индекс в вашем запросе может игнорироваться из-за того, что не указано первое значение в составе кластерного индекса.

На прошлой неделе были аналогичные проблемы с таблицей в 450 млн записей. Решалось через "UPDATE STATISTICS _AccumRg35623 WITH FULLSCAN" ... про "PERSIST_SAMPLE_PERCENT = ON" - прочитал, вроде как должно быть лучше, но на всякий случай попробуйте без него ...
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122533
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad

попробуйте создать сжатый индекс
это поможет сиквелу принять решение в пользу этого индекса - размер меньше, читать меньше


Сделал для индекса _AccumRg35623_2 DATA_COMPRESSION = PAGE
После выполнения сбросил процедурный кэш.
Поведение не поменялось.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122542
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек,

попробуйте хинт FORCE_LEGACY_CARDINALITY_ESTIMATION.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122572
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0wl
aleks222

Это означает lookup.


Это означает Lookup только если во втором индексе поля _Period нет. А оно там есть, т.к. оно используется в ключе кластерного индекса и, соответственно, будет дублироваться во все записи индексов некластерных. (поэтому же и include не помогает)
Кто сомневается - может посмотреть с помощью DBCC PAGE

Аднаэснек, можете получить план с использованием _AccumRg35623_2? Например, прям явно указать через хинт index:

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
0x00000000000000000000000000000000,
MIN(T1._Period)
FROM dbo._AccumRg35623 T1 with (index= _AccumRg35623_2)
WHERE
(T1._RecorderTRef = 0x000001EB
AND T1._RecorderRRef = 0x9C575CB90199817511EC632194753AD9)




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


Да, я тоже считаю, что это всемирный заговор жидомасонов.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122575
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек
PaulWist
Аднаэснек,

План без хинта приведите.


план прикреплен к первому сообщению


Пардон, не увидел.

Похоже на parameter sniffing

Код: sql
1.
StatementText="SELECT 0x00000000000000000000000000000000,MIN([T1].[_Period]) FROM [dbo].[_AccumRg35623] [T1] WHERE [T1].[_RecorderTRef]=@1 AND [T1].[_RecorderRRef]=@2"
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122660
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек,

Кстати, для общности эксперимента выполните скрипт без параметров и без хинта (в первом посте план запроса с параметрами).

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
0x00000000000000000000000000000000,
MIN(T1._Period)
FROM dbo._AccumRg35623 T1 
WHERE
(T1._RecorderTRef = 0x000001EB
AND T1._RecorderRRef = 0x9C575CB90199817511EC632194753AD9)
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122678
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ErMiValRU
Аднаэснек

...
CREATE UNIQUE NONCLUSTERED INDEX [_AccumRg35623_2] ON [dbo].[_AccumRg35623]
(
[_RecorderTRef] ASC,
[_RecorderRRef] ASC,
[_LineNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]

Немного странные индексы, я правильно понимаю, что они были созданы платформой 1С? и именно поэтому их изменять нельзя ?
Странно:
1. Наименование (у платформенных индексов названия обычно не "_AccumRg35623_2", а "_AccumRg35623_ByRecorder")
2. Состав (начиная с платформы 8.3.8 первым в составе, обычно идёт "_Fld1389", - разделитель данных)
Если состав действительное не
"[_RecorderTRef] ,[_RecorderRRef] ,[_LineNo] "
, а "[_Fld1389], [_RecorderTRef] ,[_RecorderRRef] ,[_LineNo]"

Тогда индекс в вашем запросе может игнорироваться из-за того, что не указано первое значение в составе кластерного индекса.

На прошлой неделе были аналогичные проблемы с таблицей в 450 млн записей. Решалось через "UPDATE STATISTICS _AccumRg35623 WITH FULLSCAN" ... про "PERSIST_SAMPLE_PERCENT = ON" - прочитал, вроде как должно быть лучше, но на всякий случай попробуйте без него ...


Да, это 1С. Индексы созданы платформой, менять их крайне не желательно(нельзя)
1.Наименование индекса зависит от версии платформы в которой создавался индекс. Наименование вида _AccumRg35623_ByRecorder было характерно для 8.2. Если сделать реструктуризацию на последней версии платформы то индекс будет иметь имя вида _AccumRg35623_2 ,по крайней мере у меня так. Возможно причина в методе реструктуризации. Не исследовал данный вопрос.
2. Разделители данных можно использовать, а можно не использовать. Зависит от логики конфигурации. В моем случае его нет. Привожу структуру таблицы:
CREATE TABLE [dbo].[_AccumRg35623](
[_Period] [datetime2](0) NOT NULL,
[_RecorderTRef] [binary](4) NOT NULL,
[_RecorderRRef] [binary](16) NOT NULL,
[_LineNo] [numeric](9, 0) NOT NULL,
[_Active] [binary](1) NOT NULL,
[_RecordKind] [numeric](1, 0) NOT NULL,
[_Fld35624RRef] [binary](16) NOT NULL,
[_Fld35625RRef] [binary](16) NOT NULL,
[_Fld35626] [datetime2](0) NOT NULL,
[_Fld35627] [numeric](15, 3) NOT NULL
) ON [PRIMARY]

Насчет "UPDATE STATISTICS _AccumRg35623 WITH FULLSCAN" Только решил проверить, запустил запрос чтобы опять увидеть скан, и о чудо - запрос выполнился по индексу _AccumRg35623_2. Не люблю совпадений. Все что менялось это ночью был перезагружен сервер. Но на счастье(или наоборот) у меня есть еще 1 таблица с таким же точно поведеним - _AccumRg25415. Так вот на ней скан продолжается. Отказ от PERSIST_SAMPLE_PERCENT в UPDATE STATISTICS не влияет.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122681
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
Аднаэснек,

попробуйте хинт FORCE_LEGACY_CARDINALITY_ESTIMATION.


Помогло. План прикладываю. Имя таблицы поменялось по причине того что _AccumRg35623 чудесным образом вылечилась, но проблема продолжает воспроизводится на другой таблице _AccumRg25415. Структура таблиц и индексов идентичны. Размер тоже.
Сейчас буду детальнее читать что дает использование FORCE_LEGACY_CARDINALITY_ESTIMATION, если поясните "на пальцах" сильно поможет в понимании проблемы.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122682
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist
Аднаэснек
пропущено...


план прикреплен к первому сообщению


Пардон, не увидел.

Похоже на parameter sniffing

Код: sql
1.
StatementText="SELECT 0x00000000000000000000000000000000,MIN([T1].[_Period]) FROM [dbo].[_AccumRg35623] [T1] WHERE [T1].[_RecorderTRef]=@1 AND [T1].[_RecorderRRef]=@2"



Почитал про parameter sniffing. Везде упоминаются хранимые процедуры. В моем случае их нет. Не подскажите, распространяется ли это на параметризированные запросы?
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122689
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если вы долбите sql своими всегда разными adhoc-запросами, то что вы ожидаете от бедного сервера, если он не знает какой план вам подобрать из кэша?
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122693
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек

Почитал про parameter sniffing. Везде упоминаются хранимые процедуры. В моем случае их нет. Не подскажите, распространяется ли это на параметризированные запросы?


1. Запрос параметризирован

Код: sql
1.
2.
3.
4.
 <ParameterList>
              <ColumnReference Column="@2" ParameterDataType="varbinary(8000)" ParameterCompiledValue="0x9C575CB90199817511EC632194753AD9" ParameterRuntimeValue="0x9C575CB90199817511EC632194753AD9" />
              <ColumnReference Column="@1" ParameterDataType="varbinary(8000)" ParameterCompiledValue="0x000001EB" ParameterRuntimeValue="0x000001EB" />
</ParameterList>



2. Почитать на предмет "распространяется ли это на параметризированные запросы?", ответ ДА. https://sqlperformance.com/2013/08/t-sql-queries/parameter-sniffing-embedding-and-the-recompile-options
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122696
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist
Аднаэснек,

Кстати, для общности эксперимента выполните скрипт без параметров и без хинта (в первом посте план запроса с параметрами).

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
0x00000000000000000000000000000000,
MIN(T1._Period)
FROM dbo._AccumRg35623 T1 
WHERE
(T1._RecorderTRef = 0x000001EB
AND T1._RecorderRRef = 0x9C575CB90199817511EC632194753AD9)



К сожалению не осилил сделать это в SSMS. Не подскажите как это реализовать?
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122698
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One
если вы долбите sql своими всегда разными adhoc-запросами, то что вы ожидаете от бедного сервера, если он не знает какой план вам подобрать из кэша?


Я догадываюсь что он не знает. Чем ему помочь в сложившейся ситуации я пока не знаю. Повлиять на сам запрос явным образом(переписать его) не представляется возможным потому что запрос генерирует платформа 1С и разработчик на языке 1С не имеет возможности влиять на эти запросы. В большинстве случаев проблем нет, но бывают исключения. По-этому и ветка появилась.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122710
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122722
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек

К сожалению не осилил сделать это в SSMS. Не подскажите как это реализовать?


https://docs.microsoft.com/ru-ru/sql/relational-databases/performance/display-an-actual-execution-plan?view=sql-server-ver15
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122733
ErMiValRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Аднаэснек,
[quot Аднаэснек#22413840]
ErMiValRU
пропущено...

... у меня есть еще 1 таблица с таким же точно поведеним - _AccumRg25415. Так вот на ней скан продолжается. Отказ от PERSIST_SAMPLE_PERCENT в UPDATE STATISTICS не влияет.


А ребилд индексов, по таблице "_AccumRg25415" - делали ?
... ну как бы стандартные рекомендации на этой таблице тоже выполнены ?
Ребилд индексов, (Именно "ALTER INDEX ... REBUILD", а не "ALTER INDEX ... REORGANIZE")
Пересчет статистики, (Аналогично первой таблиц, "UPDATE STATISTICS ... WITH FULLSCAN")
Сброс закэшированных планов ( "DBCC FREEPROCCACHE")
?
(вроде как стандартные рекомендации, но они перекрывают 90% проблем с индексами)
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122736
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist
Аднаэснек

К сожалению не осилил сделать это в SSMS. Не подскажите как это реализовать?


https://docs.microsoft.com/ru-ru/sql/relational-databases/performance/display-an-actual-execution-plan?view=sql-server-ver15


Так и делаю. Но запрос все равно параметризируется. Или я не так интерпретирую то что вижу. скрин прикладываю.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122737
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек,

похоже forced parameterization включено на базе
https://www.brentozar.com/blitz/forced-parameterization/
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122750
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
Аднаэснек,

похоже forced parameterization включено на базе
https://www.brentozar.com/blitz/forced-parameterization/


При FORCED были бы у обоих запросов параметры, а при Simple неизвестно какой запрос будет парметризирован, а какой нет.

https://docs-microsoft-com.translate.goog/en-us/sql/relational-databases/performance/specify-query-parameterization-behavior-by-using-plan-guides?view=sql-server-ver15&_x_tr_sl=en&_x_tr_tl=ru&_x_tr_hl=ru&_x_tr_pto=sc
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122765
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot ErMiValRU#22413904]Аднаэснек,
Аднаэснек
пропущено...


А ребилд индексов, по таблице "_AccumRg25415" - делали ?
... ну как бы стандартные рекомендации на этой таблице тоже выполнены ?
Ребилд индексов, (Именно "ALTER INDEX ... REBUILD", а не "ALTER INDEX ... REORGANIZE")
Пересчет статистики, (Аналогично первой таблиц, "UPDATE STATISTICS ... WITH FULLSCAN")
Сброс закэшированных планов ( "DBCC FREEPROCCACHE")
?
(вроде как стандартные рекомендации, но они перекрывают 90% проблем с индексами)


Да, все делалось. Но для чистоты эксперимента повторил:
ALTER INDEX _AccumRg25415_1 ON _AccumRg25415 REBUILD
GO
ALTER INDEX _AccumRg25415_2 ON _AccumRg25415 REBUILD
GO
UPDATE STATISTICS _AccumRg25415 WITH FULLSCAN
GO
DBCC FREEPROCCACHE

Все еще скан.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122772
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек
0wl,

Во вложении

https://www.sql.ru/forum/actualfile.aspx?id=22413561] Приложенный файл (Plan_2.sqlplan - 16Kb)


если это помогло, то почему не пользуетесь?

0wl
Аднаэснек, можете получить план с использованием _AccumRg35623_2? Например, прям явно указать через хинт index:

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
0x00000000000000000000000000000000,
MIN(T1._Period)
FROM dbo._AccumRg35623 T1 with (index= _AccumRg35623_2)
WHERE
(T1._RecorderTRef = 0x000001EB
AND T1._RecorderRRef = 0x9C575CB90199817511EC632194753AD9)

...
Рейтинг: 0 / 0
Не используется индекс.
    #40122773
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек


Все еще скан.


Стоимость
поиска по индексу = 0,0611744
Сканирование = 0,0219931

выбирается сканирование.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122777
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек,

так будет seek?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
0x00000000000000000000000000000000,
MIN(T1._Period)
FROM dbo._AccumRg35623 T1
WHERE
(T1._RecorderTRef = 0x000001EB
AND T1._RecorderRRef = 0x9C575CB90199817511EC632194753AD9)
option (use hint('DISABLE_OPTIMIZER_ROWGOAL'))
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122778
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One
Аднаэснек
0wl,

Во вложении

https://www.sql.ru/forum/actualfile.aspx?id=22413561] Приложенный файл (Plan_2.sqlplan - 16Kb)


если это помогло, то почему не пользуетесь?

0wl
Аднаэснек, можете получить план с использованием _AccumRg35623_2? Например, прям явно указать через хинт index:

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
0x00000000000000000000000000000000,
MIN(T1._Period)
FROM dbo._AccumRg35623 T1 with (index= _AccumRg35623_2)
WHERE
(T1._RecorderTRef = 0x000001EB
AND T1._RecorderRRef = 0x9C575CB90199817511EC632194753AD9)



Этот запрос генерируется платформой 1С. Я его не могу поменять равно как поменять структуру индексов. Как вариант добавить хинт через query store.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122782
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad
Аднаэснек,

похоже forced parameterization включено на базе
https://www.brentozar.com/blitz/forced-parameterization/


SELECT d.is_parameterization_forced
FROM sys.databases AS d
WHERE d.name = 'моя база'

Возвращает 0
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122783
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
Аднаэснек,

так будет seek?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
0x00000000000000000000000000000000,
MIN(T1._Period)
FROM dbo._AccumRg35623 T1
WHERE
(T1._RecorderTRef = 0x000001EB
AND T1._RecorderRRef = 0x9C575CB90199817511EC632194753AD9)
option (use hint('DISABLE_OPTIMIZER_ROWGOAL'))



План прикладываю
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122789
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist
Аднаэснек


Все еще скан.


Стоимость
поиска по индексу = 0,0611744
Сканирование = 0,0219931

выбирается сканирование.


Да, я тоже заметил этот момент.
И таки не нашел ответа почему стоимость io 283, cpu 27 а стоимость скана 0,023
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122790
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
Аднаэснек,

похоже forced parameterization включено на базе
https://www.brentozar.com/blitz/forced-parameterization/


у него там в плане StatementParameterizationType="0" поэтому forced быть не может.

Аднаэснек
получите еще оценку когда идет скан но без оценки row goal

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
0x00000000000000000000000000000000,
MIN(T1._Period)
FROM dbo._AccumRg35623 T1 with(index=1)
WHERE
(T1._RecorderTRef = 0x000001EB
AND T1._RecorderRRef = 0x9C575CB90199817511EC632194753AD9)
option (use hint('DISABLE_OPTIMIZER_ROWGOAL'))
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122792
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
komrad
Аднаэснек,

похоже forced parameterization включено на базе
https://www.brentozar.com/blitz/forced-parameterization/


у него там в плане StatementParameterizationType="0" поэтому forced быть не может.

Аднаэснек
получите еще оценку когда идет скан но без оценки row goal

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
0x00000000000000000000000000000000,
MIN(T1._Period)
FROM dbo._AccumRg35623 T1 with(index=1)
WHERE
(T1._RecorderTRef = 0x000001EB
AND T1._RecorderRRef = 0x9C575CB90199817511EC632194753AD9)
option (use hint('DISABLE_OPTIMIZER_ROWGOAL'))



Сделал так:

SELECT
0x00000000000000000000000000000000,
MIN(T1._Period)
FROM dbo._AccumRg25415 T1 with (index= _AccumRg25415_1)
WHERE
(T1._RecorderTRef = 0x000001EB
AND T1._RecorderRRef = 0x9C575CB90199817511EC632194753AD9)
option (use hint('DISABLE_OPTIMIZER_ROWGOAL'))

План во вложении.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122806
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек,

хм, subtreecost (при общих равных оценках строк)
для оператора скана: 0.0254273
для seek: 0,0702934

при этом при подсчете дерева для seek он считает как сумму: io + cpu

а вот для оператора скана он видимо использует какой то свой алгоритм подсчета потому что io: 283.674 cpu: 27.8027 как он получил из этих цифр 0.0254273 можно попробовать посмотреть более подробно с флагами трассировки.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40122831
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
Аднаэснек,

хм, subtreecost (при общих равных оценках строк)
для оператора скана: 0.0254273
для seek: 0,0702934

при этом при подсчете дерева для seek он считает как сумму: io + cpu

а вот для оператора скана он видимо использует какой то свой алгоритм подсчета потому что io: 283.674 cpu: 27.8027 как он получил из этих цифр 0.0254273 можно попробовать посмотреть более подробно с флагами трассировки.


если подскажете как, желательно без рестарта сиквела, то с удовольствием соберу необходимую информацию.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40123544
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Аднаэснек,

Ничего лучше не придумал как понижать уровень совместимости.
После установки уровня 130 (SQL 2016) план со сканированием стал сильно дороже и начался поиск по индексу.

Хотелось бы все таки разобраться как при уровне 150 у оптимизатора получалось 283+27 = 0.025
...
Рейтинг: 0 / 0
Не используется индекс.
    #40123558
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек,

зачем понижать уровень совместимости, как я уже писал выше, "попробуйте хинт FORCE_LEGACY_CARDINALITY_ESTIMATION.".
...
Рейтинг: 0 / 0
Не используется индекс.
    #40123561
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Я бы рад. Но не могу я хинты использовать и запрос изменить.
Для диагностики в SSMS могу, в "живых" запросах только через query store можно добавить.

Тут потенциально большая лажа закопана. Таких таблиц, схожих по структуре много, если сломаются все я замучаюсь хинты добавлять.

Да и уровень совместимости вернул обратно. Сервер со среднего 20-30% по ЦП ушел в полку. Тоже не вариант.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40123579
ErMiValRU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Аднаэснек,

у вас явно какие-то проблемы со статистикой, особенно учитывая, что в первом случае "Update statistics" - помогло.
"PERSIST_SAMPLE_PERCENT = ON" появилась с MSSQL2016. Возможно с его введением были какие-то ещё изменения в статистике (хз какие) ... Как вариант "пошаманить" со статистикой проблемной таблицы в разном порядке, без использования нововведений ...
...
Рейтинг: 0 / 0
Не используется индекс.
    #40123767
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аднаэснек,

авторНо не могу я хинты использовать и запрос изменить

В каком смысле? Как раз для таких случаев изобрели руководство планов.
...
Рейтинг: 0 / 0
Не используется индекс.
    #40123914
Аднаэснек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

В том смысле что я про данную вещь впервые услышал.
Спасибо! Буду разбираться.
...
Рейтинг: 0 / 0
48 сообщений из 48, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не используется индекс.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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