优化大数据中的三角形连接

时间:2018-01-23 11:19:10

标签: sql sql-server tsql

我有一个大表@tbl,我想找出@tbl中可用的每个cid之间的共同关系,该公式是由客户提供的,我们已经做了一个样本测试 对于2-3个cid和值都很好,但是当我们尝试在整个数据集上执行此操作时,这需要更多的时间。

有没有办法更改查询,因为我使用三角形连接来查找基于currency和mdate的每个cid到另一个cid的值。

请建议。

DECLARE @tbl TABLE 
    (CID int NOT NULL,
    MDATE date NOT NULL,
    CURRENCY char(3) NOT NULL,
    LOG_VAL  float,
    PRIMARY KEY(CID,CURRENCY,MDATE )
    );



insert into @tbl  
values (19617,'2016-12-07','USD',0.0269613952992653),
(19617,'2016-12-08','USD',-0.0215989790114737),
(19617,'2016-12-09','USD',-0.00354231630415585),
(19617,'2016-12-12','USD',0.0181775886282026), 
(20114,'2016-12-07','USD',0.0126117755008134),
(20114,'2016-12-08','USD',0.000804521846928715),
(20114,'2016-12-09','USD',0.0137173496839721),
(20114,'2016-12-12','USD',0.0227472087663449),
(19458,'2016-12-07','USD',0.0126117755008134),
(19458,'2016-12-08','USD',0.000804521846928715),
(19458,'2016-12-09','USD',0.0137173496839721),
(19458,'2016-12-12','USD',0.0227472087663449) 


SELECT b.CID, C.CID 
   ,(COUNT(*)*SUM(b.LOG_VAL*c.LOG_VAL) - SUM(b.LOG_VAL) * SUM(c.LOG_VAL))
   /    (
   SQRT(COUNT(*) * SUM(b.LOG_VAL*b.LOG_VAL) - SUM(b.LOG_VAL) * SUM(b.LOG_VAL))
   * SQRT(COUNT(*) * SUM(c.LOG_VAL*c.LOG_VAL) - SUM(c.LOG_VAL) * SUM(c.LOG_VAL))
   )AS correl 
FROM  @tbl B     
JOIN  @tbl AS C
ON b.CID <> c.CID 
AND b.CURRENCY = c.CURRENCY
AND b.MDATE = c.MDATE
GROUP BY  b.CID, C.CID 

3 个答案:

答案 0 :(得分:1)

对于此查询:

E:\>py foo.py
Traceback (most recent call last):
  File "foo.py", line 2, in <module>
    import pyftdi
ImportError: No module named pyftdi

您需要E:\>py Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import pyftdi >>> 上的索引。

自SQL Server 2014以来,支持表变量的索引。在此之前,您只需使用常规变量。

答案 1 :(得分:0)

你无法在大型数据集上实现此性能。如果您愿意限制该组,例如。通过只选择一种货币和一个月的框架,你需要在currrency和mdate上添加一个索引,甚至可以在该索引中添加cid作为第三列。

答案 2 :(得分:0)

你可以用

将它切成两半
ON b.CID < c.CID

现在你正在做两次

尝试索引

PRIMARY KEY(MDATE, CURRENCY, CID)

有没有理由不使用decimal而不是float?你应该用十进制获得更好的性能。

考虑货币的整数并对其进行扩展。

在货币上使用带有tinyint的FK会有所帮助。

我不认为这里有一些魔法窗口功能。