SQL语句大批量多表查询优化解决方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQL语句大批量多表查询优化方案
我写这个没什么目的,只是分享一下给大家。
此为自己项目当中所碰见的。
当时也很纠结。但是优化过后。经过测试二亿条数据多表查询,在一分钟以内出来,虽然不是很快。但也尽量了。
首先,数据库表中索引如何创建我想大家都知道。
这是百度当中找到的解释已经很详细了。
聚集索引:
聚集索引基于聚集索引键按顺序排序和存储表或视图中的数据行。聚集索引按
B 树索引结构实现,B 树索引结构支持基于聚集索引键值对行进行快速检索。
非聚集索引:
既可以使用聚集索引来为表或视图定义非聚集索引,也可以根据堆来定义非聚集索引。非聚集索引中的每个索引行都包含非聚集键值和行定位符。此定位符指向聚集索引或堆中包含该键值的数据行。索引中的行按索引键值的顺序存储,但是不保证数据行按任何特定顺序存储,除非对表创建聚集索引。
唯一索引:
唯一索引确保索引键不包含重复的值,因此,表或视图中的每一行在某种程度上是唯一的。
聚集索引和非聚集索引都可以是唯一索引。
包含性列索引:
一种非聚集索引,它扩展后不仅包含键列,还包含非键列。
索引视图:
视图的索引将具体化(执行)视图,并将结果集永久存储在唯一的聚集索引中,而且其存储方法与带聚集索引的表的存储方法相同。创建聚集索引后,可以为视图添加非聚集索引。
全文索引:
一种特殊类型的基于标记的功能性索引,由 Microsoft SQL Server 全文引擎(MSFTESQL) 服务创建和维护。用于帮助在字符串数据中搜索复杂的词。
至于语法之类的就不讲解,大家百度一下就有很多。综合在表当中建立索引是靠
大家自己,如何安排才会觉得合理。在此不做建议。
第一部开始。
创建临时虚拟表。也就是用其实就是把一大堆重复用到的SQL语句放在with as 里面,取一个别名,后面的查询就可以用它
这样对于大批量的SQL语句起到一个优化的作用,而且清楚明了
具体实例
WITH BASE AS (
SELECT * FROM MDM_DISTRIBUTOR
)
SELECT * FROM BASE
这只是举例一下,在实际情况中,其实就是把一大堆重复用到的SQL语句放在with as 里面,取一个别名,后面的查询就可以用它这样对于大批量的SQL语句起到一个优化的作用,而且清楚明了
为什么要用WITH ,用with好处就是把把复杂的SQL语句全部都放到这里。把他当作一张表,进行查询。
第二部,创建临时表
语法
--创建临时表
SELECT * INTO #TEMP_REPORT_TABLE FROM BASE
--删除临时表,最好判断一下是否为空,在进行删除
IF object_id('tempdb..#TEMP_REPORT_TABLE') IS NOT NULL BEGIN
DROP TABLE #TEMP_REPORT_TABLE
END
最终优化的就是
WITH BASE AS (
--复杂SQL语句编写的地方
SELECT * FROM MDM_DISTRIBUTOR
)
--创建临时表
SELECT * INTO #TEMP_REPORT_TABLE FROM BASE
SELECT * FROM #TEMP_REPORT_TABLE
--删除临时表
IF object_id('tempdb..#TEMP_REPORT_TABLE') IS NOT NULL BEGIN
DROP TABLE #TEMP_REPORT_TABLE
END
当然WITH也可以做多个,而WITH里面也可以进行一些SQL语句的基础优化。比如开篇讲到创建索引,存储过程,和组织视图之类的。这样都可以。
当然用完临时表之后一定要记着删除,否则创建是不会成功的。
如果有条件的可以测试一下。