Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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
加速冰冷的sql语句?_Sql_Indexing_Case_Sybase - Fatal编程技术网

加速冰冷的sql语句?

加速冰冷的sql语句?,sql,indexing,case,sybase,Sql,Indexing,Case,Sybase,我正在写一个报告,在三个表上执行联接 PartitionCode大约有127行。 AcctListLocal大约有17000行。 TrialBal有7000000多行 数据库管理系统是Sybase 15 这是永远需要执行-超过45分钟。它是一个被其他团队使用的开发服务器,但我仍然不认为它的执行时间是可以接受的 所有表格都有复合PKs- AcctListLocal (PK and Index) ============= acct_local lv1 lv2 entity_code Partit

我正在写一个报告,在三个表上执行联接

PartitionCode大约有127行。 AcctListLocal大约有17000行。 TrialBal有7000000多行

数据库管理系统是Sybase 15

这是永远需要执行-超过45分钟。它是一个被其他团队使用的开发服务器,但我仍然不认为它的执行时间是可以接受的

所有表格都有复合PKs-

AcctListLocal (PK and Index)
=============
acct_local
lv1
lv2
entity_code

PartitonCode (PK and Index)
============
entity_code
partition_code

TrialBal (PK + 3 indexes)
========
**PK/Index 1**
ac_cp
ac_gl
ac_gl_ctrl
ac_taps
code
ccy
id
company
co_ta
cc
entity_code
partition_code
pl_date
pro_num
src

**Index 2**
pl_date
entity_code
pro_num

**Index 3**
pl_date
entity_code
company
ac_gl

**Index 4**
pnl_date
entity_code
partition_code
我的问题的一部分是加入不完整索引,也就是说,所有索引都是“复合”字段,但我只匹配其中的几个?我是否在上创建索引 试算表由实体代码和分区代码组成,以匹配分区代码 和 实体代码和ac\U gl上的AccListLocal,以将查找与RegalTrialBal匹配

还是说这些案例陈述太可怕了

SQL语句如下:

INSERT INTO #VolumesAndValues 
    SELECT 
        ahl.lv1 AS base, 
        ahl.lv2 AS ap, 
        ahl.lv3 AS mc1, 
        sum(tb.us) as total,
        SUM(CASE WHEN pc.partition_lv2 = 'MA' THEN tb.us ELSE 0 END) AS base,
        SUM(CASE WHEN pc.partition_lv2 = 'AJ' THEN tb.us ELSE 0 END) AS batch,
        SUM(CASE WHEN pc.partition_lv2 in('ADCG','ADIG') AND 1=1 THEN rtb.us ELSE 0 END) AS net,                    
        SUM(CASE WHEN pc.partition_lv2 = 'FR' THEN tb.us ELSE 0 END) AS fr,
        SUM(CASE WHEN pc.partition_lv2 = 'PA' THEN tb.us ELSE 0 END) AS pa,
        SUM(CASE WHEN pc.partition_lv2 = 'RE' THEN tb.us ELSE 0 END) AS re,
        SUM(CASE WHEN pc.partition_lv2 = 'OF' THEN tb.us ELSE 0 END) AS of,
        SUM(CASE WHEN pc.partition_lv2 = 'PR' THEN tb.us ELSE 0 END) AS pr,
        '1 Table Data' as rowType
FROM TrialBal tb 
    LEFT OUTER JOIN AcctListLocal al ON tb.entity_code = al.entity_code
        and tb.ac_gl_c = al.ac_local
    LEFT OUTER JOIN PartitionCode pc ON pc.partition_code = tb.partition_code
GROUP BY al.lv1, al.lv2, al.lv3

如果数据结构允许,请在所有案例语句之前执行聚合,例如:

INSERT INTO #VolumesAndValues 
SELECT
    base
    ,ap
    ,mc1
    ,plv2
    ,sum(subtotal) as total
    ,SUM(CASE WHEN plv2 = 'MA' THEN subtotal ELSE 0 END) AS base
    ,SUM(CASE WHEN plv2 = 'AJ' THEN subtotal ELSE 0 END) AS batch
    ,SUM(CASE WHEN plv2 in('ADCG','ADIG') AND 1=1 THEN othersubtotal ELSE 0 END) AS net                    
    ,SUM(CASE WHEN plv2 = 'FR' THEN subtotal ELSE 0 END) AS fr
    ,SUM(CASE WHEN plv2 = 'PA' THEN subtotal ELSE 0 END) AS pa
    ,SUM(CASE WHEN plv2 = 'RE' THEN subtotal ELSE 0 END) AS re
    ,SUM(CASE WHEN plv2 = 'OF' THEN subtotal ELSE 0 END) AS of
    ,SUM(CASE WHEN plv2 = 'PR' THEN subtotal ELSE 0 END) AS pr
    ,'1 Table Data' as rowType
FROM (
    SELECT 
        ahl.lv1 AS base 
        ,ahl.lv2 AS ap
        ,ahl.lv3 AS mc1 
        ,pc.partition_lv2 as plv2
        ,sum(tb.us) as subtotal
        ,sum(rtb.us) as othersubtotal
    FROM TrialBal tb 
    LEFT OUTER JOIN AcctListLocal al ON tb.entity_code = al.entity_code
        and tb.ac_gl_c = al.ac_local
    LEFT OUTER JOIN PartitionCode pc ON pc.partition_code = tb.partition_code
    GROUP BY 
            al.lv1
            ,al.lv2
            ,al.lv3 
            ,pc.partition_lv2
) subq
GROUP BY
    base
    ,ap
    ,mc1
    ,plv2

您正在对一个有7000万行的表执行左联接。所有数据都需要处理,因此查询将花费很长时间。我将用内部联接替换外部联接,看看这对执行时间有什么影响-尽管每个TrialBal行都应该映射到其他两个表中的一个条目。因此,一个表中的17000行(
AcctListLocal
)映射到
TrialBal
中的7000000行。即每个“AcctListLocal”记录有4000多行。这对我来说似乎很重要。我更惊讶的是,在这样一个数据结构中,没有一个单列主键链接表。遗憾的是,没有我的模式(没有修改的权力),只是处理掉的问题!感谢您的建议-上面的连接和Gordon Linoff的内部连接之间的差异可以忽略不计。这只是我正在处理的数据量吗?唯一的其他选择是潜在地将其发送到KDB,这会给我带来麻烦…尝试执行我的解决方案和内部连接,Gordon和我的建议都会解决不同的性能问题。在我的例子中,我最小化了您的query.Hmmm需要执行的比较操作的数量,这是一个改进——从36分钟减少到了22分钟!不错。我现在想不出任何更明显的查询修复方法,但您可以查看其他人评论过的索引情况。查看您发布的模式,我认为您的查询根本无法使用索引2-4。如果您不能添加或请求索引,您的项目需求是否允许您添加一个参数来筛选日期范围?如果你能使用PL_Date,我想你会看到一个巨大的性能提升。