我目前在SQL Server中有两个表:TableA有40,000条记录,TableB有210万条记录 每个表有3列:RowID,First_Name和Last_Name。
我目前从TableA的第一行获取First和Last名称,并将其与TableB中的每一行中的First和Last名称进行比较,直到找到匹配项。但是,正如您可能想象的那样,我的计算机没有足够/足够强大的资源来完成此任务。它将运行几个小时然后SQL Server将崩溃,并且它不会保存它已经完成的任何工作。我想过只允许循环运行一定数量的记录,然后从那里重新启动循环,这样我就可以在SQL崩溃之前保留一些数据,但这将需要永远。
我正在寻找其他程序或语言的建议来解决这个问题。在此期间,我将继续尝试完善我的SQL查询以加快此过程,例如只有比较记录,如果它们具有相同的首字母。我对其他程序或语言并不是很了解,所以我很乐意尝试SQL Server以外的其他程序。我不知道是否有一种语言可以提供更好的资源,或者更好地使用“超时”而不是SQL Server。我对Linux了解很多,所以如果有一些东西我可以利用Linux来节省一些与Windows 8相比的资源,我肯定会对此持开放态度。我不知道Python之类的东西是否会更好用,Linux版本的SQL等等?
感谢您的帮助,感谢您的时间!
编辑-----这是我正在运行的查询的简单版本。
DECLARE TableANameF ,TableANameL
,TableBNameF ,TableBNameL
,TableARowIndex ,TableBRowIndex
,TableARowCount ,TableBRowCount
,NameFDifference ,NameLDifference
SET TableARowIndex = 1
SELECT TableARowCount = COUNT(RowID)
FROM TableA
WHILE (TableARowIndex <= TableARowCount)
SELECT TableANameF = FIRST_Name
,TableANameL = LAST_Name
FROM TableA
WHERE RowID = TableARowIndex
SET TableBRowIndex = 1
SELECT TableBRowCount = COUNT(RowID)
FROM TableB
WHILE (TableBRowIndex <= TableBRowCount)
SELECT TableBNameF = FIRST_Name
,TableBNameL = LAST_Name
FROM TableB
WHERE RowID = TableBRowIndex
SET NameFDifference = DIFFERENCE(TableANameF, TableBNameF)
SET NameLDifference = DIFFERENCE(TableANameL, TableBNameL)
IF (NameFDifference > 3 AND NameLDifference > 3)
--INSERT INTO ANOTHER TABLE TO TRACK MY MATCHES
--INCREMENT TableBRowIndex
--END TABLE B WHILE LOOP
--INCREMENT TableARowIndex
END
答案 0 :(得分:2)
如果您在两个表上为first_name
和last_name
创建索引,那么这应该非常快。
SELECT A.*
FROM TableA A
INNER JOIN TableB B
ON DIFFERENCE(TableANameF, TableBNameF) > 3
AND DIFFERENCE(TableANameL, TableBNameL) > 3
这里的问题是DIFFERENCE
不会使用任何索引。
另一个解决方案是创建一个存储过程来运行您所做的查询并将索引保存在另一个表中,这样您就可以在查询失败时恢复它。
答案 1 :(得分:2)
我认为你只需要索引:
create index idx_tablea_firstname_lastname on tablea(firstname, lastname);
create index idx_tableb_firstname_lastname on tableb(firstname, lastname);
我不确定你想要得到什么,但你应该在数据库中进行查询而不是循环:
select a.*, b.rowid
from tablea a join
tableb b
on a.firstname = b.firstname and a.lastname = b.lastname;
SQL是解决此问题的正确语言/工具。您只需要允许数据库完成工作。