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

Кой е най-бързият начин за извличане на последователни данни от база данни?

SELECT * FROM table ORDER BY column

Няма причина да изсмуквате цялата таблица в RAM. Просто отворете курсора и започнете да четете. Можете да играете игри с извличане на размери и какво ли още не, но DB щастливо ще запази мястото си, докато обработвате вашите редове.

Допълнения:

Добре, ако използвате Java, тогава имам добра представа какъв е проблемът ви.

Първо, просто като използвате Java, вие използвате курсор. Това е основно това, което е ResultSet в Java. Някои набори от резултати са по-гъвкави от други, но 99% от тях са прости, препращат само набори от резултати, които извиквате „следващ“, за да получите всеки ред.

Сега относно вашия проблем.

Проблемът е конкретно с драйвера на Postgres JDBC. Не знам защо правят това, може би е спецификация, може би е нещо друго, но независимо от това, Postgres има любопитната характеристика, че ако вашата връзка има autoCommit, зададена на true, тогава Postgres решава да изсмуче целия набор от резултати на изпълни метод или първия следващ метод. Не е много важно къде, само че ако имате милион редове, получавате хубаво OOM изключение. Не е полезно.

Това лесно може да бъде точно това, което виждате, и оценявам как може да бъде доста разочароващо и объркващо.

Повечето връзки по подразбиране са autoCommit =true. Вместо това просто задайте autoCommit на false.

Connection con = ...get Connection...
con.setAutoCommit(false);
PreparedStatement ps = con.prepareStatement("SELECT * FROM table ORDER BY columm");
ResultSet rs = ps.executeQuery();
while(rs.next()) {
    String col1 = rs.getString(1);
    ...and away you go here...
}
rs.close();
ps.close();
con.close();

Обърнете внимание на явната липса на обработка на изключения, оставена като упражнение за читателя.

Ако искате повече контрол върху това колко реда се извличат наведнъж в паметта, можете да използвате:

ps.setFetchSize(numberOfRowsToFetch);

Играта с това може да подобри ефективността ви.

Уверете се, че имате подходящ индекс в колоната, която използвате в ORDER BY, ако изобщо ви интересува последователността.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Може ли PostgreSQL да има ограничение за уникалност върху елементите на масива?

  2. (Една таблица) вмъкване на редове

  3. При каква мощност SQL Server превключва към сканиране на индекс (срещу търсене)

  4. Базите данни освен Postgres имат ли функции, сравними с чуждестранните обвивки на данни?

  5. Излезе книгата „PostgreSQL 9.0 High Performance“.