提高查询速度:简单 SELECT from SELECT in huge table

Improving query speed: simple SELECT from SELECT in huge table

我有一个 table 包含 3 列:年龄、姓名、昵称 我只想获取昵称+年龄中根本不存在姓名+年龄的姓名(+年龄)。

例如:如果 table:DETAILS 包含 2 行:

  1. 年龄:5 姓名:苏子 昵称:苏子
  2. 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

的执行顺序
  1. 来自
  2. 开启
  3. 外部
  4. 哪里
  5. 分组依据
  6. 多维数据集 |汇总
  7. 拥有
  8. SELECT
  9. 不同
  10. 订购方式
  11. 顶部

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 列上创建索引才能充分受益于此查询。