- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的数据生成过程中,我有一个包含大约 1 亿行的临时表。表的结构如下:
CREATE TABLE #table ( ProductId INT, CountryCodeID INT ,DataTypeID INT,
Formula VARCHAR(1000) ,Yr INT, Letter VARCHAR(100) , Data FLOAT(53))
我们可以用一些虚拟数据(~10M)填充它:
INSERT INTO #table ( ProductId, CountryCodeID, DataTypeID, Formula, Yr, Letter, Data )
SELECT
P.ProductID, C.CountryCodeID, D.DataTypeID, F.Formula, Y.Yr,
L.Letter, RAND() AS Data
FROM (VALUES (
1856),(1459),(1816),(238),(328),(444),(921),(1724),(155),(420),(795),
(620),(1007),(153),(1659),(95),(952),(1476),(759),(1461),(1958),(1341),
(116)) P(productID)
CROSS JOIN (VALUES (16),(302),(422),(36),(95),(744),(4),(285),(1849),(1402),
(430),(835),(214),(1476),(711),(36),(142),(428),(768),(78),(510),(945),
(1125)) C(CountryCodeID)
CROSS JOIN (VALUES (1120),(1121),(1122),(1123),(1124),(1125),(1126),(1127),
(1128)) D(DataTypeID)
CROSS JOIN (VALUES ('A+B'),('A/B/(A+B+C+D+E+G)'),('A/B/(A+B+C+D+E)'),
('A/B/(A+B+C+D)'),('A/B/(A+B+C)'),('A/B/(A+B)'),
('A/B/(A+B+C+D+E+G+Z)')) F(Formula)
CROSS JOIN (VALUES (1977),(1978),(1979),(1980),(1981),(1982),(1983),(1984),
(1985),(1986),(1987),(1988), (2000),(2001),(2002),(2003), (2004),
(2005),(2006),(2007),(2008),(2009),(2010),(2011),(2012),(2013)) Y(Yr)
CROSS JOIN (VALUES ('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('J '),
('K'),('L'),('M')) L(Letter)
--10 398 024
在我的过程结束时,我需要将我的表转为另一个临时表:
SELECT
ProductID,CountryCodeId,DataTypeID,Formula,
Yr,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,X,Z,W
INTO #Final3
FROM #table
PIVOT ( MAX(Data) FOR Letter IN (
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,X,Z,W
) ) AS pvt;
而且最后一个查询非常慢。这实际上需要很长时间。
一开始有表扫描但只有2%表格插入到#Final 占用 83%
所以我的问题是如何提高性能。我的一些想法:
NTILE
将 #table
分成 10 个较小的表,然后创建一个将执行 10 个数据透视表的循环?老实说,我没有任何其他想法......如果您有相关经验 - 请提出建议。谢谢。
最佳答案
我已经尝试使用老式的 PIVOTing(使用 CASE)并在我的系统上获得了更好的结果(快 2~3 倍)。还创建了一个 CLUSTERED INDEX,因此插入数据会慢很多(对于此测试,SQL Server 提示键长度)。尝试一下,看看它是否能改善您的业务案例。
希望这对您有所帮助。如果没有,请使用我关于使用 Reporting Matrices 的建议或 OLAP Cubes .另请检查此链接:Pivot Transformation .如果您不能使用这些,甚至可能用您的编程语言自己编写 PIVOT 可能会表现更好。
测试数据创建(使用全局温度,因此我可以在 SSMS 的第二个选项卡中测试选择):
CREATE TABLE ##table ( ProductId INT, CountryCodeID INT ,DataTypeID INT, Formula VARCHAR(1000) ,Yr INT, Letter VARCHAR(100) , Data FLOAT(53));
CREATE CLUSTERED INDEX tt ON ##table(ProductId, CountryCodeID, DataTypeID,Formula,Yr);
INSERT INTO ##table ( ProductId, CountryCodeID, DataTypeID, Formula, Yr, Letter, Data )
SELECT P.ProductID, C.CountryCodeID, D.DataTypeID, F.Formula, Y.Yr, L.Letter, RAND() AS Data
FROM (VALUES (1856),(1459),(1816),(238),(328),(444),(921),(1724),(155),(420),(795),(620),(1007),(153),(1659),(95),(952),(1476),(759),(1461),(1958),(1341),(116)) P(productID)
CROSS JOIN (VALUES (16),(302),(422),(36),(95),(744),(4),(285),(1849),(1402),(430),(835),(214),(1476),(711),(36),(142),(428),(768),(78),(510),(945),(1125)) C(CountryCodeID)
CROSS JOIN (VALUES (1120),(1121),(1122),(1123),(1124),(1125),(1126),(1127),(1128)) D(DataTypeID)
CROSS JOIN (VALUES ('A+B'),('A/B/(A+B+C+D+E+G)'),('A/B/(A+B+C+D+E)'),('A/B/(A+B+C+D)'),('A/B/(A+B+C)'),('A/B/(A+B)'),('A/B/(A+B+C+D+E+G+Z)')) F(Formula)
CROSS JOIN (VALUES (1977),(1978),(1979),(1980),(1981),(1982),(1983),(1984),(1985),(1986),(1987),(1988), (2000),(2001),(2002),(2003),(2004),(2005),(2006),(2007),(2008),(2009),(2010),(2011),(2012),(2013)) Y(Yr)
CROSS JOIN (VALUES ('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('J '),('K'),('L'),('M')) L(Letter) ;
生成#final3
中的数据:
SELECT
ProductID,
CountryCodeId,
DataTypeID,
Formula,
Yr,
MAX(CASE WHEN Letter='A' THEN Data END) AS A,
MAX(CASE WHEN Letter='B' THEN Data END) AS B,
MAX(CASE WHEN Letter='C' THEN Data END) AS C,
MAX(CASE WHEN Letter='D' THEN Data END) AS D,
MAX(CASE WHEN Letter='E' THEN Data END) AS E,
MAX(CASE WHEN Letter='F' THEN Data END) AS F,
MAX(CASE WHEN Letter='G' THEN Data END) AS G,
MAX(CASE WHEN Letter='H' THEN Data END) AS H,
MAX(CASE WHEN Letter='J' THEN Data END) AS J,
MAX(CASE WHEN Letter='K' THEN Data END) AS K,
MAX(CASE WHEN Letter='L' THEN Data END) AS L,
MAX(CASE WHEN Letter='M' THEN Data END) AS M
INTO
#Final3
FROM
##table
GROUP BY
ProductID,
CountryCodeId,
DataTypeID,
Formula,
Yr
ORDER BY
ProductID,
CountryCodeID,
Yr;
关于sql-server - Pivoting 脚本的性能改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34766323/
我有一个 todolist 应用程序,它在 Pivot 控件内的单独 PivotItems 中具有多个 ListBox 控件。如果我导航到另一个页面,然后使用后退按钮返回,则显示的 Pivot 没有响
我想 pivot_long() 下面数据集的多列避免硬编码。我看过一些类似的问题,但我仍然做不到。 宽数据: > head(data) ID IND_TEST_SCORE ARG_G1_A
假设我有一个 orders 表,它将与另外三个名为 typings、translates 和 论文 。我知道数据透视表应该有点像 many to many polymorphic relation但这
当我尝试将 null 替换为 zero 时,收到以下错误消息。 The column name "jan" specified in the PIVOT operator conflicts with
有没有办法在数据透视表中为计算为零的单元格隐藏或显示空白单元格? 最佳答案 使用数字格式隐藏所选单元格中的零值: 按照此过程隐藏所选单元格中的零值。如果其中一个单元格中的值更改为非零值,则该值的格式将
我正在尝试理解 Select algorithm我遇到了 a good pivot VS a bad pivot 。我可以看到该算法正在使用 Partition 算法来分隔右侧的较大元素pivot 和
我有以下代码:
我有一个国家表和一个数据透视表 Country_language,其中列出了所有国家及其可用语言的翻译。 表结构如下: Languages -------------- ID Locale Recor
目前,PWS 上唯一的 RabbitMQ 服务看起来有点不确定。我想知道我是否可以使用 Pivotals 解决方案 https://network.pivotal.io/products/p-redi
我是使用 Spark 数据帧的新手。我正在尝试将 pivot 方法与 Spark(Spark 版本 2.x)一起使用并遇到以下错误: Py4JError: An error occurred whil
我需要转置一个表,其中 column1 是实体的名称,column2 到 column366 是一年中包含美元金额的日期。表,select语句,输出结果都给了 以下 - 问题 - 此语法要求我创建一个
我想知道是否可以像在 python 和 R 上那样在 OpenRefine 上创建值的聚合和汇总?示例: 包含 30 万条记录的医疗预约表身份识别患者 |年龄 |身份证预约 |值 患者汇总和总结的结果
我想知道是否可以像在 python 和 R 上那样在 OpenRefine 上创建值的聚合和汇总?示例: 包含 30 万条记录的医疗预约表身份识别患者 |年龄 |身份证预约 |值 患者汇总和总结的结果
我不熟悉 SQL 并使用 Google BigQuery。我有一个表,其中有一条记录如下所示: publication_number |受让人 US-6044964-A|索尼公司 |数字音频光盘公司
在尝试转换 sql 表时,我看到了这篇文章 Here .通过使用这种方法,我创建了一个查询。但是我现在已经意识到它当然会使用 MAX 函数聚合结果。但是,我需要 Colum 旋转,但要显示所有事件。从
我们能否将行旋转到多列,即 Create table #Temp_Trans ( P_ID int, Custom_Name varchar(30), Text_Value var
计算字段很棒,但有一些限制,例如无法对其进行排序(无法将字段移动到报告过滤器区域)。 我试过“强制”一个过滤器,就像微软的人建议的那样:https://answers.microsoft.com/en
我有以下数据集,我需要从中计算数据透视中不同值的计数。我尝试了几个函数,如 FREQUENCY、COUNTIFS 等,但我做不到。 输入 Input Data 输出 Expected Output 最
请看下面的数据: 我正在寻找生成以下输出的查询: 我正在试验“PIVOT”,但尚未取得预期的结果。 最佳答案 这应该有效: SELECT ReviewType, DER, LEI, NOR, [NOT
我有两个表Person(person_id, name) 和另一个表Contacts(person_id, phone_type, phone_no)。 Person-----------------
我是一名优秀的程序员,十分优秀!