|
v7: MS SQL2К. Никто не пробовал запрет хинтов? DBCC TRACEON(8602, -1) | ☑ | ||
---|---|---|---|---|
0
Тим
08.06.12
✎
16:46
|
Мое почтение!
Привели клиентов, пожаловались неприемлемо низкую производительность при обработке больших массивов. Причина - повсеместные вызовы НайтиПоНаименованию() без указания режима поиска по точному совпадению, при этом никакой необходимости поиска по совпадению начала строк нет. Трассировка показала, что вызовы вида select * from SC1234(NOLOCK INDEX=DESCR) where DESCR>='абвгд' and substring(DESCR,1,5)='абвгд' order by DESCR,ROW_ID очевидно, в разы медленее поиска по точному совпадению. Кроме того, хинт на индекс создаёт очень затратный план, в котором букмаркинг пожирает 90%! Увы, написано скверно - невозможно централизованно и оперативно поправить код; вместо процедурной реализации он тупо многократно дублируется, при этом ещё обитает во внешних обработках; вызовы направлены к 4 линейным справочникам, содержащим миллионы записей. Короче, быстрый и надежный рефакторинг невозможен :( Решение, севствено, именно сейчас сособенно нужно быстрое. Сам экземпляр сервера содержится в порядке, статистика, дефраги регулярно, железка достойная. Пр анализе плана замечено, как писал выше, что букмаркинг пожирает 90%. Поискал, есть ли возможность принудительно отключить подсказки на оптимизацию - оказалось, таки да! Depending on your circumstances, there is quick and dirty way to turn off hints for a single user connection, or for an entire SQL Server. This is done without changing any code. Here’s how: DBCC TRACEON(8602) This above command is used to turn off all index hints for the current connection. So after running this command, any Transact-SQL code run will ignore any index hints. Сделали DBCC TRACEON(8602, -1) Сервер позволяет, выделен только под 7.7 На тестовом экземпляре включили - производительность в разы выше по "родным" планам сервера. Другие пробные нагрузки как минимум не хуже. Хочу уточнить - никто не пробовал такой трюк? |
|||
1
Тим
08.06.12
✎
16:47
|
Что за черт?! Я точно, я уверен - я выбрал раздел v7!?
Модераторы, плз - перенесите тему, я признаюсь, что я балбес. |
|||
2
Широкий
08.06.12
✎
16:56
|
Правь код, не выеживайся
|
|||
3
Z1
08.06.12
✎
18:05
|
(0) Если этот запрет затрагивает только индексные хинты то все ок,
ну а если уберет и nolock то не взлетит. правда на мой взгляд именно этому запросу из (0) это не поможет, а в целом даже нехило поднимется производительность за счет немешения выбора самому sql серверу нужного индекса. "вместо процедурной реализации он тупо многократно дублируется, при этом ещё обитает во внешних обработках; вызовы направлены к 4 линейным справочникам, содержащим миллионы записей." так перепиши на 1с++ "Хочу уточнить - никто не пробовал такой трюк?" если будешь делать на боевом сервере то отпишись please |
|||
4
Тим
08.06.12
✎
18:15
|
(3) - ну. риторические выступления на тему как и почему до такой жизни дошли, уже были - и 1с++ обсуждали, и переход
на 8, и много чего ещё :) Но всё это вопросы месяцев, а "вот сейчас особенно нужно". Указано, что данный флаг действует только на хинты по индексам, по локам - отдельный. В том-то и дело, что по этому запросу помог - хронометраж не обманешь. Потестируем ещё день, и попробуем на проме. Что получиться - сообщу. |
|||
5
Z1
08.06.12
✎
18:21
|
(4) помогает потому что по кластерному индексу запрос бежит
быстрее чем по индексу DESCR а просматривать придеться практически всю таблицу. вот на букве 'я' descr может и обгонит но когда хинта нет то sql сервер сам разберется на основе статистики когда какой индекс лучше взять. я же имел ввиду что сам запрос в целом "плохой". |
|||
6
Sereja
08.06.12
✎
18:23
|
мне очень интересна эта тема, ждем продолжений
|
|||
7
Z1
08.06.12
✎
18:25
|
(6) ИХМО думаю что взлетит и очень нехило,
что видно даже по запросу из (0) |
|||
8
smaharbA
08.06.12
✎
18:27
|
запускать экземпляр сразу с отключением в командной строке ?
|
|||
9
Z1
08.06.12
✎
18:32
|
(8) в 0 написано что дейстует для теущего соеденения.
т.е. загрузил 1с++ и сразу выполнил. |
|||
10
smaharbA
08.06.12
✎
18:34
|
(9) предлагаю отключать сразу при запуске сервера в строке запуска
|
|||
11
smaharbA
08.06.12
✎
18:39
|
||||
12
Тим
08.06.12
✎
18:41
|
(9) действует, в зависимости от вызова, на уровне экземпляра сервера. параметр -1
You can set traceflag 8602 globally in a couple of different ways. One is to use a second parameter of -1: DBCC TRACEON(8602, -1) Now when you run the following, you should see that 8602 is set globally: DBCC TRACESTATUS(-1) (The -1 for this command means to show the status of all enabled traceflags.) You can also set a traceflag globally through the SQL Server Configuration Manager. Right click your SQL Server service and choose Properties. Then go to the Advanced tab. There will be a text box for startup parameters, and you can add a semicolon to the end of what's already there, and then add -T8602. Do not leave any spaces between the semicolon and the dash. You'll then have to restart your SQL Server service ну и конечно предупреждение о том, что фича может не поддерживаться в следующих патчах и тем более версиях. |
|||
13
smaharbA
08.06.12
✎
18:43
|
(12) и еще есть оговорка -T и -t разные ключи
|
|||
14
smaharbA
08.06.12
✎
18:48
|
вопрос "монстрам" - а поиск в справочниках то же будет скорее быстрее ?
|
|||
15
Sereja
08.06.12
✎
18:59
|
+(14) И где еще станет быстрее. А то я из описания не понял. И безопасно ли все это
А то я с будуна "БыстрыеИтоги" подключил, и левые остатки получил |
|||
16
Z1
08.06.12
✎
19:00
|
(14) без sql запроса трудно что либо сказать.
|
|||
17
МихаилМ
08.06.12
✎
23:14
|
||||
18
spock
09.06.12
✎
06:59
|
я тоже запрещал хинты, но подошел к этому вопросу с другой стороны.
|
|||
19
dk
09.06.12
✎
07:38
|
если идет постоянное обращение в этим справочникам, то они должны были закешироваться давно уже
может тупо оперативки добавить скулю для кеширования |
|||
20
Z1
09.06.12
✎
08:30
|
(18) Расскажешь ?
|
|||
21
spock
09.06.12
✎
08:42
|
(20)так секретный релиз же
|
|||
22
Z1
09.06.12
✎
08:59
|
(21) не смотрел его т.к. используем легальный sql2000.
Вроде subj и секретный релиз могут дополнять друг друга. |
|||
23
smaharbA
09.06.12
✎
09:04
|
(21) все еще запрещены или отказался по каким то причинам ?
|
|||
24
Z1
09.06.12
✎
09:07
|
(19)дело не только влезет таблица или нет в память,
а в том что subj снимает нагрузку(часть нагрузки) с самого sql сервера. смотри например статью Примеры «тяжелых» запросов в системе 1С 7.7. Автор Владимир Сердюк http://www.sql.ru/articles/mssql/2005/101904hardqueryin1c.shtml вот для таких запросов и запроса из 0 subj очень поможет. |
|||
25
smaharbA
09.06.12
✎
09:09
|
(24) а когда ищешь в справочнике набирая, запросы валятся такие же (почти) как в сабже + на каждое нажатие кнопки
|
|||
26
smaharbA
09.06.12
✎
09:09
|
+ к тому - сабж снизит нагрузку при поиске в справочнике штатным механизмом ?
|
|||
27
Z1
09.06.12
✎
09:10
|
(25) Ну значит тебе это поможет.
(26) да снизит |
|||
28
spock
09.06.12
✎
10:07
|
(23)что запрещены?
|
|||
29
smaharbA
09.06.12
✎
10:09
|
(28) подсказки
|
|||
30
spock
09.06.12
✎
10:10
|
(29)не, вырезаются хинты напрочь. Зачем отказываться от вырезания? В них смысла особого нет.
|
|||
31
smaharbA
09.06.12
✎
10:12
|
(30) т.е. хинты таки вырезаны в твоих базах ?
|
|||
32
Z1
09.06.12
✎
10:22
|
(30) Могу сказать как еще можно в sql2008 поднять производительность.
сам проверить не могу т.к. нет sql2008 |
|||
33
spock
09.06.12
✎
10:26
|
(31)ну
|
|||
34
spock
09.06.12
✎
10:27
|
+33 индексные хинты, блокировочные на месте остаются
|
|||
35
МихаилМ
09.06.12
✎
10:36
|
(0)
извиняюсь за непрофесионала думал нинты к блокировкам |
|||
36
Sereja
09.06.12
✎
11:23
|
(32) Как ?
|
|||
37
Sereja
09.06.12
✎
11:29
|
+(36)
Твои посты про "1с++ sql Native Client " читал |
|||
38
Z1
09.06.12
✎
11:34
|
(36)для sql2008 и выше в таблицах rg для поля PERIOD
заменяем тип datetime на тип date. --------------------------- для sql2000 , sql2005 rg для поля PERIOD заменяем тип datetime на тип smalldate. это успешно работает и есть моя статья об этом на 1cpp.ru |
|||
39
Z1
09.06.12
✎
11:35
|
(37) это можно-нужно делать на любом sql начиная с sql2000
|
|||
40
Sereja
09.06.12
✎
11:36
|
(38) Спасибо, почитаем
|
|||
41
Z1
09.06.12
✎
11:37
|
в 38 вместо smalldate надо smalldatetime
|
|||
42
smaharbA
09.06.12
✎
11:42
|
(38) пожалуй да
|
|||
43
Sereja
09.06.12
✎
11:51
|
(38) "это успешно работает и есть моя статья об этом на 1cpp.ru"
Можешь дать ссылку. Загуглить не удалось |
|||
44
МихаилМ
09.06.12
✎
11:52
|
ну еоли речь по такие тонкости, то
можно еще collation поменять на регистро зависимый тоже дает эффект быстродействия |
|||
45
Z1
09.06.12
✎
12:06
|
(43) статья Ускоряем регисты v77 для базы MS SQL
http://www.1cpp.ru/forum/YaBB.pl?num=1291788964 |
|||
46
Sereja
09.06.12
✎
12:12
|
||||
47
Sereja
09.06.12
✎
12:12
|
(45) Благодарю
|
|||
48
Тим
09.06.12
✎
13:44
|
Провели включение режима на проме, всё пока работает.
По целевым задачам - да, заметное ускорение. Остальная функциональность, что ожидаемо, остались примерно на прежнем - ну, если только транзитный эффект от высвобождения мощностей :) Собственно, хинты на индексы - в 1С нечастое явление, судя по трассе. На выборке справочников по наименованиям, кое-где на отборах. Кстати, от построения курсора через индекс+закладки сервер, понятно, вовсе не отказываетя, просто в нашем случае ожидаемые большие звездные (*) выборки, например, тащит из кластерного индекса. В очередной раз убеждаюсь, что, в общем случае, хардкодить хинты просто категорически нельзя. Обязательно хотя бы опциональная возможность использование или отказа от рекомендуемых. |
|||
49
Z1
09.06.12
✎
21:14
|
Я тут подумал и пришел к выводу что запросы из 0
когда идет работа под sql2005 или выше - это и есть причина основных "тормозов" ( независимо от выставленного уровня совместимости бд). Дело в том что в sql2005 и выше более "умные" оптимизаторы запросов и на такой "тупой" ( из 0) запрос тратится очень много времени (точнее ресурсов) чтобы составить оптимальный план выполнения запроса. Вывод для sql2005 2008 2012 эта тема еще более актуальней и надо применять или (0) или (30) |
|||
50
smaharbA
15.06.12
✎
07:20
|
(49) вопрос по смене типа поля period - при смене на date все конечно вполне работает, но пока не выйдет последний - т.е. до верификации, при старте не проходит проверку на целостность.
При смене на smalldatetime - все ок, это конечно вполне объяснимо. Да и всегда ли операции сравнения между типами date и datetime выполняются ? И еще smalldatetime и datetime вполне неявно преобразуются в char, date нужно преобразовывать только явно. smalldatetime диапазоном от 1900 до 2079, а datetime от 1753 - эта дата часто в 1с используется как дата отсчета и пустая. Как это все (по наблюдениям) не повлияло на верность работы 1с ? |
|||
51
Z1
15.06.12
✎
09:03
|
(50) Просто у меня все критические отчеты по rg ( где нужна скорость)
переписаны через прямые запросы и там уже стоит нужный тип данных. про неявное преобразование к char по моему Вы не правы - но это не критично если Вам легче представлять что работает так то считайте что это так. |
|||
52
smaharbA
15.06.12
✎
15:44
|
да ошибка, не к чару а наоборот, преобразование к датетайму при сложении с интом
select 100+cast(CURRENT_TIMESTAMP as smalldatetime) select 100+cast(CURRENT_TIMESTAMP as datetime) select 100+cast(CURRENT_TIMESTAMP as date) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |