【GreatSQL优化器-11】finalize_table_conditions

【GreatSQL优化器-11】finalize_table_conditions

一、finalize_table_conditions介绍

GreatSQL的优化器在对join做完表排序后,在make_join_query_block函数对表添加条件,添加完条件在finalize_table_conditions会对条件再次进行确认,对ref扫描的条件进行删除,对需要cache的条件进行替换,生成的条件就是表执行查询最后用的条件。

下面用一个简单的例子来说明finalize_table_conditions做什么事情。

CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT,date1 DATETIME);
INSERT INTO t1 VALUES (1,10,'2021-03-25 16:44:00.123456'),(2,1,'2022-03-26 16:44:00.123456'),(3,4,'2023-03-27 16:44:00.123456'),(5,5,'2024-03-25 16:44:00.123456'),(7,null,'2020-03-25 16:44:00.123456'),(8,10,'2020-10-25 16:44:00.123456'),(11,16,'2023-03-25 16:44:00.123456');
CREATE TABLE t2 (cc1 INT PRIMARY KEY, cc2 INT);
INSERT INTO t2 VALUES (1,3),(2,1),(3,2),(4,3),(5,15);
CREATE TABLE t3 (ccc1 INT, ccc2 VARCHAR(100));
INSERT INTO t3 VALUES (1,'aa1'),(2,'bb1'),(3,'cc1'),(4,'dd1'),(null,'ee');
CREATE INDEX idx1 ON t1(c2);
CREATE INDEX idx2 ON t1(c2,date1);
CREATE INDEX idx2_1 ON t2(cc2);
CREATE INDEX idx3_1 ON t3(ccc1);

greatsql > EXPLAIN SELECT * FROM t1 JOIN t2 JOIN t3 ON t1.c1=t2.cc1 AND t1.c1=t3.ccc1 AND t3.ccc1<5;
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref       | rows | filtered | Extra       |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
|  1 | SIMPLE      | t1    | NULL       | range  | PRIMARY       | PRIMARY | 4       | NULL      |    3 |   100.00 | Using where |
|  1 | SIMPLE      | t2    | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | db1.t1.c1 |    1 |   100.00 | NULL        |
|  1 | SIMPLE      | t3    | NULL       | ref    | idx3_1        | idx3_1  | 5       | db1.t1.c1 |    1 |   100.00 | NULL        |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
          {
            "attaching_conditions_to_tables": {
              "original_condition": "((`t2`.`cc1` = `t1`.`c1`) and (`t3`.`ccc1` = `t1`.`c1`) and (`t1`.`c1` < 5))",
              "attached_conditions_computation": [
              ],
              "attached_conditions_summary": [
                {
                  "table": "`t1`",
                  "attached": "(`t1`.`c1` < 5)"
                },
                {
                  "table": "`t2`",
                  "attached": "(`t2`.`cc1` = `t1`.`c1`)"
                },
                {
                  "table": 
### 关于 CMake 工具链文件的配置 工具链文件(Toolchain File)用于指定交叉编译环境中的目标平台、编译器和其他构建选项。通过创建并设置 `CMAKE_TOOLCHAIN_FILE` 变量,可以自定义 CMake 的行为以适应特定的目标硬件架构。 #### 配置工具链文件的关键要素 以下是工具链文件的主要组成部分及其作用: 1. **系统名称和处理器** 定义目标系统的操作系统和处理器类型。这可以通过设置变量 `CMAKE_SYSTEM_NAME` 和 `CMAKE_SYSTEM_PROCESSOR` 来完成[^4]。 ```cmake set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) ``` 2. **编译器路径** 明确指定使用的编译器路径。对于 Java 开发而言,可能需要集成 JNI(Java Native Interface),因此需确保支持跨语言调用的编译器被正确定位[^5]。 ```cmake set(CMAKE_C_COMPILER /path/to/cross/compiler/gcc) set(CMAKE_CXX_COMPILER /path/to/cross/compiler/g++) ``` 3. **库和头文件目录** 如果项目依赖外部库(如 OpenCV 或其他第三方库),则应在工具链文件中声明这些资源的位置。例如,在处理图像识别时可能会涉及多个模块加载[^6]。 ```cmake link_directories(/usr/local/lib) include_directories(/usr/local/include/opencv4) ``` 4. **强制汇编程序编译器** 对于某些版本较低的 CMake (< 2.8.5),可能需要显式设定 ASM 编译器来满足需求[^7]。 ```cmake enable_language(ASM) set(CMAKE_ASM_COMPILER "nasm") # 替换为实际使用的汇编器名 ``` 5. **验证更新后的状态** 当修改完毕后,应当再次执行 CMake 命令确认无误警告信息显示出来[^8]。 ```bash cmake .. ``` #### 使用 Java 调用原生代码实例 当希望采用 Java 实现类似功能时,可通过 JNI 接口实现交互操作。下面给出一段简单的例子展示如何初始化以及释放内存空间等基本流程[^9]: ```java public class QRCodeDetector { static { System.loadLibrary("native-lib"); } private long nativePtr; public QRCodeDetector() { this.nativePtr = createQRCodeDetector(); } protected void finalize() throws Throwable { try { destroyQRCodeDetector(nativePtr); } finally { super.finalize(); } } public String detect(String imagePath) { return doDetect(nativePtr, imagePath); } private native long createQRCodeDetector(); private native void destroyQRCodeDetector(long ptr); private native String doDetect(long ptr, String path); } ``` 对应 C++ 中部分逻辑如下所示: ```cpp extern "C" JNIEXPORT jlong JNICALL Java_QRCodeDetector_createQRCodeDetector(JNIEnv *env, jobject thiz){ auto detector = new cv::wechat_qrcode::WeChatQRCode("model.prototxt", "model.caffemodel"); return reinterpret_cast<jlong>(detector); } extern "C" JNIEXPORT void JNICALL Java_QRCodeDetector_destroyQRCodeDetector(JNIEnv *env, jobject thiz, jlong ptr){ delete reinterpret_cast<cv::wechat_qrcode::WeChatQRCode*>(ptr); } extern "C" JNIEXPORT jstring JNICALL Java_QRCodeDetector_doDetect(JNIEnv* env, jobject thiz, jlong ptr, jstring imgPath){ const char* utf_string = env->GetStringUTFChars(imgPath, nullptr); Mat image = imread(utf_string); vector<String> results; reinterpret_cast<cv::wechat_qrcode::WeChatQRCode*>(ptr)->detectAndDecode(image, results); if (!results.empty()) { return env->NewStringUTF(results[0].c_str()); } else { return env->NewStringUTF(""); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值