中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

正規(guī)網(wǎng)站建設建設公司做網(wǎng)站seo優(yōu)化

正規(guī)網(wǎng)站建設建設公司,做網(wǎng)站seo優(yōu)化,個人網(wǎng)站備案通過后,淮北住房和城鄉(xiāng)建設局門戶網(wǎng)站基于規(guī)則的查詢優(yōu)化 基于規(guī)則的查詢優(yōu)化(Rule-based Query Optimization)是一種通過應用一系列預定義的規(guī)則來優(yōu)化查詢計劃的技術(shù)。這些規(guī)則描述了如何轉(zhuǎn)換關(guān)系表達式,以提高查詢執(zhí)行的效率?;谝?guī)則的優(yōu)化器并不依賴于統(tǒng)計信息&#xff0c…

基于規(guī)則的查詢優(yōu)化

基于規(guī)則的查詢優(yōu)化(Rule-based Query Optimization)是一種通過應用一系列預定義的規(guī)則來優(yōu)化查詢計劃的技術(shù)。這些規(guī)則描述了如何轉(zhuǎn)換關(guān)系表達式,以提高查詢執(zhí)行的效率。基于規(guī)則的優(yōu)化器并不依賴于統(tǒng)計信息,而是通過模式匹配和規(guī)則應用來改進查詢計劃。

  • 規(guī)則(Rules): 規(guī)則是優(yōu)化器用來轉(zhuǎn)換關(guān)系表達式的基本單位。每條規(guī)則定義了一個模式(Pattern)和一個轉(zhuǎn)換(Transformation)。當優(yōu)化器檢測到關(guān)系表達式中匹配該模式的部分時,就會應用相應的轉(zhuǎn)換。

  • 模式匹配(Pattern Matching): 優(yōu)化器會遍歷關(guān)系表達式樹,并嘗試找到與規(guī)則模式匹配的部分。一旦找到匹配的部分,就會應用相應的轉(zhuǎn)換。

  • 轉(zhuǎn)換(Transformation): 轉(zhuǎn)換是對匹配模式的關(guān)系表達式進行修改的操作。轉(zhuǎn)換后的表達式通常會具有更高的執(zhí)行效率。

  • 優(yōu)化器(Optimizer): 優(yōu)化器是應用規(guī)則的引擎。Apache Calcite中有多種優(yōu)化器實現(xiàn),如HepPlanner(基于規(guī)則的優(yōu)化器)和VolcanoPlanner(基于代價的優(yōu)化器)。

Calcite中的規(guī)則RelOptRule

RelOptRule 是 Apache Calcite 中用于定義查詢優(yōu)化規(guī)則的基類。通過繼承 RelOptRule,可以創(chuàng)建自定義的優(yōu)化規(guī)則,以便在查詢優(yōu)化過程中應用這些規(guī)則。以下是對 RelOptRule 及其常見子類的詳細介紹。

  • RelOptRule: RelOptRule 是一個抽象類,用于定義查詢優(yōu)化規(guī)則。每個規(guī)則包含一個模式(Pattern),用于匹配關(guān)系表達式樹中的特定結(jié)構(gòu)。當優(yōu)化器檢測到關(guān)系表達式中匹配該模式的部分時,就會應用相應的轉(zhuǎn)換。

構(gòu)造函數(shù)

  • operand:定義規(guī)則匹配的模式。
  • description:規(guī)則的描述,用于調(diào)試和日志記錄。
protected RelOptRule(RelOptRuleOperand operand, String description)

主要方法

  • onMatch(RelOptRuleCall call):當規(guī)則的模式匹配成功時調(diào)用,用于執(zhí)行具體的轉(zhuǎn)換邏輯。
  • matches(RelOptRuleCall call):檢查規(guī)則是否適用于當前的匹配上下文,默認實現(xiàn)返回 true。
    toString():返回規(guī)則的描述信息。

RelOptRule的常用子類簡介

  • ProjectFilterTransposeRule:ProjectFilterTransposeRule 將 Project 操作下推到 Filter 之后,從而減少不必要的數(shù)據(jù)傳輸和處理。
  • FilterJoinRule:FilterJoinRule 將 Filter 操作下推到 Join 之前,或者將過濾條件分解并分別應用到連接的兩側(cè)。
  • JoinCommuteRule:JoinCommuteRule 交換 Join 操作的左右輸入,從而可能找到更優(yōu)的連接順序。

CoreRules

CoreRules 是 Apache Calcite 提供的一組默認的優(yōu)化規(guī)則集合。這些規(guī)則覆蓋了常見的查詢優(yōu)化場景,如投影下推、謂詞下推、連接重排序等。CoreRules 中的規(guī)則大多是通過繼承 RelRule 或其子類來實現(xiàn)的。

/** Rule that recognizes an {@link Aggregate}* on top of a {@link Project} and if possible* aggregates through the Project or removes the Project. */public static final AggregateProjectMergeRule AGGREGATE_PROJECT_MERGE =AggregateProjectMergeRule.Config.DEFAULT.toRule();/** Rule that removes constant keys from an {@link Aggregate}. */public static final AggregateProjectPullUpConstantsRuleAGGREGATE_PROJECT_PULL_UP_CONSTANTS =AggregateProjectPullUpConstantsRule.Config.DEFAULT.toRule();/** More general form of {@link #AGGREGATE_PROJECT_PULL_UP_CONSTANTS}* that matches any relational expression. */public static final AggregateProjectPullUpConstantsRuleAGGREGATE_ANY_PULL_UP_CONSTANTS =AggregateProjectPullUpConstantsRule.Config.DEFAULT.withOperandFor(LogicalAggregate.class, RelNode.class).toRule();

HepPlanner

在Apache Calcite中,HepPlanner 是 RelOptPlanner 接口的一個啟發(fā)式(heuristic)實現(xiàn)。這里的“啟發(fā)式”具體指的是使用啟發(fā)式方法來指導查詢優(yōu)化過程,而不是基于全面的成本模型來評估每一個可能的查詢計劃。啟發(fā)式方法通常依賴于規(guī)則和經(jīng)驗法則(heuristics)來快速找到一個足夠好的解決方案,而不是最優(yōu)解。

啟發(fā)式方法在計算機科學中通常指的是通過經(jīng)驗法則、直覺或啟發(fā)式規(guī)則來解決問題的方法。這些方法不保證找到最優(yōu)解,但通常能夠在合理的時間內(nèi)找到一個較好的解決方案。啟發(fā)式方法在查詢優(yōu)化中尤其重要,因為查詢優(yōu)化問題通常是NP難題,全面搜索所有可能的查詢計劃是不可行的。

一個基于規(guī)則變換的案例

要優(yōu)化的Sql如下,我們將使用下推規(guī)則ProjectFilterTransposeRule來進行優(yōu)化

"SELECT age FROM your_table WHERE age > 30";

org.apache.calcite.rel.rules.ProjectFilterTransposeRule 規(guī)則含義

Rule that pushes a Project past a Filter.

將投影下推到過濾操作之后。這里的“之后”并不是指執(zhí)行順序上的“之后”,而是指在查詢計劃樹結(jié)構(gòu)中的位置變化。具體來說,這意味著在查詢計劃樹中,Project 操作會被移動到 Filter 操作的下方(即子節(jié)點),從而在邏輯上首先進行投影操作,然后再進行過濾操作。

原查詢計劃
LogicalProject(a=[$0], b=[$1])LogicalFilter(condition=[=($0, 'b')])LogicalTableScan(table=[[c]])下推后的查詢計劃
LogicalFilter(condition=[=($0, 'b')])LogicalProject(a=[$0], b=[$1])LogicalTableScan(table=[[c]])

