Как да разберете оптималния размер на извличане за заявката за избор

В JDBC размерът за извличане по подразбиране е 10, но предполагам, че това не е най-добрият размер за извличане, когато имам милион реда. Разбирам, че твърде нисък размер на извличане намалява производителността, но също и ако размерът на извличане е твърде висок.

Как мога да намеря оптималния размер? И това оказва ли влияние върху страната на DB, изяжда ли много памет?


person KKO    schedule 09.06.2015    source източник
comment
Не дъвче никакъв спомен. Oracle използва шаблон за проектиране производител-потребител, така че получените редове се генерират при поискване (когато извиквате fetch). Задаването на размер на извличане трябва да намали броя на двупосочните пътувания между базата данни и приложението. Не съм сигурен за JDBC, но поне в OCI можете също да посочите размера на получаващия буфер в байтове (мегабайти).   -  person ibre5041    schedule 09.06.2015
comment
Стойността по подразбиране е нула.   -  person user207421    schedule 09.06.2015
comment
тук се казва По подразбиране, когато Oracle JDBC изпълни заявка, той получава набора от резултати 10 реда наведнъж от курсора на базата данни. docs.oracle.com/cd/A87860_01/doc/ java.817/a83724/resltse5.htm   -  person KKO    schedule 09.06.2015
comment
JDBC няма размер за извличане по подразбиране. Това зависи от отделните шофьори. И няма оптимален размер на извличане. Зависи от заявката и начина, по който обработвате вашите резултати (и базата данни, която използвате, закъснението на връзката и т.н.). Това също е компромис между време и памет.   -  person Mark Rotteveel    schedule 09.06.2015
comment
@EJP Стойността 0 за fetchSize означава, че драйверът е свободен да избере собствената си стойност по подразбиране (въпреки че драйверът е свободен да игнорира подсказката ви, ако го зададете и на нещо различно от 0).   -  person Mark Rotteveel    schedule 09.06.2015


Отговори (4)


Както при (почти) всичко, начинът да намерите оптималния размер за определен параметър е да сравните работното натоварване, което се опитвате да оптимизирате с различни стойности на параметъра. В този случай ще трябва да стартирате кода си с различни настройки за размер на извличане, да оцените резултатите и да изберете оптималната настройка.

В по-голямата част от случаите хората избират размер на извличане от 100 или 1000 и това се оказва сравнително оптимална настройка. Разликата в производителността между стойностите в този момент обикновено е доста минимална - бихте очаквали, че по-голямата част от разликата в производителността между изпълненията е резултат от нормална произволна вариация, а не причинена от промени в размера на извличане. Ако се опитвате да получите последната йота от производителността за определено работно натоварване в определена конфигурация, със сигурност можете да направите този анализ. За повечето хора обаче 100 или 1000 е достатъчно.

person Justin Cave    schedule 09.06.2015

Ако вашите редове са големи, тогава имайте предвид, че всички редове, които извличате наведнъж, ще трябва да се съхраняват в Java heap във вътрешните буфери на драйвера. В 12c Oracle има VARCHAR(32k) колони, ако имате 50 от тях и те са пълни, това са 1 600 000 знака на ред. Всеки символ е 2 байта в Java. Така че всеки ред може да заема до 3,2 MB. Ако извличате редове 100 на 100, тогава ще имате нужда от 320 MB памет за съхранение на данните и това е само за един оператор. Така че трябва да увеличите размера на предварителното извличане на редове само за заявки, които извличат разумно малки редове (малък размер на данните).

person Jean de Lavarene    schedule 17.06.2015

Стойността по подразбиране на свойството JDBC fetch size е специфична за драйвера и за драйвера на Oracle тя наистина е 10.

За някои заявки размерът на извличане трябва да е по-голям, за някои по-малък.

Мисля, че добра идея е да зададете някакъв глобален размер на извличане за целия проект и да го презапишете за някои индивидуални заявки, където трябва да е по-голям.

Вижте тази статия:

http://makejavafaster.blogspot.com/2015/06/jdbc-fetch-size-performance.html

има описание как да настроите размера на извличане глобално и да го презапишете за внимателно подбрани заявки, като използвате различни подходи: Hibernate, JPA, Spring jdbc шаблони или основен jdbc API. И някои прости бенчмаркове за база данни на oracle.

Като правило можете да:

  • задайте fetchsize на 50 - 100 като глобална настройка
  • задайте fetchsize на 100 - 500 (или дори повече) за отделни заявки
person przemek hertel    schedule 23.06.2015

JDBC има размер на предварително извличане по подразбиране 10. Вижте OracleConnection.getDefaultRowPrefetch в JDBC Javadoc

person Nirmala    schedule 17.06.2015