Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 统计select语句中匹配的项_Sql_Select_Count_Large Data - Fatal编程技术网

Sql 统计select语句中匹配的项

Sql 统计select语句中匹配的项,sql,select,count,large-data,Sql,Select,Count,Large Data,我们有一个针对一些相当大的表执行的存储过程,当连接到一个较大的表时,它也会记录有多少记录与相应的批处理id相匹配。我试图弄清楚的是,我是否可以使用计数函数或其他方法来改进这一点?正在尝试摆脱嵌套的SELECT COUNT(*)语句。CCTransactions表有140万行,BatchItems表有660万行 SELECT a.ItemAuthID, a.FeeAuthID, a.Batch_ID, a.ItemAuthCode, a.FeeAuthCode, b.Amoun

我们有一个针对一些相当大的表执行的存储过程,当连接到一个较大的表时,它也会记录有多少记录与相应的批处理id相匹配。我试图弄清楚的是,我是否可以使用计数函数或其他方法来改进这一点?正在尝试摆脱嵌套的SELECT COUNT(*)语句。CCTransactions表有140万行,BatchItems表有660万行

SELECT  a.ItemAuthID, a.FeeAuthID, a.Batch_ID, a.ItemAuthCode, 
        a.FeeAuthCode, b.Amount, b.Fee, 
  (SELECT COUNT(*) FROM BatchItems WHERE Batch_ID = a.Batch_ID) AS BatchCount,
  ItemBillDate, FeeBillDate, b.AccountNumber, 
  b.Itemcode, ItemAuthToken, FeeAuthToken,
  cc.ItemMerchant, cc.FeeMerchant
  FROM CCTransactions a WITH(NOLOCK)
        INNER JOIN BatchItems b WITH(NOLOCK)
              ON a.Batch_ID = b.Batch_ID
        INNER JOIN CCConfig cc WITH(NOLOCK)
              ON a.ClientCode = cc.ClientCode
  WHERE ((ItemAuthCode > '' AND ItemBillDate IS NULL)
              OR (FeeAuthCode > '' AND FeeBillDate IS NULL))
              AND TransactionDate BETWEEN DATEADD(d,-7,GETDATE()) 
              AND convert(char(20),getdate(),101)  + ' ' +   @Cutoff
  ORDER BY TransactionDate

当DBMS支持窗口聚合函数时,可以将其重写为

COUNT(*) OVER (PARTITION BY Batch_ID)
当然,这只返回SELECT返回的每个批次ID的行数。如果内部联接导致行数减少,则该行数不正确

然后将标量子查询重写为联接可能更有效(取决于您的DBMS):

SELECT  a.ItemAuthID, a.FeeAuthID, a.Batch_ID, a.ItemAuthCode, 
        a.FeeAuthCode, b.Amount, b.Fee, 
  dt.BatchCount,
  ItemBillDate, FeeBillDate, b.AccountNumber, 
  b.Itemcode, ItemAuthToken, FeeAuthToken,
  cc.ItemMerchant, cc.FeeMerchant
  FROM CCTransactions a WITH(NOLOCK)
        INNER JOIN BatchItems b WITH(NOLOCK)
              ON a.Batch_ID = b.Batch_ID
        INNER JOIN CCConfig cc WITH(NOLOCK)
              ON a.ClientCode = cc.ClientCode
        INNER JOIN
          ( 
            SELECT BatchCount, COUNT(*) AS BatchCount
            FROM BatchItems 
            GROUP BY Batch_ID
          ) AS dt ON a.Batch_ID = dt.Batch_ID
  WHERE ((ItemAuthCode > '' AND ItemBillDate IS NULL)
              OR (FeeAuthCode > '' AND FeeBillDate IS NULL))
              AND TransactionDate BETWEEN DATEADD(d,-7,GETDATE()) 
              AND convert(CHAR(20),getdate(),101)  + ' ' +   @Cutoff
  ORDER BY TransactionDate
我对计数(*)进行了多次测试,虽然它确实减少了集合统计IO上的扫描计数,但增加了计划的子树成本。现在让我测试子查询的内部联接,看看它是如何执行的。