加速冰冷的sql语句?
我正在写一个报告,在三个表上执行联接 PartitionCode大约有127行。 AcctListLocal大约有17000行。 TrialBal有7000000多行 数据库管理系统是Sybase 15 这是永远需要执行-超过45分钟。它是一个被其他团队使用的开发服务器,但我仍然不认为它的执行时间是可以接受的 所有表格都有复合PKs-加速冰冷的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
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,我想你会看到一个巨大的性能提升。