Java演示代碼

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import org.apache.calcite.config.Lex;
import org.apache.calcite.jdbc.CalciteConnection;
import org.apache.calcite.plan.hep.HepPlanner;
import org.apache.calcite.plan.hep.HepProgram;
import org.apache.calcite.plan.hep.HepProgramBuilder;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.RelRoot;
import org.apache.calcite.rel.rel2sql.RelToSqlConverter;
import org.apache.calcite.rel.rel2sql.SqlImplementor.Result;
import org.apache.calcite.rel.rules.CoreRules;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.schema.Schema;
import org.apache.calcite.schema.SchemaPlus;
import org.apache.calcite.schema.Table;
import org.apache.calcite.schema.impl.AbstractSchema;
import org.apache.calcite.schema.impl.AbstractTable;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.dialect.MysqlSqlDialect;
import org.apache.calcite.sql.parser.SqlParser;
import org.apache.calcite.sql.pretty.SqlPrettyWriter;
import org.apache.calcite.sql.validate.SqlConformanceEnum;
import org.apache.calcite.tools.FrameworkConfig;
import org.apache.calcite.tools.Frameworks;
import org.apache.calcite.tools.Planner;
import org.junit.Test;/****/
public class OptSqlByRelNode2 {@Testpublic void testSqlToRelNode2() throws Exception{// 1. 設置內(nèi)存數(shù)據(jù)庫連接Properties info = new Properties();Connection connection = DriverManager.getConnection("jdbc:calcite:", info);CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);// 2. 創(chuàng)建自定義SchemaSchemaPlus rootSchema = calciteConnection.getRootSchema();Schema schema = new AbstractSchema() {};rootSchema.add("MY_SCHEMA", schema);// 3. 添加表到自定義SchemaTable yourTable = new AbstractTable() {@Overridepublic RelDataType getRowType(RelDataTypeFactory typeFactory) {// 如果要動態(tài)分析表,那么就自己去創(chuàng)建return typeFactory.builder().add("id", typeFactory.createJavaType(int.class)).add("name", typeFactory.createJavaType(String.class)).add("age", typeFactory.createJavaType(int.class)).build();}};// 3. 添加表到自定義SchemaTable department_table = new AbstractTable() {@Overridepublic RelDataType getRowType(RelDataTypeFactory typeFactory) {// 如果要動態(tài)分析表,那么就自己去創(chuàng)建return typeFactory.builder().add("id", typeFactory.createJavaType(int.class)).add("department", typeFactory.createJavaType(String.class)).add("location", typeFactory.createJavaType(String.class)).build();}};rootSchema.getSubSchema("MY_SCHEMA").add("your_table", yourTable);rootSchema.getSubSchema("MY_SCHEMA").add("department_table", department_table);// 4. 配置SQL解析器SqlParser.Config parserConfig = SqlParser.config().withLex(Lex.MYSQL).withConformance(SqlConformanceEnum.MYSQL_5);// 5. 配置框架FrameworkConfig config = Frameworks.newConfigBuilder().parserConfig(parserConfig).defaultSchema(rootSchema.getSubSchema("MY_SCHEMA")) // 使用自定義Schema.build();// 6. 創(chuàng)建Planner實例Planner planner = Frameworks.getPlanner(config);// 7. 解析SQLString sql = "SELECT age FROM your_table WHERE age > 30";
//        String sql = "SELECT * FROM your_table where id = 1 and name = 'you_name'";SqlNode sqlNode = planner.parse(sql);// 8. 驗證SQLSqlNode validatedSqlNode = planner.validate(sqlNode);// 9. 轉(zhuǎn)換為關(guān)系表達式RelRoot relRoot = planner.rel(validatedSqlNode);// 10. 獲取RelNodeRelNode rootRelNode = relRoot.rel;// 打印RelNode的信息System.out.println(rootRelNode.explain());// 創(chuàng)建HepProgramHepProgram hepProgram = new HepProgramBuilder()
//            .addRuleInstance(CoreRules.FILTER_PROJECT_TRANSPOSE)
//            .addRuleInstance(CoreRules.FILTER_INTO_JOIN)
//            .addRuleInstance(CoreRules.FILTER_AGGREGATE_TRANSPOSE)
//            .addRuleInstance(CoreRules.FILTER_SET_OP_TRANSPOSE).addRuleInstance(CoreRules.PROJECT_FILTER_TRANSPOSE)
//            .addRuleInstance(CoreRules.PROJECT_JOIN_TRANSPOSE).build();// 創(chuàng)建HepPlannerHepPlanner hepPlanner = new HepPlanner(hepProgram);// 設置根RelNodehepPlanner.setRoot(rootRelNode);// 進行優(yōu)化RelNode optimizedRelNode = hepPlanner.findBestExp();// 輸出優(yōu)化后的RelNodeSystem.out.println("優(yōu)化后的RelNode: \n" + optimizedRelNode.explain());// 10. 使用RelToSqlConverter將優(yōu)化后的RelNode轉(zhuǎn)換回SQLRelToSqlConverter relToSqlConverter = new RelToSqlConverter(MysqlSqlDialect.DEFAULT);Result result = relToSqlConverter.visitRoot(optimizedRelNode);SqlNode sqlNodeConverted = result.asStatement();// 11. 使用SqlPrettyWriter格式化SQLSqlPrettyWriter writer = new SqlPrettyWriter();String convertedSql = writer.format(sqlNodeConverted);// 輸出轉(zhuǎn)換后的SQLSystem.out.println("優(yōu)化后的SQL: " + convertedSql);// 關(guān)閉連接connection.close();}
}

轉(zhuǎn)換后的Sql

SQL: SELECT *
FROM (SELECT "age"FROM "MY_SCHEMA"."your_table") AS "t"
WHERE "age" > 30

變換后的關(guān)系表達式

LogicalFilter(condition=[>($0, 30)])LogicalProject(age=[$2])LogicalTableScan(table=[[MY_SCHEMA, your_table]])

總結(jié)

使用HepPlanner基于規(guī)則對Sql進行優(yōu)化,最終產(chǎn)生優(yōu)化后的關(guān)系表達式

http://www.risenshineclean.com/news/12095.html

相關(guān)文章:

  • vscode 網(wǎng)站開發(fā)專業(yè)網(wǎng)絡推廣公司
  • 做藥物研發(fā)的人上什么網(wǎng)站seo發(fā)外鏈的網(wǎng)站
  • 做百度移動端網(wǎng)站軟件下載江門關(guān)鍵詞優(yōu)化公司
  • 網(wǎng)站服務器異常是什么意思云南seo網(wǎng)站關(guān)鍵詞優(yōu)化軟件
  • 組建網(wǎng)站 多少錢南京seo域名
  • 上海集團網(wǎng)站建設公司如何做企業(yè)產(chǎn)品推廣
  • 哪個網(wǎng)站可以做頭像的免費建站模板
  • 私服網(wǎng)站建設長沙seo男團
  • 鄭州網(wǎng)站建設首選創(chuàng)新網(wǎng)絡網(wǎng)站推廣優(yōu)化
  • 廣州建設網(wǎng)站的公司酒店網(wǎng)絡營銷推廣方式
  • 河北省建設監(jiān)理協(xié)會網(wǎng)站外鏈平臺有哪些
  • 做網(wǎng)站送郵箱中文域名
  • 自己的網(wǎng)站做彈出廣告app推廣方式有哪些
  • 網(wǎng)站及網(wǎng)頁設計費用市場營銷策劃公司排名
  • 河南的網(wǎng)絡推廣公司專業(yè)黑帽seo推廣
  • 越秀區(qū)網(wǎng)站建設寧波seo搜索引擎優(yōu)化公司
  • 電商網(wǎng)站技術(shù)方案阿里指數(shù)官網(wǎng)最新版本
  • wordpress邊下邊看seo權(quán)重優(yōu)化軟件
  • 網(wǎng)站里面如何做下載的app全國31省市疫情最新消息今天
  • html電子商務網(wǎng)站模板百度信息流推廣教程
  • 網(wǎng)站做支付功能培訓計劃和培訓內(nèi)容
  • 用自己的電腦做網(wǎng)站需要備案嗎旅游最新資訊
  • 網(wǎng)站建設jutuibao線上推廣的渠道和方法
  • 媒體公司網(wǎng)站模板百度指數(shù)1000搜索量有多少
  • 怎么做網(wǎng)站像淘寶這樣的免費發(fā)布產(chǎn)品信息的網(wǎng)站
  • 廣州的一起做網(wǎng)站網(wǎng)絡軟文廣告
  • 幫客戶做網(wǎng)站內(nèi)容網(wǎng)頁關(guān)鍵詞排名優(yōu)化
  • 免費自助建站系統(tǒng)平臺 貼吧網(wǎng)站分析工具
  • 廣州網(wǎng)站設計我選刻在線識別圖片來源
  • 自貢做網(wǎng)站的公司百度官網(wǎng)認證申請