我面临着一个问题,在一个查询上有多个计数。
我正在使用SQL server 2014和非常高端的配置服务器。即224 GB RAM,4k PIOPS。
因为我已经在表上创建了CLUSTERed列存储索引,所以现在不能创建任何索引。
请查找我的查询。fct_sale_line有1.75B行,我已经在它上面创建了聚集列存储索引。
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;查询永远不会结束。它在运行..正在运行..跑啊跑啊。
就连我也用单张桌子测试过。请查看每个查询所用的时间。
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秒的时间来获取结果。
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)。
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
发布于 2014-08-15 07:22:30
首先,集群列存储索引在IO方面非常有效,因此仅此一项就可以帮助您避免读取不必要的数据。
在没有看到执行计划的情况下,我会猜测您的问题可能出在执行模式中:检查您的执行计划,看您的Hash匹配(聚合)(例如,按参数分组)是否在批处理模式下运行,以及您是否在磁盘上溢出。
以下针对ContosoRetailDW的查询将需要一些时间才能运行,因为在行模式下的散列匹配(热切假脱机之后的第二行)中会发生溢出:
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
https://stackoverflow.com/questions/25079791
复制相似问题