Skip to content

Commit 1827794

Browse files
authored
Add --max-tablesizev-rows parameter. (#152)
* Add --max-tablesizev-rows parameter. Add possibility to limit the number of rows returned from the DBC.TableSizeV table.
1 parent 12b80e8 commit 1827794

File tree

2 files changed

+41
-42
lines changed

2 files changed

+41
-42
lines changed

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/ConnectorArguments.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import java.util.List;
4747
import java.util.Locale;
4848
import java.util.Map;
49+
import java.util.Optional;
4950
import java.util.ServiceLoader;
5051
import java.util.Set;
5152
import java.util.function.Predicate;
@@ -97,6 +98,7 @@ public class ConnectorArguments extends DefaultArguments {
9798
public static final String OPT_DATABASE = "database";
9899
public static final String OPT_SCHEMA = "schema";
99100
public static final String OPT_ASSESSMENT = "assessment";
101+
public static final String OPT_TERADATA_MAX_TABLESIZEV_ROWS = "max-tablesizev-rows";
100102
public static final String OPT_ORACLE_SID = "oracle-sid";
101103
public static final String OPT_ORACLE_SERVICE = "oracle-service";
102104

@@ -131,6 +133,13 @@ public class ConnectorArguments extends DefaultArguments {
131133
private final OptionSpec<String> optionDatabase = parser.accepts(OPT_DATABASE, "Database(s) to export").withRequiredArg().ofType(String.class).withValuesSeparatedBy(',').describedAs("db0,db1,...");
132134
private final OptionSpec<String> optionSchema = parser.accepts(OPT_SCHEMA, "Schemata to export").withRequiredArg().ofType(String.class).withValuesSeparatedBy(',').describedAs("sch0,sch1,...");
133135
private final OptionSpec<Void> optionAssessment = parser.accepts(OPT_ASSESSMENT, "Whether to create a dump for assessment (i.e., dump additional information).");
136+
137+
public static final String TERADATA_MAX_TABLE_SIZE_V_ROWS_DESCRIPTION =
138+
"Max number of rows to extract from DBC.TableSizeV table (available for 'teradata' connector only)";
139+
private final OptionSpec<Long> optionTeradataMaxTableSizeVRows =
140+
parser.accepts(OPT_TERADATA_MAX_TABLESIZEV_ROWS, TERADATA_MAX_TABLE_SIZE_V_ROWS_DESCRIPTION)
141+
.withRequiredArg().ofType(Long.class).describedAs("100000");
142+
134143
private final OptionSpec<String> optionUser = parser.accepts(OPT_USER, "Database username").withRequiredArg().describedAs("admin");
135144
private final OptionSpec<String> optionPass = parser.accepts(OPT_PASSWORD, "Database password, prompted if not provided").withOptionalArg().describedAs("sekr1t");
136145
private final OptionSpec<String> optionRole = parser.accepts(OPT_ROLE, "Database role").withRequiredArg().describedAs("dumper");
@@ -417,6 +426,13 @@ public boolean isAssessment() {
417426
return getOptions().has(optionAssessment);
418427
}
419428

429+
public Optional<Long> getTeradataMaxTableSizeVRows() {
430+
if (!getOptions().has(optionTeradataMaxTableSizeVRows)) {
431+
return Optional.empty();
432+
}
433+
return Optional.of(getOptions().valueOf(optionTeradataMaxTableSizeVRows));
434+
}
435+
420436
@Nonnull
421437
public Predicate<String> getSchemaPredicate() {
422438
return toPredicate(getSchemata());

dumper/app/src/main/java/com/google/edwmigration/dumper/application/dumper/connector/teradata/TeradataMetadataConnector.java

Lines changed: 25 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.google.auto.service.AutoService;
2020
import com.google.edwmigration.dumper.application.dumper.annotations.RespectsArgumentAssessment;
21+
import com.google.edwmigration.dumper.application.dumper.annotations.RespectsInput;
2122
import java.util.List;
2223
import com.google.edwmigration.dumper.application.dumper.ConnectorArguments;
2324
import com.google.edwmigration.dumper.application.dumper.annotations.RespectsArgumentDatabasePredicate;
@@ -41,6 +42,8 @@
4142
@Description("Dumps metadata from Teradata.")
4243
@RespectsArgumentDatabasePredicate
4344
@RespectsArgumentAssessment
45+
@RespectsInput(order = 450, arg = ConnectorArguments.OPT_TERADATA_MAX_TABLESIZEV_ROWS,
46+
description = ConnectorArguments.TERADATA_MAX_TABLE_SIZE_V_ROWS_DESCRIPTION)
4447
public class TeradataMetadataConnector extends AbstractTeradataConnector implements MetadataConnector, TeradataMetadataDumpFormat {
4548

4649
@SuppressWarnings("UnusedVariable")
@@ -113,14 +116,7 @@ public void addTasksTo(List<? super Task<?>> out, ConnectorArguments arguments)
113116
TaskCategory.OPTIONAL,
114117
"SELECT %s FROM DBC.StatsV " + whereDatabaseNameClause + " ;"));
115118

116-
// TableSizeV contains a row per each VProc/AMP, so it can grow significantly for large dbs.
117-
// Hence, we aggregate before dumping.
118-
// See recommended usage
119-
// https://docs.teradata.com/r/Teradata-VantageTM-Data-Dictionary/March-2019/Views-Reference/TableSizeV-X/Examples-Using-TableSizeV
120-
out.add(new TeradataJdbcSelectTask(TableSizeVFormat.ZIP_ENTRY_NAME,
121-
TaskCategory.OPTIONAL,
122-
"SELECT DataBaseName, AccountName, TableName, SUM(CurrentPerm) CurrentPerm, SUM(PeakPerm) PeakPerm FROM DBC.TableSizeV "
123-
+ whereDataBaseNameClause + " GROUP BY 1,2,3;"));
119+
out.add(createTaskForTableSizeV(whereDataBaseNameClause, arguments));
124120

125121
out.add(new TeradataJdbcSelectTask(AllTempTablesVXFormat.ZIP_ENTRY_NAME,
126122
TaskCategory.OPTIONAL,
@@ -144,38 +140,25 @@ public void addTasksTo(List<? super Task<?>> out, ConnectorArguments arguments)
144140
}
145141
}
146142

147-
}
148-
143+
private TeradataJdbcSelectTask createTaskForTableSizeV(
144+
String whereDataBaseNameClause,
145+
ConnectorArguments arguments) {
146+
StringBuilder query = new StringBuilder();
147+
query.append("SELECT ");
148+
arguments.getTeradataMaxTableSizeVRows().ifPresent(maxRows -> query.append("TOP ").append(maxRows));
149+
// TableSizeV contains a row per each VProc/AMP, so it can grow significantly for large dbs.
150+
// Hence, we aggregate before dumping.
151+
// See recommended usage
152+
// https://docs.teradata.com/r/Teradata-VantageTM-Data-Dictionary/March-2019/Views-Reference/TableSizeV-X/Examples-Using-TableSizeV
153+
query.append(" DataBaseName, AccountName, TableName, SUM(CurrentPerm) CurrentPerm, SUM(PeakPerm) PeakPerm FROM DBC.TableSizeV ")
154+
.append(whereDataBaseNameClause)
155+
.append(" GROUP BY 1,2,3");
156+
arguments.getTeradataMaxTableSizeVRows().ifPresent(unused -> query.append(" ORDER BY 4 DESC"));
157+
query.append(';');
158+
return new TeradataJdbcSelectTask(
159+
TableSizeVFormat.ZIP_ENTRY_NAME,
160+
TaskCategory.OPTIONAL,
161+
query.toString());
162+
}
149163

150-
/*
151-
14:44:43.475 [main] WARN com.google.edwmigration.dumper.application.dumper.MetadataDumper - Task failed: Write dbc.ColumnsqV.csv from:
152-
SELECT * FROM DBC.ColumnsqV ORDER BY 1,2,3,4;: org.springframework.jdbc.UncategorizedSQLException: StatementCallback; uncategorized SQLException for SQL [SELECT * FROM DBC.ColumnsqV ORDER BY 1,2,3,4;]; SQL state [HY000]; error code [9719]; [Teradata Database] [TeraJDBC 16.20.00.12] [Error 9719] [SQLState HY000] QVCI feature is disabled.; nested exception is java.sql.SQLException: [Teradata Database] [TeraJDBC 16.20.00.12] [Error 9719] [SQLState HY000] QVCI feature is disabled.
153-
org.springframework.jdbc.UncategorizedSQLException: StatementCallback; uncategorized SQLException for SQL [SELECT * FROM DBC.ColumnsqV ORDER BY 1,2,3,4;]; SQL state [HY000]; error code [9719]; [Teradata Database] [TeraJDBC 16.20.00.12] [Er
154-
or 9719] [SQLState HY000] QVCI feature is disabled.; nested exception is java.sql.SQLException: [Teradata Database] [TeraJDBC 16.20.00.12] [Error 9719] [SQLState HY000] QVCI feature is disabled.
155-
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:89)
156-
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
157-
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
158-
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1414)
159-
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:388)
160-
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:452)
161-
at com.google.edwmigration.dumper.application.dumper.task.JdbcSelectTask.doRun(JdbcSelectTask.java:102)
162-
at com.google.edwmigration.dumper.application.dumper.task.AbstractTask.run(AbstractTask.java:63)
163-
at com.google.edwmigration.dumper.application.dumper.task.Task.run(Task.java:89)
164-
at com.google.edwmigration.dumper.application.dumper.MetadataDumper.run(MetadataDumper.java:130)
165-
at com.google.edwmigration.dumper.application.dumper.MetadataDumper.run(MetadataDumper.java:76)
166-
at com.google.edwmigration.dumper.application.dumper.MetadataDumper.main(MetadataDumper.java:167)
167-
Caused by: java.sql.SQLException: [Teradata Database] [TeraJDBC 16.20.00.12] [Error 9719] [SQLState HY000] QVCI feature is disabled.
168-
at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDatabaseSQLException(ErrorFactory.java:309)
169-
at com.teradata.jdbc.jdbc_4.statemachine.ReceiveInitSubState.action(ReceiveInitSubState.java:103)
170-
at com.teradata.jdbc.jdbc_4.statemachine.StatementReceiveState.subStateMachine(StatementReceiveState.java:311)
171-
at com.teradata.jdbc.jdbc_4.statemachine.StatementReceiveState.action(StatementReceiveState.java:200)
172-
at com.teradata.jdbc.jdbc_4.statemachine.StatementController.runBody(StatementController.java:137)
173-
at com.teradata.jdbc.jdbc_4.statemachine.StatementController.run(StatementController.java:128)
174-
at com.teradata.jdbc.jdbc_4.TDStatement.executeStatement(TDStatement.java:389)
175-
at com.teradata.jdbc.jdbc_4.TDStatement.executeStatement(TDStatement.java:331)
176-
at com.teradata.jdbc.jdbc_4.TDStatement.doNonPrepExecuteQuery(TDStatement.java:319)
177-
at com.teradata.jdbc.jdbc_4.TDStatement.executeQuery(TDStatement.java:1121)
178-
at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:439)
179-
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:376)
180-
... 7 common frames omitted
181-
*/
164+
}

0 commit comments

Comments
 (0)