使用索引联接临时表

如何解决使用索引联接临时表

我才刚刚开始学习INDEX,听说它可以加快结果,但是我的测试却产生了相反的效果。

有关数据的一些要点:

  • 我的公司使用SQL Server,但除此以外,我对此一无所知
  • 我只是一名员工,没有任何管理员权限,甚至只能查看某些文件夹
  • #TABLE1包含23,000多行,并在1秒内运行
  • #TABLE2包含超过310万行,运行时间约为1.5分钟
  • 使用联接大约需要1.75到2.5分钟
  • 我尝试使用INDEX的过程需要2.5到3或更多
  • 此后我将加入更多表,但这两个表实质上是其他所有表的基础

我在下面尝试的查询比我执行普通的JOIN花费的时间更长

IF OBJECT_ID('tempdb..#TABLE1') IS NOT NULL DROP TABLE #TABLE1;
IF OBJECT_ID('tempdb..#TABLE2') IS NOT NULL DROP TABLE #TABLE2;

SELECT
cast(T1.[ID] as varchar(20)) as 'ID',cast(T1.[Division] as int) as 'Division',cast(T1.[Category] as int) as 'Category',cast(T1.[Platform] as int) as 'Platform',cast(T1.[Condition] as tinyint) as 'Condition',cast(T1.[First Received] as date) as 'First Received',cast(T1.[Last Received] as date) as 'Last Received'

INTO #TABLE1

FROM
CompanyTable as T1

WHERE
T1.[Name] = 'Canada'
AND T1.[Division] = '100';

CREATE NONCLUSTERED INDEX IX_TABLE1 ON #TABLE1([ID],[Division],[Category],[Platform]);

SELECT DISTINCT
SE.[Date] as 'Date',SE.[ID] as 'ID',SE.[Division] as 'Division',SE.[Category] as 'Category',SE.[Platform] as 'Platform',sum(SE.[Units]) as 'Units',sum(SE.[Sales]) as 'Sales',sum(SE.[Retail]) as 'Retail',sum(SE.[Cost]) as 'Cost'

INTO #TABLE2

FROM 
(SELECT
    cast(S1.[Date] as date) as 'Date',cast(S1.[ID] as varchar(20)) as 'ID',cast(S1.[Division] as int) as 'Division',cast(S1.[Category] as int) as 'Category',cast(S1.[Platform] as int) as 'Platform',cast(sum(S1.[Quantity]) * -1 as decimal(38,20)) as 'Units',cast(sum(S1.[Net Amount]) * -1 as decimal(38,20)) as 'Sales',cast(sum(S1.[Cost Amount]) * -1 as decimal(38,20)) as 'Cost',cast(sum(S1.[Price]) as decimal(38,20)) as 'Retail'

    FROM
    SalesTable1 as S1

    WHERE
    S1.[Division] = '100'
    
    GROUP BY
    S1.[ID],S1.[Date],S1.[Division],S1.[Category],S1.[Platform]
    
    UNION ALL
    
    SELECT
    cast(S2.[Date] as date) as 'Date',cast(S2.[ID] as varchar(20)) as 'ID',cast(S2.[Division] as int) as 'Division',cast(S2.[Category] as int) as 'Category',cast(S2.[Platform] as int) as 'Platform',cast(sum(S2.[Quantity]) * -1 as decimal(38,cast(sum(S2.[Net Amount]) * -1 as decimal(38,cast(sum(S2.[Cost Amount]) * -1 as decimal(38,cast(sum(S2.[Price]) as decimal(38,20)) as 'Retail'
    
    FROM
    SalesTable2 as S2
    
    WHERE
    S2.[Division] = '100'
    
    GROUP BY
    S2.[ID],S2.[Date],S2.[Division],S2.[Category],S2.[Platform]
) as T2

GROUP BY
T2.[ID],T2.[Date],T2.[Division],T2.[Category],SE.[Platform]

CREATE NONCLUSTERED INDEX IX_TABLE2 ON #TABLE2([ID],[Platform]);

SELECT *
FROM #TABLE1 as T1
JOIN #TABLE2 as T2 ON T1.[ID] = T2.[ID] AND T1.[Division] = T2.[Division] AND T1.[Category] = T2.[Category] AND T1.[Platform] = T2.[Platform]

DROP INDEX IX_TABLE1 ON #TABLE1;
DROP INDEX IX_TABLE2 ON #TABLE2;

我做错了什么导致它变慢了吗?

解决方法

如下所示在#table1和#table2上创建4个不同的索引,然后运行查询。

CREATE NONCLUSTERED INDEX IX_TABLE1_id ON #TABLE1([ID]);
CREATE NONCLUSTERED INDEX IX_TABLE1_Div ON #TABLE1([Division]);
CREATE NONCLUSTERED INDEX IX_TABLE1_Cat ON #TABLE1([ [Category]);
CREATE NONCLUSTERED INDEX IX_TABLE1_Plt ON #TABLE1([[Platform]);

CREATE NONCLUSTERED INDEX IX_TABLE1_id ON #TABLE2([ID]);
CREATE NONCLUSTERED INDEX IX_TABLE1_Div ON #TABLE2([Division]);
CREATE NONCLUSTERED INDEX IX_TABLE1_Cat ON #TABLE3[ [Category]);
CREATE NONCLUSTERED INDEX IX_TABLE1_Plt ON #TABLE4([[Platform]);
,

您需要在临时表上使用具有唯一值的主键作为CLUSTERED INDEX。然后,您只需要NONCLUSTERED INDEX列上的另一个JOIN。假设ID中的#TABLE1是唯一的,请像这样创建索引:

ALTER TABLE #TABLE1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY CLUSTERED ([ID]);
CREATE NONCLUSTERED INDEX IX_TABLE1 ON #TABLE1([Division],[Category],[Platform]);

#TABLE2的同上,再次假设ID ID为唯一:

ALTER TABLE #TABLE2 ADD CONSTRAINT PK_TABLE2 PRIMARY KEY CLUSTERED ([ID]);
CREATE NONCLUSTERED INDEX IX_TABLE2 ON #TABLE2([Division],[Platform]);

但是,如果实际的瓶颈是非临时表,那么这可能无法解决您的性能问题。您应该分别运行脚本的SELECT部分。如果他们自己表现良好,请尝试使用这些索引。如果不是,那么您需要与您的DBA交流并找出SELECT运行缓慢的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-