Search in sources :

Example 1 with GuidePostsKey

use of org.apache.phoenix.schema.stats.GuidePostsKey in project phoenix by apache.

the class MetaDataClient method updateStatisticsInternal.

private long updateStatisticsInternal(PName physicalName, PTable logicalTable, Map<String, Object> statsProps, List<byte[]> cfs) throws SQLException {
    ReadOnlyProps props = connection.getQueryServices().getProps();
    final long msMinBetweenUpdates = props.getLong(QueryServices.MIN_STATS_UPDATE_FREQ_MS_ATTRIB, props.getLong(QueryServices.STATS_UPDATE_FREQ_MS_ATTRIB, QueryServicesOptions.DEFAULT_STATS_UPDATE_FREQ_MS) / 2);
    byte[] tenantIdBytes = ByteUtil.EMPTY_BYTE_ARRAY;
    Long scn = connection.getSCN();
    // Always invalidate the cache
    long clientTimeStamp = connection.getSCN() == null ? HConstants.LATEST_TIMESTAMP : scn;
    String query = "SELECT CURRENT_DATE()," + LAST_STATS_UPDATE_TIME + " FROM " + PhoenixDatabaseMetaData.SYSTEM_STATS_NAME + " WHERE " + PHYSICAL_NAME + "='" + physicalName.getString() + "' AND " + COLUMN_FAMILY + " IS NULL AND " + LAST_STATS_UPDATE_TIME + " IS NOT NULL";
    ResultSet rs = connection.createStatement().executeQuery(query);
    long msSinceLastUpdate = Long.MAX_VALUE;
    if (rs.next()) {
        msSinceLastUpdate = rs.getLong(1) - rs.getLong(2);
    }
    long rowCount = 0;
    if (msSinceLastUpdate >= msMinBetweenUpdates) {
        /*
             * Execute a COUNT(*) through PostDDLCompiler as we need to use the logicalTable passed through,
             * since it may not represent a "real" table in the case of the view indexes of a base table.
             */
        PostDDLCompiler compiler = new PostDDLCompiler(connection);
        //even if table is transactional, while calculating stats we scan the table non-transactionally to
        //view all the data belonging to the table
        PTable nonTxnLogicalTable = new DelegateTable(logicalTable) {

            @Override
            public boolean isTransactional() {
                return false;
            }
        };
        TableRef tableRef = new TableRef(null, nonTxnLogicalTable, clientTimeStamp, false);
        MutationPlan plan = compiler.compile(Collections.singletonList(tableRef), null, cfs, null, clientTimeStamp);
        Scan scan = plan.getContext().getScan();
        scan.setCacheBlocks(false);
        scan.setAttribute(ANALYZE_TABLE, TRUE_BYTES);
        boolean runUpdateStatsAsync = props.getBoolean(QueryServices.RUN_UPDATE_STATS_ASYNC, DEFAULT_RUN_UPDATE_STATS_ASYNC);
        scan.setAttribute(RUN_UPDATE_STATS_ASYNC_ATTRIB, runUpdateStatsAsync ? TRUE_BYTES : FALSE_BYTES);
        if (statsProps != null) {
            Object gp_width = statsProps.get(QueryServices.STATS_GUIDEPOST_WIDTH_BYTES_ATTRIB);
            if (gp_width != null) {
                scan.setAttribute(BaseScannerRegionObserver.GUIDEPOST_WIDTH_BYTES, PLong.INSTANCE.toBytes(gp_width));
            }
            Object gp_per_region = statsProps.get(QueryServices.STATS_GUIDEPOST_PER_REGION_ATTRIB);
            if (gp_per_region != null) {
                scan.setAttribute(BaseScannerRegionObserver.GUIDEPOST_PER_REGION, PInteger.INSTANCE.toBytes(gp_per_region));
            }
        }
        MutationState mutationState = plan.execute();
        rowCount = mutationState.getUpdateCount();
    }
    /*
         *  Update the stats table so that client will pull the new one with the updated stats.
         *  Even if we don't run the command due to the last update time, invalidate the cache.
         *  This supports scenarios in which a major compaction was manually initiated and the
         *  client wants the modified stats to be reflected immediately.
         */
    if (cfs == null) {
        List<PColumnFamily> families = logicalTable.getColumnFamilies();
        if (families.isEmpty()) {
            connection.getQueryServices().invalidateStats(new GuidePostsKey(physicalName.getBytes(), SchemaUtil.getEmptyColumnFamily(logicalTable)));
        } else {
            for (PColumnFamily family : families) {
                connection.getQueryServices().invalidateStats(new GuidePostsKey(physicalName.getBytes(), family.getName().getBytes()));
            }
        }
    } else {
        for (byte[] cf : cfs) {
            connection.getQueryServices().invalidateStats(new GuidePostsKey(physicalName.getBytes(), cf));
        }
    }
    return rowCount;
}
Also used : GuidePostsKey(org.apache.phoenix.schema.stats.GuidePostsKey) PostDDLCompiler(org.apache.phoenix.compile.PostDDLCompiler) MutationPlan(org.apache.phoenix.compile.MutationPlan) ReadOnlyProps(org.apache.phoenix.util.ReadOnlyProps) MutationState(org.apache.phoenix.execute.MutationState) PUnsignedLong(org.apache.phoenix.schema.types.PUnsignedLong) PLong(org.apache.phoenix.schema.types.PLong) ResultSet(java.sql.ResultSet) Scan(org.apache.hadoop.hbase.client.Scan)

