|
Отменить кэширование в SQL
|
|||
---|---|---|---|
#18+
Столкнулся на днях с "проблемой" при оптимизации SQL-запроса. Есть запрос. 1й раз Cache' выполняет запрос 2мин, а в последующие по 5 сек. Если долго не вызывать - ситуация повторится, так понимаю связано сие с кэшированием чего-то там(результататов запросов? промежуточных результатов? глобалов?), не столь важно. Главное что это сбивает "прицел" при оптимизации таких запросов - не поймешь, то ли ты запрос ускорил/замедлил, то ли Cache' прокэшировала/сбросила кэш........ Нужно чтобы каждый раз запрос исполнялся "на холодную". Есть ли возможность как-то этого добиться? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2013, 06:34 |
|
Отменить кэширование в SQL
|
|||
---|---|---|---|
#18+
servit, Мне кажется, тут работает не кэшировани запросов, а кэширование глобалов. Поэтому при оценке оптимизации первые запуски не учитываем, учитываем запуски после того,как глобалы поднялись в кэш. Для оценки сойдет. Какие еще могут быть варианты - перезапускать сервер для чистоты эксперимента перед замерами. - попробовать снизить размер буфера глобалов до минимума. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2013, 11:17 |
|
Отменить кэширование в SQL
|
|||
---|---|---|---|
#18+
Еще вариант: Отмонтировать/примонтировать базу, на которой делается select. А вот в MSM была такая команда ZF, которая, по моему, как раз сбрасывала о очищала буфер глобалов. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2013, 07:22 |
|
Отменить кэширование в SQL
|
|||
---|---|---|---|
#18+
Мы меряем производительность участков кода путем подсчета глобальных ссылок и токенов. Замерять время почти бесполезно, т.к. на реальном сервере работает одновременно очень много людей, соответственно они одновременно нагружают дисковую подсистему. На площадке для нагрузочного тестирования все же меряем время, но при этом выставив достаточно большой кэш, куда целиком влазят основные глобалы с данными и индексами, и запуская "прогрев", т.е. первый проход сценариев тестирования не учитывается в результате. Запускать все на холодную решили, что не показательно, т.к. в кэше с вероятностью 99% находятся "горячие" индексы и справочники. А так да, минимально гарантированное действие, чтобы сбросить кэш - отмонтировать/примонтировать базу. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2013, 22:13 |
|
Отменить кэширование в SQL
|
|||
---|---|---|---|
#18+
sigmov, на этом соревновании по оптимизации запросов был вот такой класс-оценки производительности запросов #; datesrus.inc #; 2012-04-06 #define GetGlobalReferences ##class(%SYS.ProcessQuery).Open($job).GlobalReferences #define GetLinesExecuted ##class(%SYS.ProcessQuery).Open($job).LinesExecuted #define GetCommandsExecuted ##class(%SYS.ProcessQuery).Open($job).CommandsExecuted #if $SYSTEM.Version.GetOS()="Windows" #define Delimiter "\" #else #define Delimiter "/" #endif Class DatesRUs.WorkShop { ClassMethod Run(pInit As %Boolean = 1, pTuneTable As %Boolean = 1) { #dim SQLStats as %String #dim tRun as Run write !! do:pInit ..Init(pTuneTable) s SQLStats("Stime")= $ZH s SQLStats("Sline")= $$$GetLinesExecuted s SQLStats("Sglo") = $$$GetGlobalReferences #dim tIdx,tStart,tDiff,tResult,tStartGloRefs,tDiffGloRefs as %Numeric = 0 #dim tTotalRows as %Integer = 0 write !,"Method#",?10,"rowcount",?22," exec time",?35," glorefs" write !,$tr($j(" ",50)," ","-") for tIdx = 1:1:10 { set tStart = $zh, tStartGloRefs = $$$GetGlobalReferences set tResult = $classmethod($classname(),"Method"_tIdx) ;вызов запроса set tDiff = $zh-tStart, tTotalRows = tTotalRows + tResult, tDiffGloRefs = $$$GetGlobalReferences - tStartGloRefs write !,$j(tIdx,2),?10,$j($fn(tResult,","),8),?22,$j($fn(tDiff,",",2),10)_"s",?35,$j($fn(tDiffGloRefs,","),14) } write !,$tr($j(" ",50)," ","-") s SQLStats("Etime") = $ZH s SQLStats("Eline") = $$$GetLinesExecuted s SQLStats("Eglo") = $$$GetGlobalReferences w !,! w !,"Total # of rows: ",?25,$j($fn(tTotalRows,","),15) w !,"Global Refs: ",?25,$j($fn((SQLStats("Eglo")-SQLStats("Sglo")),","),15) w !,"TotalTime: ",?25, $j($fn((SQLStats("Etime")-SQLStats("Stime")),",",2),15)_"s" w !,"Score: ",?25,$j($fn((SQLStats("Eglo")-SQLStats("Sglo"))*(SQLStats("Etime")-SQLStats("Stime")),",",2),15) w ! QUIT } ClassMethod Init(pTuneTable As %Boolean = 0) { #dim tClass,tMethod as %String write !,"intializing..." #; purge query cache write !,"purging all query cache" do $SYSTEM.SQL.Purge() #; rebuild indices write !,"purge and rebuild all indices" for tClass = "Person","Customers","DateHistory","Employee","Profile","Survey" { //s gln="^DatesRUs."_tClass_"I" k @gln for tMethod = "%PurgeIndices","%BuildIndices" { do $classmethod("DatesRUs."_tClass,tMethod) } } #; run TuneTable (TuneSchema) to get the right results for your definitions if (pTuneTable) { write !,"tuning tables" #; don't display do $SYSTEM.SQL.TuneSchema("DatesRUs",1,0) } write ! } } ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2013, 14:09 |
|
|
start [/forum/topic.php?fid=39&msg=38336233&tid=1557097]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
176ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 296ms |
0 / 0 |