Служба данных Oracle & WCF: результаты запроса не возвращаются в DS, пока весь запрос не будет завершен - PullRequest
1 голос
/ 22 марта 2012

Я устранял серьезную проблему с производительностью в приложении 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 отправлять первую страницурезультаты немедленно возвращаются в службу данных?

1 Ответ

0 голосов
/ 22 марта 2012

a) Ваш запрос не запрашивает только 100 строк!

b) У вас нет ORDER BY, так как вы все равно определяете строки?

Некоторые способы Oracle:

/ * FIRST_ROWS * / Подсказка в вашем запросе вернет первые строки как можно раньше, но все равно вернет весь набор.

WHERE ROWNUM <100 </p>

остановит запроспосле 100 строк.Вам нужен ORDER BY для этого, чтобы иметь смысл.

Спросите Тома

...