Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sybase上的慢速SQL查询_Sql_Database_Query Optimization_Sap Ase - Fatal编程技术网

Sybase上的慢速SQL查询

Sybase上的慢速SQL查询,sql,database,query-optimization,sap-ase,Sql,Database,Query Optimization,Sap Ase,我正试图从数据库中提取信息。Sybase ASE 16不确定SP Though。我自己没有直接访问数据库的权限,所以我必须让同事运行代码来提取我随后使用的信息 首先,执行以下代码: create table AAA ( Operacion varchar(10) null, Actual smallint null, Castigado smallint null, RentasVar smallint null) go 使用bcp从文本文件填充表Indice。

我正试图从数据库中提取信息。Sybase ASE 16不确定SP Though。我自己没有直接访问数据库的权限,所以我必须让同事运行代码来提取我随后使用的信息

首先,执行以下代码:

create table AAA (
    Operacion varchar(10) null,
    Actual smallint null,
    Castigado smallint null,
    RentasVar smallint null)
go
使用bcp从文本文件填充表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中的现场操作为varchar10。我无法修改此表

发出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有80000到90000条记录。在上面加个索引会有帮助吗? 我读到一些令人不安的问题,这对我有帮助吗?如果是这样,为什么第一个查询中的嵌套查询可以工作


我无法独自运行测试,也无法访问执行计划。我意识到,如果我不提供更多信息,就可能无法就此向我提供建议。

我对Sybase没有太多经验,但在与Sybase有着相同祖先的MSSQL中,ORs往往是性能杀手。按照markp fuso的建议,将这些结构更改为联合结构通常是一个好主意

也就是说,我想知道将OR完全移动到sub select中会做什么:

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 construction。

这可能会比在上支持的多一些,例如,我们希望看到查询计划ie,set statement_cache off/set showplan on/set noexec on/go/select*from YYY/go-这应该在不执行查询的情况下生成查询计划,从sp_help/sp_spaceused输出,1用于所有有问题的表,并且根据查询计划的复杂程度,可能为所有有问题的表生成optdiag输出;最简单/最快速的解决方案可能是将YYY分解为3个单独的查询,每个`OR*子句一个查询,以查看是否存在任何问题……如果您可以让3个单独的查询运行'fast',那么您可以尝试将YYY创建为3路联合,而不是联合所有3个单独的查询;虽然“取消测试”查询可能会有所帮助,但ASE16的优化器应该足够聪明,可以为您“取消测试”查询;我还建议添加一个索引并更新FecPago列上的索引统计信息,如果其中至少还没有索引,那么与索引相关的统计信息可能会帮助优化器决定不使用UNION,因为我更愿意将信息放在上面。如果必须写入选择,则将其分为三个单独的视图/文件。。。第三部分。所以这个解决方案相当于使用UNION而不是OR,我简直不敢相信它能奏效!我的直觉仍然告诉我,我最初的查询应该稍微高效一些,但我知道直觉可能是不可靠的。谢谢我决定不使用UNION,因为我宁愿把信息放进去。如果必须写入选择,则将其分为三个单独的视图/文件。。。第三部分。所以这个解决方案相当于使用UNION而不是OR,我简直不敢相信它能奏效!我的直觉仍然告诉我,我最初的查询应该稍微高效一些,但我知道直觉可能是不可靠的。谢谢@JavierRivera很高兴它能工作,你最终使用了什么版本?“在何处”或“联接选择不同的”等?SQL的“奇怪”之处在于,你几乎可以告诉系统你想要什么,但却不知道你想要什么;后端将解释您的查询,并根据许多因素找出获取数据的最有效方法。通常情况下,这很有效,有时您必须通过重新编写请求来稍微推动一些事情。