在Sybase上执行慢的SQL查询

问题描述

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

首先,执行以下代码

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

Table Indice使用bcp从文本文件填充。实际,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,FecMov,112) as int) as FecMov,FecVencMov,112) as int) as FecVencMov,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,current_date())))

但这没有帮助。

AAA具有80,000至90,000条记录。给它加一个索引会有所帮助吗? 我了解到,取消嵌套查询可能help,这对我有帮助吗?如果可以,为什么第一个查询中的嵌套查询有效?

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

解决方法

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

也就是说,我不知道将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,current_date()))))
          ) d
      ON d.Operacion = m.Operacion 
      

祝你好运。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...