Like 的优化 (zt)

简单说两句,具体看例子


1。尽量不要使用 like '%..%'

2。对于 like '..%..' (不以 % 开头),Oracle可以应用 colunm上的index

3。对于 like '%...' 的 (不以 % 结尾),可以利用reverse + function index 的形式,变化成 like '..%'

[@more@]


代码:


-- '建测试表和Index,注意,重点在于带reverse的function index。同时,一定要使用CBO才行……

sys@mescp> select reverse('123') from dual;REVERSE('123')

--------------------------------

321

1 row selected.

sys@mescp> create table test_like as select object_id,object_name from dba_objects;

Table created.

sys@mescp> create index test_like__name on test_like(object_name);

Index created.

sys@mescp> create index test_like__name_reverse on test_like(reverse(object_name));

Index created.sys@mescp> analyze table test_like compute statistics for table for all indexes;

Table analyzed.

sys@mescp> set autotrace trace exp


-- '常量开头的like , 会利用index ,没问题…… '

sys@mescp> select * from test_like where object_name like AS%';


Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=655 Bytes=15720)

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST_LIKE' (Cost=2 Card=655Bytes=15720)

2 1 INDEX (RANGE SCAN) OF 'TEST_LIKE__NAME' (NON-UNIQUE) (Cost=2 Card=118)


--'开头和结尾都是 % ,对不起,很难优化'

sys@mescp> select * from test_like where object_name like '%%';


Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=655 Bytes=15720)

1 0 TABLE ACCESS (FULL) OF 'TEST_LIKE' (Cost=6 Card=655 ytes=15720)


-- '以常量结束,直接写的时候是不能应用index的'

sys@mescp> select * from test_like where object_name like '%S';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=655 Bytes=15720)

1 0 TABLE ACCESS (FULL) OF 'TEST_LIKE' (Cost=6 Card=655 Bytes=15720)

--'以常量结束的,加个reverse 函数,又可以用上index了'

sys@mescp> select * from test_like where reverse(object_name)like reverse('%AS');

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=655 Bytes=15720)

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST_LIKE' (Cost=2 Card=655 Bytes=15720)

2 1 INDEX (RANGE SCAN) OF 'TEST_LIKE__NAME_REVERSE' (NON-UNIQUE) (Cost=2 Card=118)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-997115/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/35489/viewspace-997115/

