SQL Server 如何使用 UNION 代替 OR 来提高查询性能

分类:编程技术 时间:2024-02-20 15:24 浏览:0 评论:0
0
本文主要介绍SQL Server如何使用UNION代替OR来提高查询性能。文章中的介绍非常详细,有一定的参考价值。感兴趣的朋友一定要读一下!

SQLServer数据库查询过程中,通过优化SQL语句来提高SQL查询的性能。下面小编就来讲解一下SQL Server如何使用UNION代替OR来提高查询性能?

SQL Server如何使用UNION代替OR来提高查询性能

SQL>settimingonSQL>setautotraceonSQL> selectcount(*)rowcount_lhy2fromswgl_ddjbxxt3wheret 。 fzgs_dm='001085'4and(t.lrr_dm='e90e3fe4237c4af988477329c7f2059e'orexists5(selecty.kh_id6fromkhgl_khywdlxxy7wherey.kh_id=t.kh_id8andy.sskhjl_dm='e90e3fe4237c4 a f988477329c7f2059e')or9t.kpr_dm='e90e3fe4237c4af988477329c7f2059e')10andt。 xjbz='9999'11andt. FROMNBGL1='0';SQL>setline300SQL>/ROWCOUNT_LHY—————————60 已用时间: 00:00:20.53 执行计划—————————————————— ——— ——————————————————计划哈希值:1217125969 ———————————————————— ——————————————————————— ————————————————————————|ID|操作|名称|行|字节|成本(%CPU)|时间|——————————————————————————————————————— ——————————————————————————————————————|0|SELECT语句||1|86|28048(1) |00 :05:37||1|排序聚合||1|86||||*2|过滤器||||||*3|表可访问|SWGL_DDJBXX|5926|497K|28048(1)|00:05: 37||*4|TABLEACCESSBYINDEXROWID|KHGL_KHYWDLXX|1|57|5(0)|00: 00:01||*5|INDEXRANGESCAN|IDX_KHGL_KHYWDLXX_KHID|1||3(0)|00:00:01|——— —————————————————————————————————————————————————— ———————————谓词信息(由操作ID标识):— ———————————————————————————————— ——-2-filter("T"."LRR_DM"='e90e3fe4237c4af988477329c7f2059e'OR "T"."KPR_DM"='e90e3fe4237c4af988477329c7f2059e'OREXISTS(SELECT0FROM"KHGL_KHYWDLXX""Y"WHERE"Y "."KH_ID"=: B1AND"Y"."SSKHJL_DM"='e90e3fe4237c4af9884773 29c7f2059e'))3-filter("T "."FROMNBGL1"='0'AND"T"."XJBZ"='9999'AND"T"."FZGS_DM" ='001085')4-filter("Y"."SSKHJL_DM"='e90e3fe4237c4af988477329c7f2059e') 5-access("Y"."KH_ID" =: B1) 统计信息————————————————————————————————————0recursivecalls0dbblockgets804560consistentgets71127physicalreads0redosize516bytessentviaSQL*Nettoclient469bytesreceivedviaSQL *Netfromclient2SQL*Netroundtripsto/fromclient0sorts(memory)0sorts(disk)1rowsprocessed

使用UNION代替OR进行优化后代码如下:

