我有2个表a和b,每个表都有2 M和320万条记录。我正在尝试从a获取b中不存在的id。我在查询下面写了
com.android.tools.build:gradle:3.5.0-alpha09
这需要更长的时间。有什么更好的方法可以更快地获得结果。
更新:我只查看了两个表的表结构,发现表a.id具有十进制数据类型,表b.id具有varchar作为数据类型
数据类型的这种差异会导致任何问题。
答案 0 :(得分:0)
您可以尝试将LEFT JOIN
与NULL
一起使用。它将返回TableA中存在的ID和TableB中不存在的ID。
SELECT T1.Id
FROM TableA T1
LEFT JOIN TableB T2 ON T2.Id = T1.Id
WHERE T2.Id IS NULL
答案 1 :(得分:0)
虽然可以使用反联接来编写查询,但它可能不会对性能产生太大影响,实际上,基础执行计划甚至可以相同。我可以看到加快查询速度的唯一方法是向public class TC1 {
WebDriver driver;
@Test
public void testCaseOne() {
// Printing Id of the thread on using which test method got executed
System.setProperty("webdriver.chrome.driver", "your ChromeDriver path");
driver = new ChromeDriver();
driver.get("https://www.google.com");
}
}
表添加索引:
b
但是,如果CREATE TABLE idx ON b (id);
是主键,则它应该已经是聚簇索引的一部分。在这种情况下,您当前的性能可能会达到您想要的水平。
答案 2 :(得分:0)
(这主要是评论,但有点长)
请花一些时间阅读关于查询优化的许多问题,这里是SO。那些被否决的和封闭的省略了表/索引的定义并解释了计划。将会收到投票的人包括基数,性能和结果指标。
子查询中表a的联接是多余的。当您删除对该表的第二个引用时,您将得到一个更简单的查询。然后,您可以使用“不在”或左联接。
但是性能仍然很糟糕。在数据设计中,应尽可能避免将自己画在这样的角落。
答案 3 :(得分:0)
感谢您的宝贵回答,我找到了解决之道。在为查找ID保留相同的数据类型后,解决了该问题,并在22秒内得到了结果。