首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql Server 2014上的多个不同计数

sql Server 2014上的多个不同计数
EN

Stack Overflow用户
提问于 2014-08-01 19:59:50
回答 1查看 641关注 0票数 1

我面临着一个问题,在一个查询上有多个计数。

我正在使用SQL server 2014和非常高端的配置服务器。即224 GB RAM,4k PIOPS。

因为我已经在表上创建了CLUSTERed列存储索引,所以现在不能创建任何索引。

请查找我的查询。fct_sale_line有1.75B行,我已经在它上面创建了聚集列存储索引。

代码语言:javascript
复制
SELECT dim_customer.gender_code,
       gender,
       date_key,
       COUNT(DISTINCT fct_sale_line.CUSTOMER_CODE),
       COUNT(DISTINCT fct_sale_line.customer_key),
       SUM(sale_net_val)
FROM dbo.fct_sale_line fct_sale_line,
     dbo.dim_customer dim_customer,
     dbo.dim_product dim_product,
     dbo.dim_store dim_store
WHERE fct_sale_line.date_key >= 20120126
AND   fct_sale_line.date_key <= 20130126
AND   department_code IN ('400','500','600','700','800')
AND   fct_sale_line.customer_key = dim_customer.customer_key
AND   fct_sale_line.product_key = dim_product.product_key
AND   fct_sale_line.store_key = dim_store.store_key
GROUP BY dim_customer.gender_code,
         gender,
         date_key
ORDER BY gender;

查询永远不会结束。它在运行..正在运行..跑啊跑啊。

就连我也用单张桌子测试过。请查看每个查询所用的时间。

代码语言:javascript
复制
SELECT date_key,
       SUM(sale_net_val),
       COUNT(1)
FROM dbo.fct_sale_line fct_sale_line
WHERE fct_sale_line.date_key >= 20120126
AND   fct_sale_line.date_key <= 20130126
GROUP BY date_key;

只花了1秒的时间来获取结果。

代码语言:javascript
复制
SELECT date_key,
       SUM(sale_net_val),
       COUNT(1),
       COUNT(DISTINCT fct_sale_line.CUSTOMER_CODE)
FROM dbo.fct_sale_line fct_sale_line
WHERE fct_sale_line.date_key >= 20120126
AND   fct_sale_line.date_key <= 20130126
GROUP BY date_key;

花费了29秒,但仍然可以接受(不同计数的b‘z)。

代码语言:javascript
复制
SELECT date_key,
       SUM(sale_net_val),
       COUNT(1),
       COUNT(DISTINCT fct_sale_line.CUSTOMER_CODE),
       COUNT(DISTINCT fct_sale_line.CUSTOMER_KEY)
FROM dbo.fct_sale_line fct_sale_line
WHERE fct_sale_line.date_key >= 20120126
AND   fct_sale_line.date_key <= 20130126
GROUP BY date_key;

--永不结束(等待45分钟)

谁能让我知道这是sql server 2014中的一个已知问题。

问候

Noor

EN

回答 1

Stack Overflow用户

发布于 2014-08-15 07:22:30

首先,集群列存储索引在IO方面非常有效,因此仅此一项就可以帮助您避免读取不必要的数据。

在没有看到执行计划的情况下,我会猜测您的问题可能出在执行模式中:检查您的执行计划,看您的Hash匹配(聚合)(例如,按参数分组)是否在批处理模式下运行,以及您是否在磁盘上溢出。

以下针对ContosoRetailDW的查询将需要一些时间才能运行,因为在行模式下的散列匹配(热切假脱机之后的第二行)中会发生溢出:

代码语言:javascript
复制
select count( distinct StoreKey ) as 'Distinct Stores'
, count( distinct CustomerKey ) as 'Distinct Customers'
, count( distinct CurrencyKey ) as 'Distinct Currencies'
from dbo.FactOnlineSales sales
    inner join dbo.DimPromotion prom
        on sales.PromotionKey = prom.PromotionKey
where prom.DiscountPercent = 0
group by sales.LoadDate, sales.ProductKey

很抱歉,我无法放置执行计划映像,因为我的声誉很低-它正在被阻止。

您可能需要运行更有选择性的查询(使用更精确的谓词),可以通过修改查询来增加内存授予,还可以使用段消除技术,这对不同的计数应该有很大帮助:http://www.nikoport.com/2014/04/16/clustered-columnstore-indexes-part-29-data-loading-for-better-segment-elimination/

最好的问候,Niko

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25079791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档