sql - 如何优化加入
问题描述
我正在编写如下 SQL。它每次都会导致扫描表“TBLA”,这是一个大表。由于表格设计,我没有任何使用索引的选项。我怎样才能优化下面的,这样我就不必一次又一次地扫描表。我还需要保留 TBLB 的条件,即每个连接中的 TBLB 有不同的条件。感谢任何帮助
提前致谢 :)
Sel SUB1.COLX,
SUB1.COLY,
SUB1.COLZ,
SUB2.COLX,
SUB2.COLY,
SUB2.COLZ,
SUB3.COLX,
SUB3.COLY,
SUB3.COLZ
FROM
TBLA
LEFT JOIN
(SELECT COLX , COLY, COLZ FROM TBLB WHERE rec='123' ) SUB1
ON TBLA.SK=SUB1.SK
LEFT JOIN
(SELECT COLX , COLY, COLZ FROM TBLB WHERE rec='456' ) SUB2
ON TBLA.SK=SUB2.SK
LEFT JOIN
(SELECT COLX , COLY, COLZ FROM TBLB WHERE rec='789' ) SUB3
ON TBLA.SK=SUB3.SK
解决方案
猜测一下,这应该将查询降低到单次扫描/搜索而不是 3。但是,Tbhi 确实假设您的横向连接每个值仅返回 1 行SK
:
SELECT {Table A Columns},
oa.Sub1,
oa.Sub2,
oa.Sub3
FROM dbo.TableA A
OUTER APPLY (SELECT MAX(CASE B.rec WHEN '123' THEN COLX END) AS Sub1, --If rec is actually a numerical datatype, don't wrap it in single quotes (')
MAX(CASE B.rec WHEN '456' THEN COLX END) AS Sub2, --If rec is actually a numerical datatype, don't wrap it in single quotes (')
MAX(CASE B.rec WHEN '789' THEN COLX END) AS Sub3 --If rec is actually a numerical datatype, don't wrap it in single quotes (')
FROM dbo.TableB B
WHERE B.SK = A.SK) oa;
当然,这里仍然需要相关的索引;因为TableB
,那将在列上SK
,rec
并且COLX
至少希望在INCLUDE
.
推荐阅读
- android - 我如何为 Nexus 5x 构建 android 4.4.4_r1
- vba - VBA 运行时错误 424 使用 SmartArt 节点时需要对象
- android - NestedScrollView 中的 RecyclerView 填充剩余空间
- java - 如何在 Drools 中处理动态 Json/class?
- rest - 代理授权不适用于 Jersey 2.x(2.25.1) 的 JettyConnectorProvider
- javascript - React-native 地图等待 promise.all
- c# - Asp.net Core 在一个过滤器中添加多个操作过滤器
- javascript - 将 JS 添加到 HTML
- jquery - 每次按钮单击分页js时如何调用ajax请求
- c++ - 在 Boost.Mp11 中苦苦挣扎:“期望一个类模板,得到 'T'”