PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да чета всички редове от огромна таблица?

Кратката версия е, извикайте stmt.setFetchSize(50); и conn.setAutoCommit(false); за да избегнете четене на целия ResultSet в паметта.

Ето какво казват документите:

Получаване на резултати въз основа на курсор

По подразбиране драйверът събира всички резултати за заявката наведнъж. Това може да бъде неудобно за големи набори от данни, така че JDBC драйверът предоставя средство за базиране на ResultSet върху курсора на база данни и извличане само на малък брой редове.

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

Забележка:

  • Базираните на курсора ResultSets не могат да се използват във всички ситуации. Има редица ограничения, които ще накарат драйвера безшумно да се върне към извличането на целия ResultSet наведнъж.

  • Връзката със сървъра трябва да използва V3 протокол. Това е по подразбиране за (и се поддържа само от) сървърни версии 7.4 и по-нови.-

  • Връзката не трябва да е в режим на автоматично записване. Бекендът затваря курсорите в края на транзакциите, така че в режим на автоматично записване бекендът ще затвори курсора, преди нещо да може да бъде извлечено от него.-

  • Изявлението трябва да бъде създадено с тип ResultSet ResultSet.TYPE_FORWARD_ONLY. Това е по подразбиране, така че няма да е необходимо да се пренаписва код, за да се възползвате от това, но също така означава, че не можете да превъртате назад или по друг начин да прескачате в ResultSet.-

  • Дадената заявка трябва да бъде едно изявление, а не множество изрази, нанизани заедно с точка и запетая.

Пример 5.2. Задаване на размера на извличане за включване и изключване на курсорите.

Промяната на кода в режим на курсора е толкова проста, колкото задаване на размера на извличане на изявлението на подходящия размер. Задаването на размера на извличане обратно на 0 ще доведе до кеширане на всички редове (поведение по подразбиране).

// make sure autocommit is off
conn.setAutoCommit(false);
Statement st = conn.createStatement();

// Turn use of the cursor on.
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("a row was returned.");
}
rs.close();

// Turn the cursor off.
st.setFetchSize(0);
rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next()) {
   System.out.print("many rows were returned.");
}
rs.close();

// Close the statement.
st.close();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres не използва индекс, когато сканирането на индекса е много по-добър вариант

  2. Вмъкване на подготвен израз в база данни - PSQL

  3. Проверете статистическите цели в PostgreSQL

  4. Създаване на студен режим на готовност за PostgreSQL с помощта на Amazon AWS

  5. Използвайте изведен текст от функция като нова заявка