Example 2 with GuidePostsKey

use of org.apache.phoenix.schema.stats.GuidePostsKey in project phoenix by apache.

the class TestUtil method getGuidePostsList.

public static Collection<GuidePostsInfo> getGuidePostsList(Connection conn, String tableName, String pkCol, byte[] lowerRange, byte[] upperRange, String whereClauseSuffix) throws SQLException {
    String whereClauseStart = (lowerRange == null && upperRange == null ? "" : " WHERE " + ((lowerRange != null ? (pkCol + " >= ? " + (upperRange != null ? " AND " : "")) : "") + (upperRange != null ? (pkCol + " < ?") : "")));
    String whereClause = whereClauseSuffix == null ? whereClauseStart : whereClauseStart.length() == 0 ? (" WHERE " + whereClauseSuffix) : (" AND " + whereClauseSuffix);
    String query = "SELECT /*+ NO_INDEX */ COUNT(*) FROM " + tableName + whereClause;
    PhoenixPreparedStatement pstmt = conn.prepareStatement(query).unwrap(PhoenixPreparedStatement.class);
    if (lowerRange != null) {
        pstmt.setBytes(1, lowerRange);
    }
    if (upperRange != null) {
        pstmt.setBytes(lowerRange != null ? 2 : 1, upperRange);
    }
    pstmt.execute();
    TableRef tableRef = pstmt.getQueryPlan().getTableRef();
    PhoenixConnection pconn = conn.unwrap(PhoenixConnection.class);
    PTable table = tableRef.getTable();
    GuidePostsInfo info = pconn.getQueryServices().getTableStats(new GuidePostsKey(table.getName().getBytes(), SchemaUtil.getEmptyColumnFamily(table)));
    return Collections.singletonList(info);
}
Also used : PhoenixConnection(org.apache.phoenix.jdbc.PhoenixConnection) GuidePostsKey(org.apache.phoenix.schema.stats.GuidePostsKey) GuidePostsInfo(org.apache.phoenix.schema.stats.GuidePostsInfo) PhoenixPreparedStatement(org.apache.phoenix.jdbc.PhoenixPreparedStatement) TableRef(org.apache.phoenix.schema.TableRef) PTable(org.apache.phoenix.schema.PTable)

Example 3 with GuidePostsKey

use of org.apache.phoenix.schema.stats.GuidePostsKey in project phoenix by apache.

the class BaseResultIterators method getGuidePosts.

