?Имаме уеб приложение, изпълняващо заявка, използваща JDBC с DB2 Universal JDBC драйвер (v9.7).
Изпълнението на заявката отнема поне 2 минути, когато се изпълнява през приложението. В командния ред обаче същата заявка отнема само две секунди. Не можем да разберем къде е проблемът.
WebSphere AppServer седи зад прокси сървър WebSEAL, който има изчакване от 2 минути, така че когато на приложението са необходими повече от 2 минути, за да отговори, потребителите виждат грешка. Потребителите съвсем наскоро съобщиха за проблема, но не са направени скорошни промени. Подозирам, че времето за отговор на заявката постепенно нараства и накрая достигна времето за изчакване на WebSEAL.
Заявката има подизбор в клаузата WHERE (която трябва да се изпълни само веднъж) и се чудя дали този подизбор не е оптимизиран при преминаване през JDBC, което го кара да се изпълнява отново с всеки ред от обединените таблици.
Запитването е:
SELECT A.VOIDED, A. DELIVERY_DATE_TEXT, A.TRANSACTION_ID, A.AIRBILL_NUMBER, A.NAME, B.DOCUMENT_NUMBER, B.STATUS
FROM SHIPPING A, TRANSACTION B
WHERE A.TRANSACTION_ID = B.TRANSACTION_ID
AND A.ORIGINAL_REQUEST_TIME <
(SELECT ORIGINAL_REQUEST_TIME FROM SHIPPING WHERE AIRBILL_NUMBER = ?)
AND B.STATUS <> 4
AND A.VOIDED IS NULL
Таблицата TRANSACTION има 1,8 милиона записа в нея, а таблицата SHIPPING има 95 000.
Има ли нещо нередно в заявката? Работи добре в CLI.
Или има грешка в DB2 JDBC драйвера?
Актуализация:
Е, опитахме програма за тестване на командния ред (без Websphere) с директна връзка (вместо набор от връзки) и без обвиващ обект на Spring JDBC (който използваме в приложението) и проблемът не можа да бъде пресъздаден.
След това използвахме db2expln, за да разгледаме плановете на заявката за заявката със и без параметъра и те бяха еднакви във всеки случай.
НАЙ-НАКРАЯ успяхме да изпробваме runstats на производствената маса и това направи разликата. Заявката за приложението се връща след няколко секунди сега. Фактът, че помогна, беше неочакван. Първоначално не го бяхме правили, тъй като CL заявката беше толкова бърза.
Така че предполагам, че проблемът е решен. Но все още не знаем защо заявката за Websphere JDBC първоначално беше толкова по-бавна от заявката от командния ред (и заявката за JDBC, която не е Websphere).
SHIPPING
с разпределение. - person mustaccio   schedule 31.03.2014