# -*- coding: utf-8 -*- """ @file: async_zt_flow_hcproblem @author: maxiaolong01 @date: 2025/7/17 10:14 """ import datetime import pprint from tortoise import run_async from app.models.product import RequirementPool from app.settings import TORTOISE_ORM from app.utils.db import MySqlClient estimated_finish_date = datetime.date(1971, 1, 1) async def get_zt_materiallib(sql: str = 'select * from zt_materiallib'): result = {} async with MySqlClient(TORTOISE_ORM) as client: for item in await client.execute_query(sql): release_date = item.get( "releaseDate", datetime.date( 1971, 1, 1)) result["release_date"] = str(release_date) result["software_project"] = item.get("name", "未关联") print("release_date:", release_date, datetime.date( 1971, 1, 1)) if release_date == datetime.date( 1971, 1, 1): result["requirement_status"] = "超期未关闭" if datetime.date.today( ) > estimated_finish_date else "按期未关闭" print("requirement_status:", datetime.date.today(), estimated_finish_date, result["requirement_status"]) else: result["requirement_status"] = "按期关闭" if release_date < estimated_finish_date else "超期关闭" print("requirement_status:", release_date, estimated_finish_date, result["requirement_status"]) return result async def get_zt_build(sql: str = 'select * from zt_build'): result = {} async with MySqlClient(TORTOISE_ORM) as client: for item in await client.execute_query(sql): associated_version = item.get("name", "未关联") result["associated_version"] = associated_version result["associated_version_id"] = item.get("id", 0) sql = f""" SELECT m.releaseDate,p.name FROM zt_materiallib m LEFT JOIN zt_project p ON p.id = m.project WHERE m.topubbaseline = '{associated_version}' AND m.status = '1' LIMIT 1 """ d = await get_zt_materiallib(sql) if not d: d["release_date"] = str(datetime.date( 1971, 1, 1)) d["software_project"] = "未关联" d["requirement_status"] = "超期未关闭" if datetime.date.today( ) > estimated_finish_date else "按期未关闭" print("requirement_status:", datetime.date.today(), estimated_finish_date, d["requirement_status"]) result.update(d) return result async def get_zt_hctransform(sql: str = 'select * from zt_hctransform where fromid = 1 and type = "hcrequirementtostory"'): result = [] async with MySqlClient(TORTOISE_ORM) as client: transformid = None for item in await client.execute_query(sql): transformid = item.get("transformid") sql = f""" SELECT * FROM `zt_build` WHERE `stories` LIKE '%{transformid}%' AND deleted = '0' ORDER BY id DESC LIMIT 1 """ build_data = await get_zt_build(sql) if not build_data: build_data.update({ "rd_req_id": 0, "release_date": str(datetime.date( 1971, 1, 1)), "software_project": "未关联", "requirement_status":"超期未关闭" if datetime.date.today( ) > estimated_finish_date else "按期未关闭" }) else: build_data.update({"rd_req_id": transformid}) result.append(build_data) return result async def get_zt_flow_hcrequirement_item(sqlfile: str = './app/tasks/sql/zt_flow_hcrequirement.sql'): result = [] global estimated_finish_date with open(sqlfile, 'r', encoding='utf-8') as f: sql = f.read() async with MySqlClient(TORTOISE_ORM) as client: for item in await client.execute_query(sql): fromid = item.get("zt_id") sql = f'select * from zt_hctransform where fromid = {fromid} and type = "hcrequirementtostory"' print(sql) estimated_finish_date = datetime.date.fromisoformat(item.get( "estimated_finish_date", "1971-01-01")) rd_req_data_list = await get_zt_hctransform(sql) data = {"" "zt_id": item.get("zt_id"), "project_no": item.get("project_no"), "equip": item.get("equip"), "req_name": item.get("req_name"), "req_sub_date": datetime.datetime.strptime(item.get("req_sub_date", "1971-01-01"), '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S'), "estimated_finish_date": datetime.datetime.strptime(item.get("estimated_finish_date", "1971-01-01"), '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S'), "req_dev_leader": item.get("req_dev_leader") } # pprint.pprint(item) # pool, _ = await RequirementPool.update_or_create(**data) rd_red_data = [] for i in rd_req_data_list: d = { "associated_version": i.get("associated_version", "未关联"), "associated_version_id": i.get("associated_version_id", 0), "rd_req_id": i.get("rd_req_id", None), "release_date": i.get("release_date", datetime.datetime.strptime("1971-01-01", '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S')), "requirement_status": i.get("requirement_status", "未关闭"), "software_project": i.get("software_project", "未关联"), } data.update(d) print(data) rd_red_data.append(RequirementPool(**data)) if rd_red_data: print(rd_red_data) await RequirementPool.bulk_create(rd_red_data) # await RDReqData.bulk_create(rd_red_data) async def insert_product_requirement_pool(): await get_zt_flow_hcrequirement_item() if __name__ == '__main__': run_async(get_zt_flow_hcrequirement_item()) 性能优化注意逻辑正确
最新发布
09-05
-- coding: utf-8 -- “”" @file: async_zt_flow_hcproblem @author: maxiaolong01 @date: 2025/7/17 10:14 “”" import datetime import pprint from tortoise import run_async from app.models.product import RequirementPool from app.settings import TORTOISE_ORM from app.utils.db import MySqlClient estimated_finish_date = datetime.date(1971, 1, 1) async def get_zt_materiallib(sql: str = ‘select * from zt_materiallib’): result = {} async with MySqlClient(TORTOISE_ORM) as client: for item in await client.execute_query(sql): release_date = item.get( “releaseDate”, datetime.date( 1971, 1, 1)) result["release_date"] = str(release_date) result["software_project"] = item.get("name", "未关联") print("release_date:", release_date, datetime.date( 1971, 1, 1)) if release_date == datetime.date( 1971, 1, 1): result["requirement_status"] = "超期未关闭" if datetime.date.today( ) > estimated_finish_date else "按期未关闭" print("requirement_status:", datetime.date.today(), estimated_finish_date, result["requirement_status"]) else: result["requirement_status"] = "按期关闭" if release_date < estimated_finish_date else "超期关闭" print("requirement_status:", release_date, estimated_finish_date, result["requirement_status"]) return result async def get_zt_build(sql: str = ‘select * from zt_build’): result = {} async with MySqlClient(TORTOISE_ORM) as client: for item in await client.execute_query(sql): associated_version = item.get(“name”, “未关联”) result[“associated_version”] = associated_version result[“associated_version_id”] = item.get(“id”, 0) sql = f""" SELECT m.releaseDate,p.name FROM zt_materiallib m LEFT JOIN zt_project p ON p.id = m.project WHERE m.topubbaseline = '{associated_version}' AND m.status = '1' LIMIT 1 """ d = await get_zt_materiallib(sql) if not d: d["release_date"] = str(datetime.date( 1971, 1, 1)) d["software_project"] = "未关联" d["requirement_status"] = "超期未关闭" if datetime.date.today( ) > estimated_finish_date else "按期未关闭" print("requirement_status:", datetime.date.today(), estimated_finish_date, d["requirement_status"]) result.update(d) return result async def get_zt_hctransform(sql: str = ‘select * from zt_hctransform where fromid = 1 and type = “hcrequirementtostory”’): result = [] async with MySqlClient(TORTOISE_ORM) as client: transformid = None for item in await client.execute_query(sql): transformid = item.get(“transformid”) sql = f"“” SELECT * FROM zt_build WHERE stories LIKE ‘%{transformid}%’ AND deleted = ‘0’ ORDER BY id DESC LIMIT 1 “”" build_data = await get_zt_build(sql) if not build_data: build_data.update({ “rd_req_id”: 0, “release_date”: str(datetime.date( 1971, 1, 1)), “software_project”: “未关联”, “requirement_status”:“超期未关闭” if datetime.date.today( ) > estimated_finish_date else “按期未关闭” }) else: build_data.update({“rd_req_id”: transformid}) result.append(build_data) return result async def get_zt_flow_hcrequirement_item(sqlfile: str = ‘./app/tasks/sql/zt_flow_hcrequirement.sql’): result = [] global estimated_finish_date with open(sqlfile, ‘r’, encoding=‘utf-8’) as f: sql = f.read() async with MySqlClient(TORTOISE_ORM) as client: for item in await client.execute_query(sql): fromid = item.get(zt_id”) sql = f’select * from zt_hctransform where fromid = {fromid} and type = “hcrequirementtostory”’ print(sql) estimated_finish_date = datetime.date.fromisoformat(item.get( “estimated_finish_date”, “1971-01-01”)) rd_req_data_list = await get_zt_hctransform(sql) data = {"" "zt_id": item.get("zt_id"), "project_no": item.get("project_no"), "equip": item.get("equip"), "req_name": item.get("req_name"), "req_sub_date": datetime.datetime.strptime(item.get("req_sub_date", "1971-01-01"), '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S'), "estimated_finish_date": datetime.datetime.strptime(item.get("estimated_finish_date", "1971-01-01"), '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S'), "req_dev_leader": item.get("req_dev_leader") } # pprint.pprint(item) # pool, _ = await RequirementPool.update_or_create(**data) rd_red_data = [] for i in rd_req_data_list: d = { "associated_version": i.get("associated_version", "未关联"), "associated_version_id": i.get("associated_version_id", 0), "rd_req_id": i.get("rd_req_id", None), "release_date": i.get("release_date", datetime.datetime.strptime("1971-01-01", '%Y-%m-%d').strftime('%Y-%m-%d %H:%M:%S')), "requirement_status": i.get("requirement_status", "未关闭"), "software_project": i.get("software_project", "未关联"), } data.update(d) print(data) rd_red_data.append(RequirementPool(**data)) if rd_red_data: print(rd_red_data) await RequirementPool.bulk_create(rd_red_data) # await RDReqData.bulk_create(rd_red_data) async def insert_product_requirement_pool(): await get_zt_flow_hcrequirement_item() if name == ‘main’: run_async(get_zt_flow_hcrequirement_item()) 再造成分批并发同步 展示优化后的全部代码
09-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值