[ https://issues.apache.org/jira/browse/TORQUE-364?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17834837#comment-17834837 ]
Georg Kallidis commented on TORQUE-364: --------------------------------------- Thanks for reporting this issue. To check, if this could be included in the upcoming release and to tackle it down a little bit more, what about it is exactly and what to do, some more information would be helpful: Indeed mappers are applied for each single row, there is some overhead here, but I could not find any usage of StringBuilder used in any RecordMapper<T> classes. Do yo mean applying some SQL expression e.g. in (always assuming package {{org.apache.torque) in }}{{{}ColumnImpl.ColumnImpl(.. String sqlExpression){}}}? This happens of course already in building the SQL query (e.g {{sql.SqlBuilder.buildQuery(Criteria)) }}in doSelect() methods. The query is indeed build with StringBuilder in {{sql.Query.toStringBuilder(StringBuilder)}} More generally this may be about some caching mechanism, e.g. applying some kind of save immutable context. Could you give a more exact example, where this happens most obviously in the Torque template or runtime code? > RecordMapper very slow on many columns in table > ----------------------------------------------- > > Key: TORQUE-364 > URL: https://issues.apache.org/jira/browse/TORQUE-364 > Project: Torque > Issue Type: Improvement > Components: Runtime, Templates > Affects Versions: 5.1 > Reporter: Max Philipp Wriedt > Priority: Major > Labels: criteria_api, om, performance, recordmapper, templates > > When "doSelect()" a large quantity of columns in a table the default > RecordMappers generated by Om-Templates (processRow()) cause an > !https://wikimedia.org/api/rest_v1/media/math/render/svg/4441d9689c0e6b2c47994e2f587ac5378faeefba! > Problem. (technically O(rows * columns)) > Specifically, constantly generating the SQL expression of all possible > columns for every row in the result causes excessive use of StringBuilders > which slow the mapping process to a crawl. > I currently have two ideas on how best to tackle this problem: > # Either generate all SQL column expressions once when a (template > generated) RecordMapper is first created (using final static String fields) > thus reducing the cost for every row to generating all selected column SQL > expressions once(instead of every selected column times every available > column) > # Or (in case the first approach generates unacceptably excessive number of > fields for RecordMappers) adjust the RecordMapper API to allow a > "prepare(Criteria, int offset)" method to be called once before processing > any rows and implement it on generated RecordMappers to scan the Criteria and > build two lists: One containing references to the setXXX methods of the > mapper in the order they appear in the ResultSet (via the order in the > Criteria) and a second list containing the corresponding column offsets. This > would allow the processRow method to only iterated over both lists > simultaneously and call the referenced methods with the result set and offset > immediately. (Alternatively one list using lambdas could be used but I am > currently not sure about the stance or impact of these lambdas in the Torque > project.) > credits to [~refarb] -- This message was sent by Atlassian Jira (v8.20.10#820010) --------------------------------------------------------------------- To unsubscribe, e-mail: torque-dev-unsubscr...@db.apache.org For additional commands, e-mail: torque-dev-h...@db.apache.org