4

以下工作正常,但太慢了。我只需要知道表 B 中有匹配的记录,有什么技巧吗?

(奇怪的是相反的搜索:查找不加入的记录(IS NULL)非常快)

SELECT
  TableA.id
FROM
  TableA
  LEFT JOIN
    TableB 
  ON
    TableB.TableA_id = TableA.id
WHERE
  TableB.id IS NOT NULL and TableA.clientid=13 ;

Clientid 现在已编入索引,但正是这个子条款将查询速度从非常快减慢到几分钟。

(2012 年 3 月 3 日,我现在在功能更强大的服务器上的相同数据库上尝试了相同的查询,查询需要一秒钟。所以看来我的问题是我的原始服务器完全超载,具有讽刺意味的是,上面的查询被用来识别我们可以删除以减少表大小的记录。我将不得不在更快的服务器上重新构建数据库,清理它然后在“慢”服务器上重新生成它)

4

3 回答 3

2

索引应该在 TableB.TableA_id 和 TableA.id 上创建

SELECT
  Count(TableA.id)
FROM
  TableA
  JOIN
    TableB 
  ON
        TableB.TableA_id = TableA.id And TableB.id IS NOT NULL
and TableA.clientid=13 ;
于 2012-05-01T13:20:25.410 回答
1

此查询查找 A 中也在 B 中的所有记录:

SELECT TableA.id
FROM TableA
JOIN TableB ON TableB.TableA_id = TableA.id

如果有索引,它将执行良好TableB.TableA_id(索引TableA.id与此查询的性能无关)

于 2012-05-01T13:21:31.027 回答
0

尝试这个

SELECT TableA.id
FROM TableA
INNER JOIN TableB ON TableB.TableA_id = TableA.id

在这种情况下,由于内部连接,您不需要使用 not null。希望这会是更好的解决方案

于 2012-05-01T13:24:18.950 回答