0

我正在处理从一个源到另一个源的数据导入例程,并且我有一个没有自己唯一标识符的表。相反,它使用四个字段的组合来确定要修改的记录。我的源表结构如下:

feed_hcp_leasenote 表:

BLDGID varchar(255),
LEASID varchar(255),
NOTEDATE varchar(255),
REF1 varchar(255),
NOTETEXT varchar(8000),
tempid int PRIMARY, AUTONUMBER

前四个是在完全评估时使记录在源数据库中唯一的字段。我将此数据导入到两个表中,一个用于注释,另一个用于其他字段。这是我的新数据库结构:

租约表:

lnid int PRIMARY AUTONUMBER,
notetext longtext,
lid int (lease ID, links to lease table)

customfield_data 表(保存其他数据):

cfdid int PRIMARY AUTONUMBER,
data_date dateteime,
data_smtext varchar(1000),
linkid int (links the data to its source ID)
cfid int (links the data to its field type)

我遇到的问题是,当我尝试识别源数据库中存在的那些记录而新数据库中没有匹配项时,我的查询似乎将记录复制到查询永远不会完成并锁定我的服务器的地步。我可以根据 BLDGID 和 LEASID 成功查询并将查询限制为正确的记录,但是当我尝试加入别名为 NOTEDATE 和 REF1 字段的 customfield_data 表时,它开始以指数方式复制记录。这是我的查询:

SELECT NOTEDATE, REF1, REF2, LASTDATE, USERID, NOTETEXT, lid
FROM feed_hcp_leasenote
JOIN customfield_data mrileaseid ON feed_hcp_leasenote.LEASID = mrileaseid.data_smtext AND mrileaseid.cfid = 36
JOIN leases ON mrileaseid.linkid = leases.lid
JOIN suites ON leases.sid = suites.sid
JOIN floors ON suites.fid = floors.fid
JOIN customfield_data coid ON floors.bid = coid.linkid AND coid.cfid = 1 AND coid.data_smtext = feed_hcp_leasenote.BLDGID
JOIN customfield_data status ON leases.lid = status.linkid AND status.cfid = 27 AND status.data_smtext <> 'I'
WHERE tempid NOT IN (
  SELECT tempid
  FROM feed_hcp_leasenote
  JOIN customfield_data mrileaseid ON feed_hcp_leasenote.LEASID = mrileaseid.data_smtext AND mrileaseid.cfid = 36
  JOIN leases ON mrileaseid.linkid = temp_leases.lid
  JOIN suites ON leases.sid = suites.sid
  JOIN floors ON suites.fid = floors.fid
  JOIN customfield_data coid ON floors.bid = coid.linkid AND coid.data_smtext = feed_hcp_leasenote.BLDGID AND coid.cfid = 1
  JOIN customfield_data notedate ON STR_TO_DATE(feed_hcp_leasenote.NOTEDATE, '%e-%b-%Y') = notedate.data_date AND notedate.cfid = 55 
  JOIN customfield_data ref1 ON feed_hcp_leasenote.REF1 = ref1.data_smtext AND ref1.cfid = 56
  JOIN lease_notes ON leases.lid = lease_notes.lid AND notedate.linkid = lease_notes.lnid AND ref1.linkid = lease_notes.lnid )

目前,我已将问题缩小到 NOT IN 子查询——仅运行该部分会使服务器崩溃。我想问题是因为可以有多个具有相同 BLDGID、LEASID、NOTEDATE 和 REF1(但不是全部 4 个)的音符,所以查询会不断选择自身并有效地创建一个无限循环。

没有修改源数据库以包含唯一 ID(我不能这样做),有没有人看到解决方案?提前致谢!

(根据反馈修改)

抱歉,信息不足,我很担心。基本上,我是从另一个我无法控制的数据库转储的 CSV 文件中导入 feed_hcp_leasenote 中的数据。将数据导入服务器后,我会添加一个 tempid 字段,并打算在 SELECT WHERE tempid NOT IN 查询中使用它,尽管我不接受这种方法。

我的目标是将 feed_hcp_leasenote 中的数据拆分为两个表:lease_note 包含主记录(具有唯一 ID)和便笺本身;customfield_data 保存与记录相关的其他数据。

源数据馈送包含大约 65,000 条记录,其中我要导入大约 25,000 条,因为其余的都连接到已停用的记录。

(第二次编辑)

相关表格的视觉架构:http ://www.tentenstudios.com/clients/relynx/schema.png

