Ты можешь использовать
:sql_last_value
возможность получать данные из базы данных постепенно с помощью планировщика. Что-то вроде следующего будет полезно. (Предполагая, что у вас есть поле идентификатора)
input {
jdbc {
jdbc_connection_string => "jdbc:oracle:thin:IP:PORT:SID"
jdbc_user => "user"
jdbc_password => "password"
jdbc_driver_library => ".......\ojdbc8.jar"
jdbc_driver_class => "Java::oracle.jdbc.OracleDriver"
statement => "select * from (select * from TABLE where id >= :sql_last_value ORDER BY id ASC) rownum < 20"
use_column_value => true
tracking_column => id
tracking_column_type => "numeric"
schedule => "* * * * *"
}
}
обновление: рефакторинг SQL для использования rownum
и ORDER BY
для ограничения результатов в предполагаемом порядке (сортировка перед ограничением). См.: о ROWNUM и ограничении результатов
Тот же результат может быть достигнут с помощью разбиения на страницы, но это имеет проблемы с производительностью. Если мы используем нумерацию страниц ex:
input {
jdbc {
jdbc_connection_string => "jdbc:oracle:thin:IP:PORT:SID"
jdbc_user => "user"
jdbc_password => "password"
jdbc_driver_library => ".......\ojdbc8.jar"
jdbc_driver_class => "Java::oracle.jdbc.OracleDriver"
jdbc_page_size => 20
jdbc_paging_enabled => true
statement => "select * from TABLE"
}
}
Но это завернет
"выбрать * из ТАБЛИЦЫ"
нравится
SELECT * FROM (SELECT "T1".*, ROWNUM "X_SEQUEL_ROW_NUMBER_X" FROM (SELECT * FROM (select * from TABLE) "T1") "T1") "T1" WHERE (("X_SEQUEL_ROW_NUMBER_X" > 0) AND ("X_SEQUEL_ROW_NUMBER_X " ‹= (0 + 20)));
и будет работать без планировщика, разделив запрос на основе указанного размера jdbc_page_size (20 для этого примера). Но этот метод, очевидно, имеет проблемы с производительностью.
person
Erangad
schedule
19.10.2017