SELECT COUNT(DISTINCT v))表现

时间:2014-04-09 10:50:18

标签: sql database performance distinct

简单的问题。如何重写这样的查询:

SELECT a.name, MAX(b.value), MIN (b.value), COUNT(DISTINCT(b.value))
FROM tableA a
LEFT JOIN tableB b 
       ON a.type = b.type
WHERE b.value IS NOT NULL
GROUP BY a.name

所以它不会在一个大而不大的桌子上慢慢跑? (比方说100万行)。或者是否有可能在数据库上做一些其他“魔术”以使该查询快速运行?

在这种特殊情况下,将数据进一步规范化是不可能的:)

根据要求提供的其他信息

理想情况下,该解决方案适用于MySQL和MS SQL Server 2008,尽管SQL Server绝对是这些解决方案的优先考虑。

这两个表应如下所示:

Table A:
    type INT NOT NULL PRIMARY KEY
    name VARCHAR(500

Table B:
    idTableC INT NOT NULL
    type INT NOT NULL
    value VARCHAR (50)

Table C:
    idTableC INT NOT NULL PRIMARY KEY
    ...

所以一般来说,我们想说:对于表C中的每个项目,获取表B中所有项目的类型,在表A中指定。

然而,还必须能够说:对于表A中的每个“类型”,获取表B中与其相关的信息摘要。这是第二种情况,这个问题是关注:)

2 个答案:

答案 0 :(得分:1)

你可以在外键上使用非聚集索引,我的意思是[A.Type]上的2索引和[B.Type]你也可以在select [A.Name],{{{{}}}的列上有两个其他索引1}}

这样您的查询所需的一切都在索引中。

答案 1 :(得分:0)

不确定您正在使用哪个数据库,但您可以确保外键tableA.type上有索引,另外还有tableB.type上包含tableB.value的索引。这样,SQL就不需要返回数据页面来获取值,只需从索引中检索它即可。你应该小心这一点,好像它是一个很大的值,它可能会降低你的索引速度。