ms access sql需要很长时间

disbfnqx  于 2021-08-09  发布在  Java
关注(0)|答案(3)|浏览(274)

一个相当简单的sql查询,连接6个表,其中一个简单的where子句在2秒内完成,如下所示(为了清楚起见,省略细节):

Select (tab1.col1 & ',' & tab1.col2) as COMPUTED_COLUMN
From <join clause for 6 tables>
Where tab1.col3=4 AND tab2.col1=1 AND tab3.col1=21 AND tab1.col2<>-1

太好了!在数据库中tab2有120k条记录并返回280条记录,在2秒内完成。
现在,我只想为计算的列计算不同的值。我知道答案是140。
所以我认为

Select DISTINCT (tab1.col1 & ',' & tab1.col2) as COMPUTED_COLUMN
...

会很好的。需要9分钟以上!
所以我去掉了distinct,而是添加了

GROUP BY (tab1.col1 & ',' & tab1.col2)

在where子句之后。它也需要9分钟以上!
所以,很明显,这不是实现我想做的事情的正确方法。
我做错什么了?或者,计算tab1.col1和tab1.col2组合的唯一值的正确方法是什么?

lzfw57am

lzfw57am1#

我认为您最好执行初始选择,然后将结果插入临时表。从那里,处理你的 DISTINCT 指挥应该非常迅速。完成后不要忘记删除/清理临时表。

h5qlskok

h5qlskok2#

我可以建议首先使用您当前的查询及其 WHERE 子句,然后子查询以生成计算列:

SELECT DISTINCT col1 & ',' & col2 AS COMPUTED_COLUMN
FROM
(
    SELECT tab1.col1, tab2.col2
    FROM <join clause for 6 tables>
    WHERE tab1.col3 = 4 AND tab2.col1 = 1 AND tab3.col1 = 21 AND tab1.col2 <> -1
) t;

如果这样做有用的话,这里的想法是我们可以首先在子查询中丢弃许多记录,然后只需要在外部查询中聚合很少的记录。

tktrz96b

tktrz96b3#

在子查询中进行数据选择,其中包括 GROUP BY tab1.col1, tab2.col2 ---这将只返回这两个字段的不同组合,并且对于这两个字段以及 JOIN 以及 WHERE 子句字段。
然后进行连接以导出 COMPUTED_COLUMN 在外部查询中。

SELECT sub.col1 & ',' & sub.col2 AS COMPUTED_COLUMN
FROM
(
    SELECT tab1.col1, tab2.col2
    FROM <join clause for 6 tables>
    WHERE tab1.col3 = 4 AND tab2.col1 = 1 AND tab3.col1 = 21 AND tab1.col2 <> -1
    GROUP BY tab1.col1, tab2.col2
) AS sub;

相关问题