提高查询速度:简单 SELECT from SELECT in huge table
Improving query speed: simple SELECT from SELECT in huge table
我有一个 table 包含 3 列:年龄、姓名、昵称
我只想获取昵称+年龄中根本不存在姓名+年龄的姓名(+年龄)。
例如:如果 table:DETAILS 包含 2 行:
- 年龄:5 姓名:苏子 昵称:苏子
- age:2,名字:gil,昵称:g
查询将 return : age:2 , name : gil
SELECT d1.AGE, d1.NAME
FROM DETAILS d1
WHERE d1.NAME NOT IN (SELECT d2.NICKNAME FROM DETAILS d2 WHERE d2.AGE = d1.AGE)
此查询仅针对小数据运行。
知道如何改进它吗?
你可以很容易地得到结果:
SELECT d1.AGE,
CASE WHEN d1.NAME IS NULL
THEN d1.NIKCNAME ELSE d1.NAME END as [NewName]
FROM DETAILS d1
INNER JOIN DETAILS d2
ON d1.AGE = d2.AGE
WHERE d2.NAME <> d1.NICKNAME
使用 Left Join/Left 外部连接而不是 WHERE ... NOT IN ...
SQL
的执行顺序
- 来自
- 开启
- 外部
- 哪里
- 分组依据
- 多维数据集 |汇总
- 拥有
- SELECT
- 不同
- 订购方式
- 顶部
SQL 查询性能的关键点是使用索引。所以你必须在 querying/joining 列中有索引并且你需要使用它(通过连接)。
例如查询:
SELECT DISTINCT D1.AGE, D1.NAME
FROM DETAILS D1 LEFT JOIN DETAILS D2 ON D1.AGE = D2.AGE
WHERE D1.NAME <> D2.NICKNAME
请注意,您必须事先在 AGE、NAME 和 NICKNAME 列上创建索引才能充分受益于此查询。
我有一个 table 包含 3 列:年龄、姓名、昵称 我只想获取昵称+年龄中根本不存在姓名+年龄的姓名(+年龄)。
例如:如果 table:DETAILS 包含 2 行:
- 年龄:5 姓名:苏子 昵称:苏子
- age:2,名字:gil,昵称:g
查询将 return : age:2 , name : gil
SELECT d1.AGE, d1.NAME
FROM DETAILS d1
WHERE d1.NAME NOT IN (SELECT d2.NICKNAME FROM DETAILS d2 WHERE d2.AGE = d1.AGE)
此查询仅针对小数据运行。 知道如何改进它吗?
你可以很容易地得到结果:
SELECT d1.AGE,
CASE WHEN d1.NAME IS NULL
THEN d1.NIKCNAME ELSE d1.NAME END as [NewName]
FROM DETAILS d1
INNER JOIN DETAILS d2
ON d1.AGE = d2.AGE
WHERE d2.NAME <> d1.NICKNAME
使用 Left Join/Left 外部连接而不是 WHERE ... NOT IN ...
SQL
的执行顺序- 来自
- 开启
- 外部
- 哪里
- 分组依据
- 多维数据集 |汇总
- 拥有
- SELECT
- 不同
- 订购方式
- 顶部
SQL 查询性能的关键点是使用索引。所以你必须在 querying/joining 列中有索引并且你需要使用它(通过连接)。
例如查询:
SELECT DISTINCT D1.AGE, D1.NAME
FROM DETAILS D1 LEFT JOIN DETAILS D2 ON D1.AGE = D2.AGE
WHERE D1.NAME <> D2.NICKNAME
请注意,您必须事先在 AGE、NAME 和 NICKNAME 列上创建索引才能充分受益于此查询。