优化下列sql: INSERT INTO borrow_order_2017(id, order_no, borrow_id, glc, libcode, rdid, create_time, should_revert_time, revert_time, status) SELECT * from borrow_order where IF((SUBSTR(borrow_id,1,1) REGEXP '[^0-9.]') = 1,substring(borrow_id,2,4),substring(borrow_id,1,4)) = 2017
时间: 2024-02-15 18:03:38 浏览: 25
可以尝试使用以下优化方法:
1. 使用批量插入语法,将多个INSERT语句合并成一个,可以减少网络通信的次数和开销,提高效率。
2. 在SELECT语句中使用具体的列名代替“SELECT *”,可以避免不必要的列的查询和传输。
3. 在WHERE语句中使用函数索引或者建立虚拟列,可以加快查询速度。
优化后的SQL如下所示:
```
INSERT INTO borrow_order_2017(id, order_no, borrow_id, glc, libcode, rdid, create_time, should_revert_time, revert_time, status)
SELECT id, order_no, borrow_id, glc, libcode, rdid, create_time, should_revert_time, revert_time, status
FROM borrow_order
WHERE SUBSTR(borrow_id,1,1) REGEXP '[^0-9.]' = 1 AND SUBSTR(borrow_id,2,4) = '2017'
OR SUBSTR(borrow_id,1,4) = '2017';
```
这里使用了具体的列名,将IF函数替换为OR语句,并将正则表达式替换为字符串匹配,可以加快查询速度。同时,可以考虑为borrow_id列建立函数索引或者虚拟列,以进一步提高查询速度。
相关问题
INSERT INTO borrow_order_2017 ( id, order_no, borrow_id, glc, libcode, rdid, create_time, should_revert_time, revert_time, status ) SELECT id, order_no, borrow_id, glc, libcode, rdid, create_time, should_revert_time, revert_time, status FROM borrow_order WHERE SUBSTR( borrow_id, 1, 1 ) REGEXP '[^0-9.]' = 1 AND SUBSTR( borrow_id, 2, 4 ) = '2017' OR SUBSTR( borrow_id, 1, 4 ) = '2017'; 将这个sql 改成 插入 borrow_order_2017,borrow_order_2018,borrow_order_2019 的循环sql
以下是将原 SQL 查询语句改写成循环插入 borrow_order_2017,borrow_order_2018,borrow_order_2019 表的 SQL 循环语句:
```
DELIMITER //
CREATE PROCEDURE insert_borrow_orders()
BEGIN
DECLARE i INT DEFAULT 2017;
WHILE i <= 2019 DO
SET @table_name = CONCAT('borrow_order_', i);
SET @query = CONCAT('INSERT INTO ', @table_name, ' (id, order_no, borrow_id, glc, libcode, rdid, create_time, should_revert_time, revert_time, status) SELECT id, order_no, borrow_id, glc, libcode, rdid, create_time, should_revert_time, revert_time, status FROM borrow_order WHERE SUBSTR(borrow_id, 1, 1) REGEXP ''[^0-9.]'' = 1 AND SUBSTR(borrow_id, 2, 4) = ''', i, ''' OR SUBSTR(borrow_id, 1, 4) = ''', i, ''';');
PREPARE statement FROM @query;
EXECUTE statement;
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
```
该 SQL 循环语句创建了一个名为 `insert_borrow_orders` 的存储过程,以循环方式插入 borrow_order_2017,borrow_order_2018,borrow_order_2019 表。在循环内部,使用 `SET` 语句设置变量 `@table_name` 和 `@query` 分别表示当前要插入的表名和要执行的 SQL 插入语句。在每次循环中,使用 `PREPARE` 和 `EXECUTE` 语句动态执行当前的 SQL 插入语句。最后,使用 `SET` 语句对变量 `i` 进行自增操作以完成循环。注意,在该存储过程中,`DELIMITER` 命令被用于更改分隔符,以便正确处理存储过程中的代码块。
CREATE TRIGGER TR_Borrow_insert_1_Booknum_exits ON Borrow AFTER insert
该代码片段是用于在数据库表"Borrow"插入数据后触发的触发器(trigger)的创建语句。
触发器名称为"TR_Borrow_insert_1_Booknum_exits",它被定义在表"Borrow"上,当有新数据插入到该表时触发。
然而,您提供的代码片段并不完整,缺少了触发器的具体逻辑和操作。如果您可以提供完整的代码片段或更具体的问题,我将尽力提供更详细的分析和解答。