解释查询:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   PRIMARY     status  ref     data_smtext,linkid,cfid     cfid    4   const   928     Using where
1   PRIMARY     mrileaseid  ref     data_smtext,linkid,cfid     linkid  5   rl_hpsi.status.linkid   19  Using where
1   PRIMARY     leases  eq_ref  PRIMARY,sid     PRIMARY     4   rl_hpsi.mrileaseid.linkid   1   Using where
1   PRIMARY     suites  eq_ref  PRIMARY,fid     PRIMARY     4   rl_hpsi.leases.sid  1    
1   PRIMARY     floors  eq_ref  PRIMARY,bid     PRIMARY     4   rl_hpsi.suites.fid  1    
1   PRIMARY     feed_hcp_leasenote  ref     BLDGID,LEASID   LEASID  768     rl_hpsi.mrileaseid.data_smtext  19  Using where
1   PRIMARY     coid    ref     data_smtext,linkid,cfid     data_smtext     1002    rl_hpsi.feed_hcp_leasenote.BLDGID   10  Using where
2   DEPENDENT SUBQUERY  feed_hcp_leasenote  eq_ref  PRIMARY,BLDGID,LEASID   PRIMARY     4   func    1    
2   DEPENDENT SUBQUERY  mrileaseid  ref     data_smtext,linkid,cfid     data_smtext     1002    rl_hpsi.feed_hcp_leasenote.LEASID   10  Using where
2   DEPENDENT SUBQUERY  leases  eq_ref  PRIMARY,sid     PRIMARY     4   rl_hpsi.mrileaseid.linkid   1    
2   DEPENDENT SUBQUERY  suites  eq_ref  PRIMARY,fid     PRIMARY     4   rl_hpsi.leases.sid  1    
2   DEPENDENT SUBQUERY  floors  eq_ref  PRIMARY,bid     PRIMARY     4   rl_hpsi.suites.fid  1    
2   DEPENDENT SUBQUERY  ref1    ref     data_smtext,linkid,cfid     data_smtext     1002    rl_hpsi.feed_hcp_leasenote.REF1     10  Using where
2   DEPENDENT SUBQUERY  lease_notes     eq_ref  PRIMARY     PRIMARY     4   rl_hpsi.ref1.linkid     1   Using where
2   DEPENDENT SUBQUERY  coid    ref     data_smtext,linkid,cfid     data_smtext     1002    rl_hpsi.feed_hcp_leasenote.BLDGID   10  Using where
2   DEPENDENT SUBQUERY  notedate    ref     linkid,cfid     linkid  5   rl_hpsi.ref1.linkid     19  Using where
4

1 回答 1

0

没有它自己的唯一标识符。相反,它使用四个字段的组合来确定要修改的记录

否:如果四个字段组合构成一个唯一键,那么您就有一个唯一标识符 - 只有一个由四个部分组成。

BLDGID varchar(255)、LEASID varchar(255)、NOTEDATE varchar(255)、REF1 varchar(255)、NOTETEXT varchar(8000)

因此,您不知道数据的实际结构,或者您是从一个也不知道的 MSAccess 程序员那里得到的。

从 feed_hcp_leasenote 中选择 NOTEDATE、REF1、REF2、LASTDATE、USERID、NOTETEXT、盖子

我的天啊。如果那是答案,那么您问的是错误的问题。

没有修改源数据库以包含唯一 ID(我不能这样做),有没有人看到解决方案?

找另一份工作?严重地。如果您无法将主键添加到导入表/无法将其导入到定义了主键的临时表中,那么您将花费大量时间来尝试解决此问题。

顺便说一句:虽然 innodb 将处理最多 3072 字节(32 位上为 1024)的键,但它会继续像狗一样运行,直到您减小列大小或使用实际 PK 数据的散列作为主键。

从您的问题中不清楚您要添加多少行/数据库中已有多少行。您也没有提供其他表格的结构。 您也没有提供解释计划,这应该是您解决任何性能问题的起点。

有可能让它运行得更快 - 从您提供的信息中无法判断。但是考虑到你必须在不改变架构的情况下让它更快的荒谬限制,我想知道还有什么其他的恐怖等待着。

我确实认为,在不知道当前模式的详细信息的情况下,可以将当前查询分解为几个组件并检查每个组件,在导入表中维护一个分数 - 然后使用分数来确定哪些数据不匹配 -但是,这也需要架构更改。

顺便说一句,在 SQL 中有 DISTINCT 关键字的 google。

于 2013-03-04T21:45:08.080 回答