SQL>selectcount(*)2from (select*3fromswgl_ddjbxxt4wheret.lrr_dm='e90e3fe4237c4af988477329c7f2059e'5andt.fzgs_dm='001085'6andt.xjbz='9999'7andt.FROMNB GL1='0'8union9select *10fromswgl_ddjbxxt 11wheret.kpr_dm='e90e3fe4237c4af988477329c7f2059e'12andt.fzgs_dm='001085'13andt. xjbz='9999'14andt.FROMNBGL1='0'15union16select*17fromswg l_ddjbxxt18whereexists19(selecty.kh_id20fromkhgl_khywdlxxy21wherey.kh_id=t.kh_id22andy.sskhjl_dm='e90e3fe4237c4af9884773 29c7f2059e')23andt.fzgs_dm='001085'24andt.xjbz='9999'25andt.FROMNBGL1 ='0');COUNT(*)--------------------60 已用时间: 00:00:06.89 执行计划—— ——————————————————— - - - - - - - - -计划哈希值:3846872744——————————————————————————————————————————————————— ——————————————————————————————————————————————————- --- -----------------------------------------------------------|ID|操作|名称|行|字节|TempSpc|成本(%CPU)|时间|---------------------------------------------------- --- ---------------------------------------------------------- --- ----------------------------------|0|SELECT语句||1|||52263(1 )|00:10: 28||1|SORTAGGREGATE||1||||||2|查看||5996|||52263(1)|00:10:28||3|SORTUNIQUE||5996|2238K |6344K|52263(47)|00:10:28||4|UNION-ALL||||||||*5|表可访问|SWGL_DDJBXX|59|19234||28037(1)|00:05:37 ||*6|TABLEACCESSBYINDEXROWID |SWGL_DDJBXX|10|3260||1209(1)|00:00:15||*7|INDEXRANGESCAN|IDX_SWGL_DDJBXX_KPRDM|4748|||34(0)|00:00:01||* 8|表访问按索引行ID|SWGL_DDJBXX| 1|326||5(0)|00:00:01||9|嵌套循环||5927|2216K||22527(1)|00:04:31||10|SORTUNIQUE||10165|565K||1916 (1)|00:00:23||11|TABLEACCESSBYINDEXROWID|KHGL_KHYWDLXX|10165|565K||1916(1)|00:00:23||*12|INDEXRANGESCAN|IDX_KHGL_KHYWDLXX_SSKHJL|10165|||111(0)| 00:00:02||*13|INDEXRANGESCAN|IDX_SWGL_DDJBXX_KHID|2|||2(0)|00:00:01|------------------------ -- -------------------------------------------------- --- ---------------------------------------------------------- ---PredicateInformation(identifiedbyoperationid):-- ---------------------------------------- ----------5 -filter("T"."LRR_DM"='e90e3fe4237c4af988477329c7f2059e'AND"T"."FROMNBGL1"='0'AND"T"."XJBZ"='9999'AND "T"."FZGS_DM"='001085' )6-filter("T"."FROMNBGL1"='0'AND"T"."XJBZ"='9999'AND"T"."FZGS_DM"='001085 ')7-access("T"."KPR_DM"='e90e3fe4237c4af988477329c7f2059e')8-filter("T"."FROMNBGL1"='0'AND"T"."XJBZ"='9999'AND"T". "FZGS_DM"='001085')12-access("Y"."SSKHJL_DM"='e90e3fe4237c4af988477329c7f2059e')13-access("Y"."KH_ID"="T"."KH_ID")统计----- -------------------------------------------------- -- --1recursivecalls0dbblockgets128422consistentgets10308physicalreads0redosize512bytessentviaSQL*Nettoclient469bytesreceivedviaSQL*Netfromclient2SQL*Netroundtripsto/fromclient2sorts(内存)0sorts(磁盘)1rowsprocessed

SQL改写后,执行时间从原来的20秒下降到6秒,逻辑读率从804560下降到128422,性能得到了很大的提升。到这里优化还没有结束。您可以创建组合索引以进一步优化。

Createindexidxonswgl_ddjbxx(fzgs_dm, xjbz, FROMNBGL1);

SQL Server如何使用UNION代替OR来提高查询性能

创建索引后,原来的SQL执行时间、执行计划、统计信息如下:

SQL>selectcount(*)rowcount_lhy2fromswgl_ddjbxxt3wheret。 fzgs_dm='001085'4and(t.lrr_dm='e90e3fe4237c4af988477329c7f2059e'orexists5(selecty.kh_id6fromkhgl_khywdlxxy7wherey.kh_id=t.kh_id8andy.sskhjl_dm='e90e3fe4237c4 a f988477329c7f2059e')or9t.kpr_dm='e90e3fe4237c4af988477329c7f2059e')10andt。 xjbz='9999'11andt. FROMNBGL1='0';ROWCOUNT_LHY--------------------60 已用时间:00:00:02。 96 执行计划----------------------------------------------------------------------计划哈希值:3049366449----- ---------------------------------------------------------- ---- ---------------------------------------------------------- --|ID |操作|名称|行|字节|成本(%CPU)|时间|-------------------------------- - ------------------------------------------------- - ----------------------|0|SELECT语句||1|86|506(0)|00:00:07||1|SORTAGGREGATE ||1 |86|||*2|过滤器|||||||3|表访问索引行ID|SWGL_DDJBXX|5926|497K|506(0)|00:00:07||*4|INDEXRANGESCAN|IDX|2370 ||12( 0)|00:00:01||*5|TABLEACCESSBYINDEXROWID|KHGL_KHYWDLXX|1|57|5(0)|00:00:01||*6|INDEXRANGESCAN|IDX_KHGL_KHYWDLXX_KHID|1||3(0 )|00: 00:01|--------------------------------------------------------- - ------------------------------------------------- - -----------谓词信息(由操作ID标识):--------------------------------- - -----------------2-filter("T"."LRR_DM"='e90e3fe4237c4af988477329c7f2059e'OR"T"."KPR_DM"='e90e3fe4237c4af988477329c7f2059e'OREXISTS(SELECT0FROM"KHGL_KHYWDLXX " “Y”哪里“Y”t;。 “KH_ID”=:B1AND“Y”。 "SSKHJL_DM"='e90e3fe4237c4af988477329c7f2059e'))4-access("T"."FZGS_DM"='001085'AND"T"."XJBZ"='9999'AND"T"."FROMNBGL1"='0')5 -filter("Y"."SSKHJL_DM"='e90e3fe4237c4af988477329c7f2059e')6-access("Y"."KH_ID"=:B1)统计-------------------------------- -- ----------------------------------------------------1递归调用0dbblockgets702767一致的gets0物理读取0重做大小516字节通过SQL * Net到客户端发送469字节通过SQL * Netfromclient2SQL * Netroundtripsto/fromclient0sorts( memory)0sorts(disk)1rowsprocessed