private GuidePostsInfo getGuidePosts() throws SQLException {
    if (!useStats() || !StatisticsUtil.isStatsEnabled(TableName.valueOf(physicalTableName))) {
        return GuidePostsInfo.NO_GUIDEPOST;
    }
    TreeSet<byte[]> whereConditions = new TreeSet<byte[]>(Bytes.BYTES_COMPARATOR);
    for (Pair<byte[], byte[]> where : context.getWhereConditionColumns()) {
        byte[] cf = where.getFirst();
        if (cf != null) {
            whereConditions.add(cf);
        }
    }
    PTable table = getTable();
    byte[] defaultCF = SchemaUtil.getEmptyColumnFamily(getTable());
    byte[] cf = null;
    if (!table.getColumnFamilies().isEmpty() && !whereConditions.isEmpty()) {
        for (Pair<byte[], byte[]> where : context.getWhereConditionColumns()) {
            byte[] whereCF = where.getFirst();
            if (Bytes.compareTo(defaultCF, whereCF) == 0) {
                cf = defaultCF;
                break;
            }
        }
        if (cf == null) {
            cf = context.getWhereConditionColumns().get(0).getFirst();
        }
    }
    if (cf == null) {
        cf = defaultCF;
    }
    GuidePostsKey key = new GuidePostsKey(physicalTableName, cf);
    return context.getConnection().getQueryServices().getTableStats(key);
}
Also used : GuidePostsKey(org.apache.phoenix.schema.stats.GuidePostsKey) TreeSet(java.util.TreeSet) PTable(org.apache.phoenix.schema.PTable)

Example 4 with GuidePostsKey

use of org.apache.phoenix.schema.stats.GuidePostsKey in project phoenix by apache.

the class StatsCollectorIT method invalidateStats.

private static void invalidateStats(Connection conn, String tableName) throws SQLException {
    PTable ptable = conn.unwrap(PhoenixConnection.class).getMetaDataCache().getTableRef(new PTableKey(null, tableName)).getTable();
    byte[] name = ptable.getPhysicalName().getBytes();
    conn.unwrap(PhoenixConnection.class).getQueryServices().invalidateStats(new GuidePostsKey(name, SchemaUtil.getEmptyColumnFamily(ptable)));
}
Also used : PhoenixConnection(org.apache.phoenix.jdbc.PhoenixConnection) GuidePostsKey(org.apache.phoenix.schema.stats.GuidePostsKey) PTableKey(org.apache.phoenix.schema.PTableKey) PTable(org.apache.phoenix.schema.PTable)

Example 5 with GuidePostsKey

use of org.apache.phoenix.schema.stats.GuidePostsKey in project phoenix by apache.

the class GuidePostsCache method invalidateAll.

public void invalidateAll(PTable table) {
    byte[] physicalName = table.getPhysicalName().getBytes();
    List<PColumnFamily> families = table.getColumnFamilies();
    if (families.isEmpty()) {
        invalidate(new GuidePostsKey(physicalName, SchemaUtil.getEmptyColumnFamily(table)));
    } else {
        for (PColumnFamily family : families) {
            invalidate(new GuidePostsKey(physicalName, family.getName().getBytes()));
        }
    }
}
Also used : GuidePostsKey(org.apache.phoenix.schema.stats.GuidePostsKey) PColumnFamily(org.apache.phoenix.schema.PColumnFamily)

Aggregations

GuidePostsKey (org.apache.phoenix.schema.stats.GuidePostsKey)8 PTable (org.apache.phoenix.schema.PTable)4 PhoenixConnection (org.apache.phoenix.jdbc.PhoenixConnection)3 ReadOnlyProps (org.apache.phoenix.util.ReadOnlyProps)3 ResultSet (java.sql.ResultSet)2 Scan (org.apache.hadoop.hbase.client.Scan)2 MutationPlan (org.apache.phoenix.compile.MutationPlan)2 PostDDLCompiler (org.apache.phoenix.compile.PostDDLCompiler)2 MutationState (org.apache.phoenix.execute.MutationState)2 PTableKey (org.apache.phoenix.schema.PTableKey)2 GuidePostsInfo (org.apache.phoenix.schema.stats.GuidePostsInfo)2 PLong (org.apache.phoenix.schema.types.PLong)2 PUnsignedLong (org.apache.phoenix.schema.types.PUnsignedLong)2 IOException (java.io.IOException)1 Connection (java.sql.Connection)1 PreparedStatement (java.sql.PreparedStatement)1 ArrayList (java.util.ArrayList)1 Properties (java.util.Properties)1 TreeSet (java.util.TreeSet)1 HColumnDescriptor (org.apache.hadoop.hbase.HColumnDescriptor)1