首页 > 解决方案 > 使用查找优化来自多个表的选择性连接

问题描述

我有一个(SQL Server)表,如下所示,其中每一行只能有零或一个 Y,并表示在构建最终组合表时需要哪个版本的数据。

抬头

身份证(PK) 从V1 从V2 从V3 从V4
镇1 ñ ñ ñ
镇2 ñ ñ ñ
镇3 ñ ñ ñ ñ

即这很容易成为一个枚举(一个代表 v1、v2、v3、v4 或无的整数),如果结果证明它可能更快......

身份证(PK) 从版本
镇1 1
镇2 2
镇3 0

这个查找表是在生产早期由另一个进程构建的,ID 是唯一键。

表 FromV1、V2、V3、V4 包含所有城镇的实际数据,拥有数百万行,即每个版本都是相同的结构,每个版本都包含相同城镇的行:

所以,我会创建一个新的“最终”表,其中包含来自设置标志的相关源表中的所有城镇数据,例如

Insert into FINAL Select t.* from TABLEV1 t Join LOOKUP u on t.ID=u.ID and u.FromV1='Y'
Insert into FINAL Select t.* from TABLEV2 t Join LOOKUP u on t.ID=u.ID and u.FromV2='Y'
Insert into FINAL Select t.* from TABLEV3 t Join LOOKUP u on t.ID=u.ID and u.Fromv3='Y'
Insert into FINAL Select t.* from TABLEV4 t Join LOOKUP u on t.ID=u.ID and u.Fromv4='Y'

或者使用枚举变体,如果可以优化事物,它将是“AND u.enum=1”、“AND u.enum=2”等。

我想提高性能,以下是更快还是有更好的方法?

由于保证所有必需行的排序顺序,我认为可能会提高速度的一种方法,但不知道它是否会产生更好的结果,而不是创建一个 LOOKUP 表,而是为每个版本创建一个,例如 LOOKUPV1,查找PV2。

然后 Y/N/enum 上的索引将对数据进行排序,以便在对标志数据进行排序并且我们知道我们正在抓取每一行时,集群扫描/搜索将略微增加?例如

Insert into FINAL Select t.* from TABLEV1 t Join LOOKUPV1 u on t.ID=u.ID and u.flag='Y'
Insert into FINAL Select t.* from TABLEV2 t Join LOOKUPV2 u on t.ID=u.ID and u.flag='Y'

标签: sqlsql-server

解决方案


你可以使用IN

Insert into FINAL
    Select t.*
    from TABLEV1 t Join
         LOOKUP u
         on t.ID = u.ID and 'Y' IN (u.FromV1, u.FromV2, u.FromV3, u.FromV4);

您在问题中提到了枚举。SQL Server 不支持枚举。


推荐阅读