greenplumn CEnumeratorConfig 源码

  • 2022-08-18
  • 浏览 (505)

greenplumn CEnumeratorConfig 代码

文件路径:/src/backend/gporca/libgpopt/include/gpopt/engine/CEnumeratorConfig.h

//---------------------------------------------------------------------------
//	Greenplum Database
//	Copyright (C) 2013 EMC Corp.
//
//	@filename:
//		CEnumeratorConfig.h
//
//	@doc:
//		Configurations of plan enumerator
//---------------------------------------------------------------------------
#ifndef GPOPT_CEnumeratorConfig_H
#define GPOPT_CEnumeratorConfig_H

#include "gpos/base.h"
#include "gpos/common/CDynamicPtrArray.h"
#include "gpos/common/CRefCount.h"

#include "gpopt/cost/CCost.h"
#include "naucrates/traceflags/traceflags.h"

#define GPOPT_UNBOUNDED_COST_THRESHOLD 0.0

namespace gpos
{
class CWStringDynamic;
}

namespace gpopt
{
using namespace gpos;

// fwd declarations
class CExpression;

// type definition of plan checker
using FnPlanChecker = BOOL(CExpression *);

//---------------------------------------------------------------------------
//	@class:
//		CEnumeratorConfig
//
//	@doc:
//		Configurations of plan enumerator
//
//---------------------------------------------------------------------------
class CEnumeratorConfig : public CRefCount
{
private:
	//---------------------------------------------------------------------------
	//	@class:
	//		SSamplePlan
	//
	//	@doc:
	//		Internal structure to represent samples of plan space
	//
	//---------------------------------------------------------------------------
	struct SSamplePlan
	{
	private:
		// plan id
		ULLONG m_plan_id;

		// plan cost
		CCost m_cost;

	public:
		// ctor
		SSamplePlan(ULLONG plan_id, CCost cost)
			: m_plan_id(plan_id), m_cost(cost)
		{
		}

		// dtor
		virtual ~SSamplePlan() = default;

		// return plan id
		ULLONG
		GetPlanId() const
		{
			return m_plan_id;
		}

		// return plan cost
		CCost
		Cost() const
		{
			return m_cost;
		}

	};	// struct SSamplePlan

	// array og unsigned long long int
	using SSamplePlanArray = CDynamicPtrArray<SSamplePlan, CleanupDelete>;

	// memory pool
	CMemoryPool *m_mp;

	// identifier of chosen plan
	ULLONG m_plan_id;

	// size of plan space
	ULLONG m_ullSpaceSize;

	// number of required samples
	ULLONG m_ullInputSamples;

	// cost of best plan found
	CCost m_costBest;

	// max cost of a created plan sample
	CCost m_costMax;

	// max cost of accepted samples as a ratio to best plan cost
	CDouble m_dCostThreshold;

	// sampled plans
	SSamplePlanArray *m_pdrgpsp;

	// step value used in fitting cost distribution
	CDouble m_dStep;

	// x-values of fitted cost distribution
	DOUBLE *m_pdX;

	// y-values of fitted cost distribution
	DOUBLE *m_pdY;

	// size of fitted cost distribution
	ULONG m_ulDistrSize;

	// restrict plan sampling to plans satisfying required properties
	BOOL m_fSampleValidPlans;

	// plan checker function
	FnPlanChecker *m_pfpc;

	// initialize size of cost distribution
	void InitCostDistrSize();

	// compute Gaussian probability value
	static DOUBLE DGaussian(DOUBLE d, DOUBLE dMean, DOUBLE dStd);

public:
	CEnumeratorConfig(const CEnumeratorConfig &) = delete;

	// ctor
	CEnumeratorConfig(CMemoryPool *mp, ULLONG plan_id, ULLONG ullSamples,
					  CDouble cost_threshold = GPOPT_UNBOUNDED_COST_THRESHOLD);

	// dtor
	~CEnumeratorConfig() override;

	// return plan id
	ULLONG
	GetPlanId() const
	{
		return m_plan_id;
	}

	// return enumerated space size
	ULLONG
	GetPlanSpaceSize() const
	{
		return m_ullSpaceSize;
	}

	// set plan space size
	void
	SetPlanSpaceSize(ULLONG ullSpaceSize)
	{
		m_ullSpaceSize = ullSpaceSize;
	}

	// return number of required samples
	ULLONG
	UllInputSamples() const
	{
		return m_ullInputSamples;
	}

