2014-04-09 116 views
1

简单的问题。我怎样才能重写这样的查询:SELECT COUNT(DISTINCT v))performance

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 

这样,它不会在一个大而不是大规模的表上运行dog-slow? (比方说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中的每个项目,与它们的类型,表A规定得到表B中的所有项目

然而,还必须要能够说:在表格中的每一个“类型”,获得与它在表B.相关信息的内容是,这个问题我们关心的与:)这第二种情况下

+4

1百万行是_nothing_。如果表被索引,那么1000万行表也是_nothing_ –

+0

您使用的是什么RDBMS?如果您使用的是SQL Server 2012或更新的版本,我强烈建议使用列存储索引,因为这会加快这种查询速度达100倍。 – Dan

+1

@alma do - 谢谢你的回答...是的,我知道这不是非常巨大,我的意思是说这是一个不平凡的大小。无论如何,在这种情况下 - 在哪里/如何创建适合该查询的索引? :) –

回答

0

不确定您正在使用哪个数据库,但可以确保外键tableA.type上存在索引,并且还包含tableB.type上包含tableB.value的索引。这样SQL就不需要返回数据页面来获取值,并且可以简单地从索引中检索它。你应该小心,因为这是一个很大的值,它可能会降低你的索引。

1

可以外键上使用非聚集索引,我的意思是2指数[A.Type][B.Type]你也可以对列其他两个指标的选择[A.Name][B.value]

使您的查询需要,一切都在索引中。