多表SQL索引,可以实现吗?

13

我已经搜索了一段时间,寻找解决方案。

如果想跳过描述,请前往 (1) 或 (2),首先我会解释情况。

我们公司升级了ERP系统,我的主要工作是创建供其他人使用的列表,我从该系统的数据库中获取所有数据。 在升级期间,我们将一些数据转换为与新版本匹配的格式,有些被留下了,有些则没有被更改,直接导出到新的数据库中,这是在一个独立的服务器上完成的,基本上算是成功了,新的ERP系统运行正常,但我的很多列表都已经坏了,我的列表使用的数据缺失/部分缺失/全部缺失。

好的,问题是我需要从旧数据库中获取缺失的数据,用新旧数据库联合查询应该可以解决这个问题,但我不想要重复的记录。"将数据转换为新数据库后,也存在于旧数据库中"因此两个字段可能同时存在,"我试过了"

所以我的解决方案的第二个版本

我缺少"iSeries数据库"的主键,所以我连结一些字段组成唯一键,"花费太长时间来解释我是如何做到的",然而最终我还是创建了一个视图,在两个数据库上进行联合查询,确保没有重复的记录。

(1)现在我的解决方案如下,旧表和新表数据的组合视图,所有内容都建立在“唯一”键上进行检查....每次我需要从升级后受影响的数据中获取数据时,我必须对每个表运行一个昂贵的查询,"有些人使用这些视图超过40次"。

(问题1)如何“具有成本效益”地将来自两个不同架构/数据库的数据绑定在一起?

(2)我唯一想到的可以提高性能的方法是制作索引,而不是我构建的这些视图,但至今我还没有找到任何关于如何制作索引的信息,(问题2)我可以在两个表上创建索引吗?

我的数据库是AS/400 - iSeries,但我感兴趣的是针对任何类型的数据库的解决方案,我非常灵活使用资源。

:编辑:用于创建视图的代码稍作修改:

SELECT

CTCONO,
CTDIVI,
CTSTCO,
CTSTKY,
CTLNCD,
CTTX40,
CTTX15,
CTPARM,
CTTXID,
CTRGDT,
CTRGTM,
CTLMDT,
CTCHNO,
CTCHID

FROM NEWDB.CSYTAB
UNION
SELECT * FROM OLDDB.CSYTAB

WHERE ( CTCONO,CTDIVI,CTSTCO,CTSTKY,CTLNCD ) NOT IN
(
SELECT A.CTCONO,A.CTDIVI,A.CTSTCO,A.CTSTKY,A.CTLNCD FROM NEWDB.CSYTAB A, OLDDB.CSYTAB B
WHERE A.CTCONO = B.CTCONO
AND A.CTDIVI = B.CTDIVI
AND A.CTSTCO = B.CTSTCO
AND A.CTSTKY = B.CTSTKY
AND A.CTLNCD = B.CTLNCD

)
2个回答

9
答案是否定的。
我无法在多个表上创建索引。
我的解决方案是创建一个表,对于我的情况还可以创建一个视图,或者我可以优化SQL代码。
编辑
我刚学到,在MS(至少2012版本中)可以创建索引视图。所以在我的情况下,我会将我的视图转换为索引视图,并获得大量性能提升。

1
是的,你可以。请注意,在某些本地版本的SQL Server中,许可版本可能很重要 - 企业版与基本版。开发人员版的功能类似于企业版,因此在生产环境中可能会有意外情况发生。 - Sql Surfer
@SqlSurfer,你错过了我写的“我的数据库是AS/400”的部分。(也就是IBM db2数据库) - Christopher Bonitz
我想我把我的评论发到了错误的开放窗口 - 应该有一个徽章来表示这个。 - Sql Surfer
当然可以。https://www.researchgate.net/profile/Robert_Laurini/publication/220649683_Spatial_Multi-Database_Topological_Continuity_and_Indexing_A_Step_Towards_Seamless_GIS_Data_Interoperability/links/54db4fcf0cf2ba88a68fc230/Spatial-Multi-Database-Topological-Continuity-and-Indexing-A-Step-Towards-Seamless-GIS-Data-Interoperability.pdf - CoolCK

6
创建一个新表来存储昂贵查询的值,如果一条记录在新数据库中存在,则通常会忽略旧数据。然后,在其他表被更新时添加一些触发器来更新这个新表。也许更好的问题是提供您的模式和当前昂贵查询,然后寻求帮助使其更快。编辑:现在您已经发布了您的表,我看到您可以改进查询的第二部分为:
...
UNION
SELECT * FROM OLDDB.CSYTAB B
WHERE NOT EXISTS(
    SELECT TOP 1 1 
    FROM NEWDB.CSYTAB A
    WHERE A.CTCONO = B.CTCONO
        AND A.CTDIVI = B.CTDIVI
        AND A.CTSTCO = B.CTSTCO
        AND A.CTSTKY = B.CTSTKY
        AND A.CTLNCD = B.CTLNCD
    )

假设您在 NEWDB.CSYTAB 中有一个跨越 { CTCONO,CTDIVI,CTSTCO,CTSTKY,CTLNCD } 的唯一索引,那么性能应该比当前要好得多。

创建一个新表可以解决我的问题,但问题在于我必须对我的列表进行大量更改,使得庞大而复杂的查询变得更加复杂,“我需要与“ctrl”表连接”,不过这是个好建议,我现在也发布了一些代码,谢谢。 - Christopher Bonitz
即使没有取最优解,它的性能也应该比你的代码更好,否则你无法做太多。 - Seph
你可以尝试使用LINQpad(http://www.linqpad.net/),它是免费的,当我没有管理工具连接到SQL数据库时,我会使用它。 - Seph
很想使用它,看起来不错,但是很遗憾,我们仍然在运行旧的scool asp“带有vbscript”,因此linq是不可能的,“我知道它非常酷,但老板说不”。 - Christopher Bonitz
好的,现在一定会试试看的,:P - Christopher Bonitz
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接