	// return number of created samples
	ULONG
	UlCreatedSamples() const
	{
		return m_pdrgpsp->Size();
	}

	// set plan id
	void
	SetPlanId(ULLONG plan_id)
	{
		m_plan_id = plan_id;
	}

	// return cost threshold
	CDouble
	DCostThreshold() const
	{
		return m_dCostThreshold;
	}

	// return id of a plan sample
	ULLONG
	UllPlanSample(ULONG ulPos) const
	{
		return (*m_pdrgpsp)[ulPos]->GetPlanId();
	}

	// set cost of best plan found
	void
	SetBestCost(CCost cost)
	{
		m_costBest = cost;
	}

	// return cost of best plan found
	CCost
	CostBest() const
	{
		return m_costBest;
	}

	// return cost of a plan sample
	CCost
	CostPlanSample(ULONG ulPos) const
	{
		return (*m_pdrgpsp)[ulPos]->Cost();
	}

	// add a new plan to sample
	BOOL FAddSample(ULLONG plan_id, CCost cost);

	// clear samples
	void ClearSamples();

	// return x-value of cost distribution
	CDouble DCostDistrX(ULONG ulPos) const;

	// return y-value of cost distribution
	CDouble DCostDistrY(ULONG ulPos) const;

	// fit cost distribution on generated samples
	void FitCostDistribution();

	// return size of fitted cost distribution
	ULONG
	UlCostDistrSize() const
	{
		return m_ulDistrSize;
	}

	// is enumeration enabled?
	static BOOL
	FEnumerate()
	{
		return GPOS_FTRACE(EopttraceEnumeratePlans);
	}

	// is sampling enabled?
	static BOOL
	FSample()
	{
		return GPOS_FTRACE(EopttraceSamplePlans);
	}

	// return plan checker function
	FnPlanChecker *
	Pfpc() const
	{
		return m_pfpc;
	}

	// set plan checker function
	void
	SetPlanChecker(FnPlanChecker *pfpc)
	{
		GPOS_ASSERT(nullptr != pfpc);

		m_pfpc = pfpc;
	}

	// restrict sampling to plans satisfying required properties
	// we need to change settings for testing
	void
	SetSampleValidPlans(BOOL fSampleValidPlans)
	{
		m_fSampleValidPlans = fSampleValidPlans;
	}

	// return true if sampling can only generate valid plans
	BOOL
	FSampleValidPlans() const
	{
		return m_fSampleValidPlans;
	}

	// check given plan using PlanChecker function
	BOOL
	FCheckPlan(CExpression *pexpr) const
	{
		GPOS_ASSERT(nullptr != pexpr);

		if (nullptr != m_pfpc)
		{
			return m_pfpc(pexpr);
		}

		return true;
	}

	// dump samples to an output file
	void DumpSamples(CWStringDynamic *str, ULONG ulSessionId,
					 ULONG ulCommandId);

	// dump fitted cost distribution to an output file
	void DumpCostDistr(CWStringDynamic *str, ULONG ulSessionId,
					   ULONG ulCommandId);

	// print ids of plans in the generated sample
	void PrintPlanSample() const;

	// compute Gaussian kernel density
	static void GussianKernelDensity(const DOUBLE *pdObervationX,
									 const DOUBLE *pdObervationY,
									 ULONG ulObservations, const DOUBLE *pdX,
									 DOUBLE *pdY, ULONG size);

	// generate default enumerator configurations
	static CEnumeratorConfig *
	PecDefault(CMemoryPool *mp)
	{
		return GPOS_NEW(mp)
			CEnumeratorConfig(mp, 0 /*plan_id*/, 0 /*ullSamples*/);
	}

	// generate enumerator configuration for a given plan id
	static CEnumeratorConfig *
	GetEnumeratorCfg(CMemoryPool *mp, ULLONG plan_id)
	{
		return GPOS_NEW(mp) CEnumeratorConfig(mp, plan_id, 0 /*ullSamples*/);
	}


};	// class CEnumeratorConfig

}  // namespace gpopt

#endif	// !GPOPT_CEnumeratorConfig_H


// EOF

相关信息

greenplumn 源码目录

相关文章

greenplumn CCTEConfig 源码

greenplumn CEngine 源码

greenplumn CHint 源码

greenplumn CPartialPlan 源码

greenplumn CStatisticsConfig 源码

0  赞