sql - 使用查找优化来自多个表的选择性连接
问题描述
我有一个(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 包含所有城镇的实际数据,拥有数百万行,即每个版本都是相同的结构,每个版本都包含相同城镇的行:
- 城镇 1、场 1、场 2...
- 城镇 1、场 1、场 2...
- 城镇 2,场 1,场 2...
所以,我会创建一个新的“最终”表,其中包含来自设置标志的相关源表中的所有城镇数据,例如
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'
解决方案
你可以使用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 不支持枚举。
推荐阅读
- c# - 将嵌套对象导出到 CSV
- python - Converting dates less than 1970 in python using pandas
- reactjs - React Native:当您离开一个组件时,该组件是否会被卸载?
- mkdocs - Mkdocs材料水平菜单不起作用
- python - 这算不算“数据泄露”?
- operating-system - 寻找有关名为 WhatDoesItDo 的编程语言的信息
- go - 通过 Arango DB 中的不同集合进行查询并在路径边缘应用过滤器
- ruby - 在 WSL 上使用 rbenv 安装 ruby 时出现错误“block in install_default_gem”
- java - 在反应器中流动多个对象的有效/正确方法是什么
- javascript - 如何检查两个对象(或数组、映射、集合等)是否具有与另一个相同的值?