Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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 使用不同计数的性能_Sql_Sql Server_Performance_Tsql_Indexing - Fatal编程技术网

Sql 使用不同计数的性能

Sql 使用不同计数的性能,sql,sql-server,performance,tsql,indexing,Sql,Sql Server,Performance,Tsql,Indexing,我正在运行SQL Server 2012 我有一个查询,当分条到其最基本的形式时,如下所示: SELECT COUNT(DISTINCT fullAddress) as quickCount FROM leads WHERE yearID >=12 AND yearID <=21 SELECT COUNT(*) as quickCount FROM leads WHERE yearID >=12 AND yearID <=21 实际上,我创建了两个新的测试表,每个

我正在运行SQL Server 2012

我有一个查询,当分条到其最基本的形式时,如下所示:

SELECT COUNT(DISTINCT fullAddress) as quickCount 
FROM leads
WHERE yearID >=12 AND yearID <=21
SELECT COUNT(*) as quickCount 
FROM leads
WHERE yearID >=12 AND yearID <=21
实际上,我创建了两个新的测试表,每个表中都有100万条记录。我将相同的原始索引应用于两者,然后将上面的索引应用于其中一个。现在,当我比较同一执行计划上的两个表时,具有上述索引的表稍微好一点,从48%到52%。这是新的执行计划-


这对我有些帮助,但我真的需要更多的表现。还有其他想法吗?

尝试的一件事是取消排序,在fullAddress上排序索引,该索引还包括yearID列,这样您也可以满足where子句

CREATE INDEX IDX_X ON LEADS(FULLADDRESS, YEARID);
这样,您应该得到一个快速的完整索引扫描,可能仍然比索引范围扫描慢,但希望比40秒排序快


但是为什么它需要这么快呢?这不是你需要一直做的事,对吧?如果这是针对公共网站的,我想,您可能会得到一个稍微过时的缓存结果。

如果不经常更新此表,您可以考虑使用正在运行的查询创建索引视图

此答案无助于解决原始问题SQL Server 2012。它将在Azure SQL DB中工作,并且很可能在prem上的SQL Server的下一个版本中工作

近似查询处理是一个新的功能系列,旨在跨响应性比绝对精度更为关键的超大数据集提供聚合

新的APPROX_COUNT_DISTINCT aggregate函数返回组中唯一非空值的近似数目

优势 近似计数\u DISTINCT与穷举精确计数DISTINCT相比,用于计算DISTINCT计数的内存要少得多。由于这个原因,即使数据集中有数十亿行,计算也更有可能在内存中完成,而不会溢出到磁盘。如果COUNT DISTINCT会耗尽内存并将数据溢出到TempDB,从而导致非常大的性能损失,那么大约COUNT DISTINCT通常不会溢出

部分原因是由于没有将大型数据集溢出到TempDB,部分原因是由于内部算法的原因,对于非常大的数据集,APPROX_COUNT_DISTINCT的执行速度将远远快于COUNT DISTINCT

更多


在进行计数之前,我会尝试使用子查询进行筛选

WITH cte as (SELECT ID
FROM leads
WHERE yearID >=12 AND yearID <=21)
SELECT COUNT(DISTINCT fullAddress) as quickCount 
FROM leads
JOIN cte on cte.ID = leads.ID
这并不总是在每种情况下都执行得更快,但据我所知,如果列上有where子句,而您没有对其执行distinct,则执行得更快

SELECT APPROX_COUNT_DISTINCT(fullAddress) as quickCount 
FROM leads
WHERE yearID >=12 AND yearID <=21
WITH cte as (SELECT ID
FROM leads
WHERE yearID >=12 AND yearID <=21)
SELECT COUNT(DISTINCT fullAddress) as quickCount 
FROM leads
JOIN cte on cte.ID = leads.ID