Sql 使用不同计数的性能
我正在运行SQL Server 2012 我有一个查询,当分条到其最基本的形式时,如下所示: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 实际上,我创建了两个新的测试表,每个
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