多个表上的SQL索引,可以这样做吗?

时间:2011-09-26 09:26:07

标签: sql indexing

现在一直在寻找解决方案,

转到(1)或(2)跳过说明, 首先,我将解释一下情况。

我的公司升级了我们的erp。系统,我的主要工作是创建公司其他人使用的列表,我从这个系统数据库中获取所有数据 在升级过程中,我们将一些数据转换为与新版本匹配,其中一些被遗忘,其中一些未被篡改,只是直接导出到新数据库, 它在一个单独的服务器上, 基本上它是一个成功的新ERP。系统按照假设, 但是很多我的名单都被打破了, 我的列表使用的数据缺失/ partially_missing / all_there

好吧所以问题是我需要从旧数据库中丢失数据,好吧新旧数据库上的联合应该能够做到这一点,但是我不想要重复记录,“转换到新数据库的数据也是存在于旧数据库中“因此他们可以存在两个字段”,我试过它“

所以2.我的解决方案的版本

我缺少主键“iseries数据库”所以我去了一个组合使用单独密钥的组合,“需要很长时间来解释我是如何做到的” 然而,它最终导致我在两个数据库上创建一个联合视图,确保没有记录存在两次,

(1) 所以这就是我现在所拥有的, 旧表和新表组合的视图 所有内置都使用“uniqe”键进行检查.... 每当我需要升级的数据时,我必须在每个表上运行一个昂贵的查询,“有些人使用这些视图超过40次” (问题1)我如何“节省成本”从两个不同的模式/数据库中获取数据并绑定在一起?

(2) 我能想到的唯一能给我这个表现的是制作索引而不是我建立的这些视图,但是直到现在我还没有找到任何关于如何获取的信息, (问题2)我可以在两个表上创建索引,

我的数据库是/ 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 个答案:

答案 0 :(得分:6)

答案是否定的。

我无法在多个表上创建索引。

我的解决方案是制作一张桌子,而在我的情况下也是一张视图, 或者我可以优化SQL代码。

修改

我刚刚了解到在MS(至少2012版本)中,您可以创建索引视图。所以在我的情况下,我会将我的观点转换为索引视图,并获得巨大的性能升级。

答案 1 :(得分:5)

创建一个存储昂贵查询值的新表,然后如果新数据库中有记录,则总是会忽略旧数据。然后只需添加一些触发器,以便在其他表更新时更新此新表。

也许,更好的问题是提供您的架构,然后当前昂贵的查询要求人们帮助加快它的速度。

编辑:现在您已经发布了表格,我看到了一件可以改进的事情,请查询第二部分:

...
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}的索引,那么它应该比您当前获得的性能要好得多。