首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sybase上的慢SQL查询

Sybase上的慢SQL查询
EN

Stack Overflow用户
提问于 2020-10-21 02:12:11
回答 1查看 157关注 0票数 1

我在试着从数据库中提取信息。Sybase ASE 16 (不确定SP思想)。我自己没有直接访问数据库的权限,所以我不得不请一位同事运行代码来提取我随后使用的信息。

首先,执行以下代码:

代码语言:javascript
复制
create table AAA (
    Operacion varchar(10) null,
    Actual smallint null,
    Castigado smallint null,
    RentasVar smallint null)
go

使用bcp从文本文件填充表格Indice。Actual、Castigado和RentasVar为0或1。

然后这段代码:

代码语言:javascript
复制
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个小时后完成。70MB。

所以我的问题是第二个bcp指令花费的时间太长。我读到where子句上的函数效率可能很低,所以我让我的同事再试一次

代码语言:javascript
复制
and (FecPago=null or FecPago>='2020-09-30'))

而不是

代码语言:javascript
复制
and (FecPago=null or FecPago>dateadd(dd, -30, current_date())))

但这并不管用。

AAA有80,000到90,000条记录。在上面建立索引会有帮助吗?我读到解嵌的查询可能会help,这对我的情况有帮助吗?如果是这样,为什么第一个查询中的嵌套查询可以工作?

我不能自己运行测试,也不能访问执行计划。我意识到,如果我不提供额外的信息,可能就不可能给我提供这方面的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-22 16:46:04

我没有太多使用Sybase的经验,但是在MSSQL (它和Sybase有共同的祖先)中,OR往往是性能杀手。像markp-fuso建议的那样,将这些结构更改为UNION结构通常是一个好主意。

这就是说,我想知道将OR完全移到子选择中会做什么:

代码语言:javascript
复制
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上的操作首先‘物化’会发生什么…你能在下面试一试吗?

代码语言:javascript
复制
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去掉OR之外,您还可以尝试使用WHERE EXISTS()而不是IN()构造。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64451080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档