Sql 选择计数(不同的v)性能
简单的问题。如何重写这样的查询:Sql 选择计数(不同的v)性能,sql,database,performance,distinct,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 Table A: type INT NOT NULL PRIMARY KEY name VARCHAR(5
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
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
...
这样它就不会在一张大而不是大的桌子上慢跑了?(比方说100万行)。或者,是否有可能对数据库执行其他“魔术”,使查询快速运行
在这种特殊情况下,进一步规范化数据是不可能的:)
请求的附加信息位
理想情况下,该解决方案将同时适用于MySQL和MS SQL Server 2008,尽管SQL Server绝对是这两种解决方案的首选
这两个表应如下所示:
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
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中获取与之相关的信息摘要。这是该问题涉及的第二种情况:)不确定您正在使用哪个数据库,但您可以确保外键tableA.type上有一个索引,另外tableB.type上有一个包含tableB.value的索引。这样,SQL就不需要返回数据页来获取值,只需从索引中检索即可。你应该小心这一点,因为如果它是一个大值,它可能会减慢你的索引速度。你可以在外键上使用非聚集索引,我的意思是在
[a.Type]
和[B.Type]
上使用2个索引,你也可以在select[a.Name]
,[B.value]
因此,查询所需的所有内容都在索引中。100万行不算什么。若表被索引了,那个么1000万行表也是空的,你们在使用什么RDBMS?如果您使用的是SQL Server 2012或更高版本,我强烈建议您使用列存储索引,因为这将使此类查询的速度提高100倍。@alma do-谢谢您的回答。。。是的,我知道它不是难以置信的大,我的意思是它是一个非常小的尺寸。无论如何,在这种情况下-我将在何处/如何创建适合该查询的索引?:)@Dan-MySQL或SQL Server 2008:)每个
a.name
是否总是与一个a.type
关联?(在该表中,a.name
是否唯一?);请详细说明数据之间的确切关系好吗?如果不知道这一点,我们无法为您优化。