В настоящее время я использую Spring NamedParameterJdbcTemplate
для ввода некоторых значений в sql. У меня возникают проблемы с производительностью, когда я java.sql.Timestamp
два значения java.sql.Timestamp
в sql, в столбце oracle которого используется тип DATE
и выполняется.
Это очень медленно (около 4 минут), но когда я запускаю его через sql-разработчик, он выполняется менее чем за секунду, так как у меня есть индекс в столбце DATE
. Вот фрагмент моего журнала отладки:
select * from test_table.test_column where eventts >= :startDate and eventts <= :endDate and loginname= :loginname and channelind= :channelind
2014-04-21 15:02:50 48416 [http-8080-1] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL query
2014-04-21 15:02:50 48417 [http-8080-1] DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL statement [select * from test_table.test_column where eventts >= ? and eventts <= ? and loginname= ? and channelind= ?]
2014-04-21 15:02:50 48417 [http-8080-1] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource
2014-04-21 15:02:50 48438 [http-8080-1] DEBUG org.springframework.jdbc.core.StatementCreatorUtils - Setting SQL statement parameter value: column index 1, parameter value [2014-04-21 12:02:38.0], value class [java.sql.Timestamp], SQL type 93
2014-04-21 15:02:50 48439 [http-8080-1] DEBUG org.springframework.jdbc.core.StatementCreatorUtils - Setting SQL statement parameter value: column index 2, parameter value [2014-04-22 00:00:00.0], value class [java.sql.Timestamp], SQL type 93
2014-04-21 15:02:50 48439 [http-8080-1] DEBUG org.springframework.jdbc.core.StatementCreatorUtils - Setting SQL statement parameter value: column index 3, parameter value [MY_LOGIN], value class [java.lang.String], SQL type unknown
2014-04-21 15:02:50 48439 [http-8080-1] DEBUG org.springframework.jdbc.core.StatementCreatorUtils - Setting SQL statement parameter value: column index 4, parameter value [WEB], value class [java.lang.String], SQL type unknown
Что мне здесь не хватает? Является ли Oracle кастом значения в TIMESTAMP
приводит к потере индекса, который у меня есть в столбце DATE
"eventts"?
Думаю, твоя догадка правильная. Когда у тебя есть
select something from some_table where column1 = :val1
и va1 не имеет тот же тип, что и столбец1, Oracle будет делать:
select something from some_table where to_val1type(column1) = :val1
Функция to_val1type не существует, она будет определяться по контексту (TO_DATE, TO_NUMBER и т.д.).
либо сделайте свой параметр того же типа, либо используйте TO_XXX fuctnion самостоятельно.