Я устранял серьезную проблему с производительностью в приложении SL4, которое использует Entity Framework и службу данных WCF для запроса некоторых простых таблиц среднего размера (~ 10M записей), и я наконец-то достиг определенного прогресса.
Запрос, отправленный из службы данных для 100 строк или простого фильтра, который возвращает> 100 строк для простой таблицы, занимает 5 минут, чтобы вернуть что-либо вообще.Тот же запрос, выполненный в SQL Developer, возвращает первые 50 строк практически мгновенно.
Изучение журналов трассировки этих запросов выявляет точно такой же план выполнения и общее истекшее время.Разница в том, что ничего не возвращается службе данных до тех пор, пока не будет выполнен весь запрос, тогда как разработчик SQL сразу получает первые 100.
Я думал, что решением может быть подкачка страниц: config.SetEntitySetPageSize("*", 5);
Но журнал трассировки показывает, что первая партия строк захватывается непосредственно перед тем, как Oracle переходит к следующему оператору:
.... SIMPLE SQL QUERY ...
PARSE #2:c=78000,e=100606,p=0,cr=3,cu=0,mis=1,r=0,dep=0,og=1,tim=205746975549
EXEC #2:c=0,e=226,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=205747109728
FETCH #2:c=46800,e=42299,p=0,cr=7134,cu=0,mis=0,r=20,dep=0,og=1,tim=205747229491
=====================
PARSING IN CURSOR #3 len=402 dep=1 uid=0 oct=3 lid=0 tim=205747256638 hv=3607805727 ad='18f64810'
select parttype, partcnt, partkeycols, flags, defts#, defpctfree, defpctused, definitrans, defmaxtrans, deftiniexts, defextsize, defminexts, defmaxexts, defextpct, deflists, defgroups, deflogging, spare1, mod(spare2, 256) subparttype, mod(trunc(spare2/256), 256) subpartkeycols, mod(trunc(spare2/65536), 65536) defsubpartcnt, mod(trunc(spare2/4294967296), 256) defhscflags from partobj$ where obj# = :1
END OF STMT
В конце журнала трассировки выбираются остальные строки:
....
END OF STMT
EXEC #3:c=0,e=15,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=205747262472
FETCH #3:c=0,e=24,p=0,cr=3,cu=0,mis=0,r=1,dep=1,og=4,tim=205747263090
FETCH #2:c=78001,e=81705,p=0,cr=14014,cu=0,mis=0,r=40,dep=0,og=1,tim=205747515725
FETCH #2:c=171601,e=162799,p=0,cr=27712,cu=0,mis=0,r=80,dep=0,og=1,tim=205747887738
FETCH #2:c=343202,e=328508,p=0,cr=55584,cu=0,mis=0,r=160,dep=0,og=1,tim=205748620538
...
*** 2012-03-21 19:34:10 2012
XCTEND rlbk=0, rd_only=1
как и прежде, и до сих пор ничего не возвращается в службу данных, пока все они не будут обработаны FETCH.
Вопрос: как заставить Oracle отправлять первую страницурезультаты немедленно возвращаются в службу данных?