提交 07a9f6a3 编写于 作者: C Charly

support for distribution key alters and performance optimizations

上级 827c07ec
......@@ -19,6 +19,7 @@ package org.jkiss.dbeaver.ext.exasol.manager;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ext.exasol.model.ExasolTable;
import org.jkiss.dbeaver.ext.exasol.model.ExasolTableBase;
import org.jkiss.dbeaver.ext.exasol.model.ExasolTableColumn;
......@@ -31,10 +32,13 @@ import org.jkiss.dbeaver.model.impl.DBSObjectCache;
import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction;
import org.jkiss.dbeaver.model.impl.sql.edit.struct.SQLTableColumnManager;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.utils.CommonUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
......@@ -47,10 +51,14 @@ public class ExasolTableColumnManager extends SQLTableColumnManager<ExasolTableC
private static final String SQL_ALTER = "ALTER TABLE %s MODIFY COLUMN %s ";
private static final String SQL_COMMENT = "COMMENT ON COLUMN %s.%s IS '%s'";
private static final Log log = Log.getLog(ExasolTableColumnManager.class);
private static final String CMD_ALTER = "Alter Column";
private static final String CMD_COMMENT = "Comment on Column";
private static final String DROP_DIST_KEY = "ALTER TABLE %s DROP DISTRIBUTION KEYS";
private static final String CREATE_DIST_KEY = "ALTER TABLE %s DISTRIBUTE BY %s";
// -----------------
......@@ -92,10 +100,18 @@ public class ExasolTableColumnManager extends SQLTableColumnManager<ExasolTableC
@Override
protected void addObjectModifyActions(DBRProgressMonitor monitor, List<DBEPersistAction> actionList, ObjectChangeCommand command, Map<String, Object> options) {
ExasolTableColumn exasolColumn = command.getObject();
Map<Object,Object> props = command.getProperties();
if (!command.getProperties().isEmpty()) {
if ( props.containsKey("defaultValue") ||
props.containsKey("dataType") ||
props.containsKey("scale") ||
props.containsKey("maxLength") ||
props.containsKey("autoGenerated") ||
props.containsKey("identityValue") ||
props.containsKey("required")
) {
// build nullability tring
// build nullability string
String nullability = "";
if (exasolColumn.isOriRequired() != null && exasolColumn.isOriRequired() != exasolColumn.isRequired())
nullability = exasolColumn.isRequired() ? "NOT NULL" : "NULL";
......@@ -110,12 +126,20 @@ public class ExasolTableColumnManager extends SQLTableColumnManager<ExasolTableC
actionList.add(new SQLDatabasePersistAction(CMD_ALTER, sqlAlterColumn));
}
}
// Comment
DBEPersistAction commentAction = buildCommentAction(exasolColumn);
if (commentAction != null) {
actionList.add(commentAction);
}
if (command.getProperties().containsKey("distKey"))
{
try {
actionList.addAll(modifyDistKey(exasolColumn));
} catch (DBException e) {
log.error("Failed to modify distkey settings",e);
}
}
}
......@@ -190,5 +214,80 @@ public class ExasolTableColumnManager extends SQLTableColumnManager<ExasolTableC
"ALTER TABLE " + exasolColumn.getTable().getFullyQualifiedName(DBPEvaluationContext.DDL) + " ADD COLUMN " + addSQL + " "
)
);
if (exasolColumn.isDistKey())
try {
modifyDistKey(exasolColumn);
} catch (DBException e) {
log.error("Failed to generate distribution key",e);
}
}
/*
* handling for Distribution key
*/
private Collection<String> removeColumnFromDistKey(ExasolTableColumn exasolColumn) throws DBException
{
ExasolTable table = (ExasolTable) exasolColumn.getParentObject();
Collection<ExasolTableColumn> distKey = table.getDistributionKey(new VoidProgressMonitor());
if (distKey.size() == 1)
{
}
return null;
}
private SQLDatabasePersistAction generateDropDist(ExasolTableColumn exasolColumn)
{
return new SQLDatabasePersistAction(
"Drop Distribution Key",
String.format(
DROP_DIST_KEY,
((ExasolTable) exasolColumn.getParentObject()).getFullyQualifiedName(DBPEvaluationContext.DDL)
)
);
}
private SQLDatabasePersistAction generateCreateDist(Collection<ExasolTableColumn> distKey)
{
ExasolTable table = null;
Collection<String> names = new ArrayList<String>();
for(ExasolTableColumn c: distKey)
{
if (table == null)
table = (ExasolTable) c.getParentObject();
names.add(c.getName());
}
return new SQLDatabasePersistAction(
"Create Distribution Key",
String.format(CREATE_DIST_KEY, table.getFullyQualifiedName(DBPEvaluationContext.DDL), CommonUtils.joinStrings(",", names))
);
}
private Collection<SQLDatabasePersistAction> modifyDistKey(ExasolTableColumn exasolColumn) throws DBException
{
ExasolTable table = (ExasolTable) exasolColumn.getParentObject();
Collection<ExasolTableColumn> distKey = table.getDistributionKey(new VoidProgressMonitor());
Collection<SQLDatabasePersistAction> commands = new ArrayList<SQLDatabasePersistAction>();
if (table.getHasDistKey(new VoidProgressMonitor()))
{
commands.add(generateDropDist(exasolColumn));
}
if (!distKey.isEmpty())
commands.add(generateCreateDist(distKey));
return commands;
}
}
......@@ -37,6 +37,7 @@ import org.jkiss.dbeaver.model.impl.jdbc.cache.JDBCStructCache;
import org.jkiss.dbeaver.model.meta.Association;
import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.struct.DBSObjectState;
import org.jkiss.dbeaver.model.struct.rdb.DBSTableForeignKey;
......@@ -44,6 +45,7 @@ import org.jkiss.dbeaver.model.struct.rdb.DBSTableForeignKey;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
......@@ -60,49 +62,52 @@ public class ExasolTable extends ExasolTableBase implements DBPRefreshableObject
private Timestamp createTime;
private Boolean hasRead;
private long tablecount;
private static String readAdditionalInfo = "select * from ("
+ "select" +
" table_schema," +
" table_name," +
" table_owner," +
" table_has_distribution_key," +
" table_comment," +
" delete_percentage," +
" o.created," +
" o.last_commit," +
" s.raw_object_size," +
" s.mem_object_size," +
" s.object_type" +
" from" +
" EXA_ALL_OBJECTS o" +
" inner join" +
" EXA_ALL_TABLES T" +
" on" +
" o.root_name = t.table_schema and" +
" t.table_name = o.object_name and" +
" o.object_type = 'TABLE'" +
" inner join " +
" EXA_ALL_OBJECT_SIZES s" +
" on" +
" o.root_name = s.root_name and" +
" o.object_name = s.object_name and" +
" o.object_type = s.object_type" +
" where o.root_name = '%s' and o.object_name = '%s' and t.table_schema = '%s' and t.table_name = '%s'" +
" union all "
+ " select schema_name as table_schema,"
+ " object_name as table_name,"
+ " 'SYS' as table_owner,"
+ " false as table_has_distribution_key,"
+ " object_comment as table_comment,"
+ " 0 as delete_percentage,"
+ " cast( null as timestamp) as created,"
+ " cast( null as timestamp) as last_commit,"
+ " 0 as raw_object_size,"
+ " 0 as mem_object_size,"
+ " object_type"
+ " from SYS.EXA_SYSCAT WHERE object_type = 'TABLE' and schema_name = '%s' and object_name = '%s'"
+ ") as o"
+ " order by table_schema,o.table_name";
private static String readAdditionalInfo = "SELECT " +
" * " +
"FROM " +
" ( " +
" SELECT " +
" table_schema, " +
" table_name, " +
" table_owner, " +
" table_has_distribution_key, " +
" table_comment, " +
" delete_percentage, " +
" o.created, " +
" o.last_commit, " +
" s.raw_object_size, " +
" s.mem_object_size, " +
" s.object_type " +
" FROM " +
" EXA_ALL_OBJECTS o " +
" INNER JOIN EXA_ALL_TABLES T ON " +
" o.object_id = t.table_object_id " +
" INNER JOIN EXA_ALL_OBJECT_SIZES s ON " +
" o.object_id = s.object_id " +
" WHERE " +
" o.object_id = %s AND o.object_id = %s AND t.table_object_id = %s " +
"UNION ALL " +
" SELECT " +
" schema_name AS table_schema, " +
" object_name AS table_name, " +
" 'SYS' AS table_owner, " +
" FALSE AS table_has_distribution_key, " +
" object_comment AS table_comment, " +
" 0 AS delete_percentage, " +
" CAST( NULL AS TIMESTAMP) AS created, " +
" CAST( NULL AS TIMESTAMP) AS last_commit, " +
" 0 AS raw_object_size, " +
" 0 AS mem_object_size, " +
" object_type " +
" FROM " +
" SYS.EXA_SYSCAT " +
" WHERE " +
" object_type = 'TABLE' " +
" AND schema_name = '%s' " +
" AND object_name = '%s' ) AS o " +
"ORDER BY " +
" table_schema, " +
" o.table_name";
private static String count = "select count(*) as COUNTER from %s";
......@@ -126,10 +131,9 @@ public class ExasolTable extends ExasolTableBase implements DBPRefreshableObject
try (JDBCStatement stmt = session.createStatement())
{
String sql = String.format(readAdditionalInfo,
ExasolUtils.quoteString(this.getSchema().getName()),
ExasolUtils.quoteString(this.getName()),
ExasolUtils.quoteString(this.getSchema().getName()),
ExasolUtils.quoteString(this.getName()),
this.getObjectId(),
this.getObjectId(),
this.getObjectId(),
ExasolUtils.quoteString(this.getSchema().getName()),
ExasolUtils.quoteString(this.getName())
);
......@@ -137,7 +141,7 @@ public class ExasolTable extends ExasolTableBase implements DBPRefreshableObject
try (JDBCResultSet dbResult = stmt.executeQuery(sql))
{
dbResult.next();
this.hasDistKey = JDBCUtils.safeGetBoolean(dbResult, "TABLE_HAS_DISTRIBUTION_KEY");
this.hasDistKey = JDBCUtils.safeGetBoolean(dbResult, "TABLE_HAS_DISTRIBUTION_KEY");
this.lastCommit = JDBCUtils.safeGetTimestamp(dbResult, "LAST_COMMIT");
this.sizeRaw = JDBCUtils.safeGetLong(dbResult, "RAW_OBJECT_SIZE");
this.sizeCompressed = JDBCUtils.safeGetLong(dbResult, "MEM_OBJECT_SIZE");
......@@ -178,49 +182,49 @@ public class ExasolTable extends ExasolTableBase implements DBPRefreshableObject
// -----------------
// Properties
// -----------------
@Property(viewable = false, expensive = true, editable = false, order = 90, category = ExasolConstants.CAT_BASEOBJECT)
@Property(viewable = true, expensive = false, editable = false, order = 90, category = ExasolConstants.CAT_BASEOBJECT)
public Boolean getHasDistKey(DBRProgressMonitor monitor) throws DBCException {
if (! hasRead)
read(monitor);
return hasDistKey;
}
@Property(viewable = false, expensive = true, editable = false, order = 100, category = ExasolConstants.CAT_BASEOBJECT)
@Property(viewable = true, expensive = false, editable = false, order = 100, category = ExasolConstants.CAT_BASEOBJECT)
public Timestamp getLastCommit(DBRProgressMonitor monitor) throws DBCException {
if (! hasRead)
read(monitor);
return lastCommit;
}
@Property(viewable = false, expensive = true, editable = false, order = 100, category = ExasolConstants.CAT_DATETIME)
@Property(viewable = true, expensive = false, editable = false, order = 100, category = ExasolConstants.CAT_DATETIME)
public Timestamp getCreateTime(DBRProgressMonitor monitor) throws DBCException {
if (! hasRead)
read(monitor);
return createTime;
}
@Property(viewable = false, expensive = true, editable = false, order = 150, category = ExasolConstants.CAT_STATS)
@Property(viewable = true, expensive = false, editable = false, order = 150, category = ExasolConstants.CAT_STATS)
public String getRawsize(DBRProgressMonitor monitor) throws DBCException {
if (! hasRead)
read(monitor);
return ExasolUtils.humanReadableByteCount(sizeRaw, true);
}
@Property(viewable = false, expensive = true, editable = false, order = 200, category = ExasolConstants.CAT_STATS)
@Property(viewable = true, expensive = false, editable = false, order = 200, category = ExasolConstants.CAT_STATS)
public String getCompressedsize(DBRProgressMonitor monitor) throws DBCException {
if (! hasRead)
read(monitor);
return ExasolUtils.humanReadableByteCount(sizeCompressed, true);
}
@Property(viewable = false, expensive = true, editable = false, order = 250, category = ExasolConstants.CAT_STATS)
@Property(viewable = true, expensive = false, editable = false, order = 250, category = ExasolConstants.CAT_STATS)
public float getDeletePercentage(DBRProgressMonitor monitor) throws DBCException {
if (! hasRead)
read(monitor);
return this.deletePercentage;
}
@Property(viewable = false, expensive = true, editable = false, order = 300, category = ExasolConstants.CAT_STATS)
@Property(viewable = true, expensive = false, editable = false, order = 300, category = ExasolConstants.CAT_STATS)
public long getTableCount(DBRProgressMonitor monitor) throws DBCException {
if (! hasRead)
read(monitor);
......@@ -297,5 +301,19 @@ public class ExasolTable extends ExasolTableBase implements DBPRefreshableObject
return DBSObjectState.NORMAL;
}
public Collection<ExasolTableColumn> getDistributionKey(DBRProgressMonitor monitor) throws DBException
{
ArrayList<ExasolTableColumn> distKeyCols = new ArrayList<ExasolTableColumn>();
for(ExasolTableColumn c : getAttributes(monitor))
{
if (c.isDistKey())
{
distKeyCols.add(c);
}
}
return distKeyCols;
}
}
......@@ -17,6 +17,7 @@
*/
package org.jkiss.dbeaver.ext.exasol.model;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.util.Collection;
import java.util.Collections;
......@@ -47,6 +48,8 @@ public abstract class ExasolTableBase extends JDBCTable<ExasolDataSource, Exasol
private String remarks;
private String objectType;
private BigDecimal objectId;
public ExasolTableBase(ExasolSchema schema, String name, boolean persisted) {
......@@ -58,6 +61,8 @@ public abstract class ExasolTableBase extends JDBCTable<ExasolDataSource, Exasol
setName(JDBCUtils.safeGetString(dbResult, "TABLE_NAME"));
this.remarks = JDBCUtils.safeGetString(dbResult, "REMARKS");
this.objectType = JDBCUtils.safeGetString(dbResult, "TABLE_TYPE");
this.objectId =JDBCUtils.safeGetBigDecimal(dbResult, "OBJECT_ID");
}
......@@ -171,6 +176,11 @@ public abstract class ExasolTableBase extends JDBCTable<ExasolDataSource, Exasol
// No Indexes in Exasol
return Collections.emptyList();
}
public BigDecimal getObjectId()
{
return this.objectId;
}
}
......@@ -235,10 +235,15 @@ public class ExasolTableColumn extends JDBCTableColumn<ExasolTableBase>
this.remarks = remarks;
}
@Property(viewable = false, order = 121)
@Property(viewable = true, editable = true, updatable = true, order = 121)
public Boolean isDistKey() {
return isInDistKey;
}
public void setDistKey(Boolean distKey)
{
this.isInDistKey = distKey;
}
// no hidden columns supported in exasol
......@@ -316,5 +321,4 @@ public class ExasolTableColumn extends JDBCTableColumn<ExasolTableBase>
return false;
}
}
......@@ -44,6 +44,8 @@ public final class ExasolTableCache
+ " \"$ODBCJDBC\".\"ALL_COLUMNS\" c " + "where "
+ " table_schem = '%s'" + "order by "
+ " table_name,c.ordinal_position";
private static final String SQL_TABLES = "SELECT * FROM \"$ODBCJDBC\".ALL_TABLES WHERE TABLE_SCHEM = '%s' and TABLE_TYPE = 'TABLE' order by TABLE_NAME";
public ExasolTableCache()
{
......@@ -56,9 +58,15 @@ public final class ExasolTableCache
throws SQLException
{
JDBCDatabaseMetaData meta = session.getMetaData();
String sql = String.format(SQL_TABLES, exasolSchema.getName());
JDBCStatement dbstat = session.createStatement();
((JDBCStatementImpl) dbstat).setQueryString(sql);
return dbstat;
return meta.getTables("EXA_DB", exasolSchema.getName(), null,
new String[] { "TABLE" }).getSourceStatement();
}
@SuppressWarnings("rawtypes")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册