我有一个包含数百万行的交易表。每行代表交易的版本。如果我给了一个可能的新交易,我将它与交易表中的最新版本进行比较。如果它已经改变我添加一个新版本,否则我什么都不做。为了比较这两笔交易,我将交易表中的版本读入我的应用程序。
当我获得成千上万的新交易时,这种方法效果不佳。即使批量读取同时在1000个交易中读取并比较它们,整个过程可能需要几分钟。所有的时间都花在数据库中。
我正试图找到一种方法来比较可能的新交易与交易表中的交易没有那么多的I / O.到目前为止我想出的是在交易表中的每一行添加一个哈希列。哈希是所有贸易领域。然后当我给出可能的新交易时,我计算它们的哈希值,将值放入临时表中,然后找到不同的值。这感觉非常hacky。有没有更好的方法呢?
由于
- 更多信息
SQL Server 2008
Trade(rowid, tradeid, type, trader, volume, etc..)
- rowid
是唯一的,tradeid
将针对同一行业的差异版本重复
该表格大约有30列,未进行规范化,因此根据type
,某些列可能为null
。有人将数千笔交易发布到一个java servlet,然后该servlet应该为任何已更改的交易添加一个新行。不幸的是,为了做到这一点,java servlet必须读取数千个交易中的每一个并进行比较。
最新版本的particuluar交易只是具有最高rowid的版本。
答案 0 :(得分:1)
如果您使用的是SQL Server 2008,则可能需要使用MERGE语句。
在唯一标识每笔交易的列上创建索引。
答案 1 :(得分:0)
哈希不是一个糟糕的解决方案。如果您发布有关表结构的更多信息,将会有所帮助。
标准的方法是简单地运行UPDATE语句,WHERE子句将包含关键字段的连接:WHERE table.PRODUCT_ID = NEWTRADE.PRODUCT_ID;另外,检查值字段:WHERE table.TRADE_AMOUNT<> newtrade.BIDAMOUONT;如果您按PRODUCT_ID索引表 - 它将运行毫秒。
您可以先在表中插入数千个新交易,然后运行UPDATE以使用新交易加入主表。再次,确保您正确地索引表。
答案 2 :(得分:0)
鉴于您告诉我们的内容,听起来您正在寻找一种方法来确定行是否发生了变化。这是rowversion
列(以前称为时间戳)的良好候选者。只要行中的任何值发生更改,此列就会更改。因此,您可以将最后一笔交易的rowversion与当前的rowversion进行比较,以确定它们是否不同。
如果您向我们展示一些关于表模式的其他详细信息,特别是如何确定“last”以及如何匹配两个表中的行(即匹配键之间的匹配键),则可以在单个insert语句中执行此操作。两个表)。