【问题标题】:SQL Index on Multiple tables, can it be done?SQL Index on Multiple tables,可以吗?
【发布时间】:2011-09-26 09:26:06
【问题描述】:

一直在寻找解决方案,

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

我的公司已经升级了我们的 erp。系统,我的主要工作是创建公司其他人使用的列表,我从这个系统数据库中获取所有数据 在升级过程中,我们将一些数据转换为与新版本匹配,其中一些被留下,一些未被篡改,直接导出到新数据库, 它在单独的服务器上, 基本上它是成功的,新的ERP。系统按预期工作, 然而我的很多清单都被打破了, 我的列表使用的数据丢失/partly_missing/all_there

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

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

我缺少主键“iseries 数据库”,所以我去连接一个 feilds 的组合来制作一个 uniqe 键,“解释我是如何做到的需要很长时间” 然而,它最终让我在两个数据库上创建一个联合视图,确保没有记录存在两次,

(1) 所以这就是我现在得到的, 新旧表数据组合的视图 所有这些都建立在“uniqe”键上的检查...... 每次我需要受升级影响的数据时,我都必须对每个表运行昂贵的查询,“有些使用这些视图超过 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

)

【问题讨论】:

    标签: sql indexing


    【解决方案1】:

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

    也许,一个更好的问题是提供您的架构,而当前昂贵的查询然后请求人们帮助使其更快。

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

    ...
    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”表”,不管是好建议,我现在也发布了一些代码,谢谢
    • 这只是一张表,我选择这个是因为它的记录相对较小,只有 7k 条记录,但有些表是数百万条记录“至少超过 20 条”,这张表有 15 列,有些有很多更重要的是,我无法测试你的示例,因为 ibm iseries“not Tsql”不支持 top 但是我相信你可以做 NOT EXISTS,如果这个查询给我更好的性能或者只是更好的格式
    • 即使没有前 1 名,它也应该比您的代码获得更好的性能,但否则您无能为力
    • 我正在考虑您的表解决方案,因为它为我提供了我需要的性能和控制,我可以使表“而不是索引”,然后创建一个视图,从正确的地方,有点像我今天做的,嗯,有没有人知道一些免费的查询分析器,可以与所有类型的 sql 服务器一起使用?
    • 你可以试试 LINQpad (linqpad.net),它是免费的,当我没有连接到 sql db 的管理工具时使用它
    【解决方案2】:

    答案是否定的。

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

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

    编辑

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

    【讨论】:

    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2023-01-06
    相关资源
    最近更新 更多