2016-05-14 46 views
1

表结构:TSQL加入,查询处理顺序和存储

CREATE TABLE dbo.Transactions 
(
    actid INT NOT NULL, --Account ID 
    tranid INT NOT NULL, -- Transaction ID 
    val MONEY NOT NULL, --- Transaction value 

    CONSTRAINT PK_Transactions PRIMARY KEY(actid, tranid) 
); 

以下低效的查询试图确定每次交易后运行平衡

SELECT 
    T1.actid, T1.tranid, T1.val, 
    SUM(T2.val) AS balance 
FROM 
    dbo.Transactions AS T1 
JOIN 
    dbo.Transactions AS T2 ON T2.actid = T1.actid 
          AND T2.tranid <= T1.tranid 
GROUP BY 
    T1.actid, T1.tranid, T1.val; 

我不知道如何加入被处理在查询中。是否将联接视为子查询,其中每个组(T1.actid, T1.tranid, T1.val)都会执行联接语句?这是否意味着如果有10K Transactions,10K加入的数据集是由这个查询创建的?

回答

0

在SSMS中执行您的查询。然后突出显示它并按Ctrl + L查看执行计划。这将显示你的SQL Server计划如何执行查询,有时建议索引等

0

这意味着你将会有确切的行数的加入满足

在T1中的每一行进行处理,并从行带来T2满足连接条件。

该连接可以作为循环,散列或合并处理。通常情况下,优化器使用散列。

最好的想法就是运行它。输出应该讲述一个故事。

0

要知道的唯一方法是通过'学习'查询计划。

FYI:在我看来,你的查询等效于

SELECT 
    T1.actid, T1.tranid, T1.val, 
    balance = (SELECT SUM(T2.val) 
       FROM dbo.Transactions 
       WHERE T2.actid = T1.actid 
        AND T2.tranid <= T1.tranid) 
FROM 
    dbo.Transactions AS T1 

说实话,我更喜欢“这个”版本,因为它看起来更具有可读性给我;我也希望这个版本稍微“精简”一点,因为排序需求较少,但只有实际测试才能说明问题。看到优化器在幕后做什么有时令人惊讶!再次,查询计划将显示。

因此,运行这两个查询并比较生成的查询计划,那些应该给你一个关于它们的相对成本的想法。现在,请记住,“成本”并不总是与“时间”直接相关;所以你可能想检查一下你的硬件和'典型负载'下运行的速度。还要记住例如缓存可能在这里有效果!