重写 SQL:

SQL>selectcount(*)2from(select*3fromswgl_ddjbxxt4wheret.lrr_dm='e90e3fe4237c4af988477329c7f2059e'5andt.fzgs_dm='001085' 6andt 。 xjbz='9999'7andt.FROMNBGL1='0'8union9select*10fromswgl_ddjbxxt11wheret.kpr_dm='e90e3fe4237c4af988477329c7f2059e'12andt.fzgs_dm='001085'13andt.xjbz='9999'1 4andt. FROMNBGL1='0'15union16select*17fromswgl_ddjbxxt18whereexists19(selecty.kh_id20fromkhgl_khywdlxxy21wherey. kh_id=t.kh_id22andy.sskhjl_dm='e90e3fe4237c4af988477329c7f2059e')23 等。 fzgs_dm='001085'24andt。 xjbz='9999'25andt。 FROMNBGL1='0');COUNT(*)----------60 已用时间:00:00:00。 53 执行计划--------------------------- -------------------------------- ------------------计划哈希值:2947849958---- ------------------------- ------------------------ ------------------------ ---------------------------------- ------------------|ID|操作|名称|行|字节|TempSpc|成本(%CPU)|时间|------------------------ ------------------------ -------------------------- ------------------------ -------------------------- ----------|0|SELECT语句||1|||3469(1) |00:00:42||1|排序聚合||1||||||2|查看||5995| ||3469(1)|00:00:42||3|SORTUNIQUE||5995|2238K|4760K|3469(86)|00:00:42||4|UNION-ALL|||||||| *5|TABLEACCESSBYINDEXROWID|SWGL_DDJBXX|59|19234||506(0)|00:00:07||*6|INDEXRANGESCAN|IDX|2370|||12(0)|00:00:01||7|TABLEACCESSBYINDEXROWID |SWGL_DDJBXX|10|3260||50(0)|00:00:01||8|位图转换|||||||9|位图和||||||||10 |行位图转换|||||| |*11|索引范围扫描|IDX|2370|||12(0)|00:00:01||12|行位图转换|||||||*13|索引范围扫描|IDX_SWGL_DDJBXX_KPRDM |2370|||34(0)|00:00:01||*14|HASHJOINRIGHTSEMI||5926|2216K||2423( 1)|00:00:30||15|按索引行访问表|KHGL_KHYWDLXX|10165|565K| |1916 (1) | 00:00:23 | 00:00:23 | )|00:00:07||*18|INDEXRANGESCAN|IDX|2370|||12(0)|00:00:01|------------------- -------------------------------------------------- -------------------------------------------------- --谓词信息(由操作ID标识):-------------------------------------------------------- --- --------5-filter("T"."LRR_DM"='e90e3fe4237c4af988477329c7f2059e')6-access("T"."FZGS_DM"='001085'AND"T"."XJBZ" ='9999'AND“T”。“FROMNBGL1”='0')11-access(“T”。“FZGS_DM”='001085'AND“T”。“XJBZ”='9999'AND“T”。“ FROMNBGL1"='0')filter("T"."FROMNBGL1"='0'AND"T"."XJBZ"='9999'AND"T"."FZGS_DM"='001085')13-access(" T"."KPR_DM"='e90e3fe4237c4af988477329c7f2059e')14-access("Y"."KH_ID"="T"."KH_ID")16-access("Y"."SSKHJL_DM"='e90e3fe4237c4af988477329c7f2059e') 18-访问("T"."FZGS_DM"='001085'AND"T"."XJBZ"='9999'AND"T"."FROMNBGL1"='0')统计---------- --------------------- -----------------------------1recursivecalls0dbblockgets25628consistentgets0physicalreads0redosize512bytessentviaSQL*Nettoclient469bytesreceivedviaSQL *Netfromclient2SQL*Netroundtripsto/fromclient1sorts(内存)0sorts(磁盘)1行已处理。

以上就是《SQL Server如何使用UNION代替OR来提高查询性能》一文的全部内容,感谢您的阅读!希望分享的内容对大家有所帮助。更多相关知识,欢迎关注行业资讯频道!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > SQL Server 如何使用 UNION 代替 OR 来提高查询性能

用户评论