Sybase上的SQL查询缓慢

哈维尔·里维拉(Javier Rivera)

我正在尝试从数据库中提取信息。Sybase ASE 16(不确定SP是否正确)。我自己没有直接访问数据库的权限,因此我必须请一个同事运行代码以提取我随后使用的信息。

首先,执行以下代码:

create table AAA (
    Operacion varchar(10) null,
    Actual smallint null,
    Castigado smallint null,
    RentasVar smallint null)
go

使用bcp从文本文件填充Table Indice。实际,Castigado和RentasVar为0或1。

然后这段代码:

create view XXX as
    select Operacion, cast(convert(char(8), FecAplica, 112) as int) as FecAplica,
            IdPolizaSeg, SaldoInsSeg, CapitalSeg, InteresSeg,
            IvaSeg, MontoSeg, SegVenc
        from SEG_Vencim
        where Operacion in (
            select Operacion from AAA 
                where Actual=1)
go

create view YYY as
    select Operacion, IdTipoMov, DescMov, IdMoneda, StatuMov,
            cast(convert(char(8), FecMov, 112) as int) as FecMov,
            cast(convert(char(8), FecVencMov, 112) as int) as FecVencMov,
            cast(convert(char(8), FecPago, 112) as int) as FecPago,
            MontoMov, IvaMov, TotalMov, MontoDelPago
        from Movimientos
        where (Operacion in (
            select Operacion from AAA where Castigado=1))
                or (Operacion in (
                    select Operacion from AAA where Actual=1)
                        and (FecPago=null or FecPago>dateadd(dd, -30, current_date())))
go

Movimientos中的Field Operacion是varchar(10)。我无法修改此表。

发出bcp指令以将XXX的内容复制到文本文件中。编写了aprox文件后,该任务在几秒钟后完成。140 MB。发出bcp指令以将YYY的内容复制到文本文件中。编写了aprox文件后,将近7个小时后任务完成。70 MB。

所以我的问题是第二条bcp指令花费的时间太长。我读到where子句的功能效率很低,所以我请同事再次尝试使用

and (FecPago=null or FecPago>='2020-09-30'))

代替

and (FecPago=null or FecPago>dateadd(dd, -30, current_date())))

但这没有帮助。

AAA具有80,000至90,000条记录。给它加一个索引会有所帮助吗?我读到,毫无疑问的查询可能会有所帮助,就我而言是否有帮助?如果是这样,为什么第一个查询中的嵌套查询有效?

我不能自己运行测试,也无法访问执行计划。我意识到,如果没有我提供其他信息,可能无法就此提供建议。

德罗比

我在Sybase方面经验不足,但是在MSSQL(与Sybase有着相同的渊源)中,它们OR往往是性能杀手。UNION按照markp-fuso的建议将其更改为结构通常是一个好主意。

就是说,我不知道将OR整个移入子选择会做什么:

create view YYY as
    select <your fields>
     from Movimientos
     where Operacion in (select Operacion 
                           from AAA 
                          where ( Castigado = 1)
                             or ( (Actual = 1 and (FecPago=null or FecPago > dateadd(dd, -30, current_date()))))
                        )

不知道优化程序可以对上述操作做什么。因此,我想知道如果我们首先强制AAA上的操作“实现”会发生什么……您可以尝试以下吗?

create view YYY as
    select <your fields>
     from Movimientos m
     JOIN (SELECT DISTINCT Operacion 
             from AAA 
            where ( Castigado = 1)
               or ( (Actual = 1 and (FecPago=null or FecPago > dateadd(dd, -30, current_date()))))
          ) d
      ON d.Operacion = m.Operacion 
      

祝好运。

PS:除了UNION用于摆脱ORs之外,您还可以尝试使用WHERE EXISTS()代替IN()构造。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章