问题描述
我正在尝试从数据库中提取信息。 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()
结构。