Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择计数(不同的v)性能_Sql_Database_Performance_Distinct - Fatal编程技术网

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
是否唯一?);请详细说明数据之间的确切关系好吗?如果不知道这一点,我们无法为您优化。