Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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 Server查询响应时间变化很大,而代码变化很小_Sql_Sql Server_Performance - Fatal编程技术网

SQL Server查询响应时间变化很大,而代码变化很小

SQL Server查询响应时间变化很大,而代码变化很小,sql,sql-server,performance,Sql,Sql Server,Performance,我有一个查询,如果稍加修改,它的运行时间将从大约37秒减少到4秒。连接或返回的列没有更改 慢速查询37秒: 现在,对于4秒钟后返回的查询: 我的问题是:当所做的唯一更改是将IsHidden=0替换为IsHidden=0或IsHidden为NULL时,两者之间的执行时间怎么会有如此大的差异?底部的3行取决于您在IsHidden中的数据和索引 如果您有很多空值和良好的索引,那么执行计划可能会在'ishiden=0'之前首先获取它们,因此它比只扫描'ishiden=0'要快。当您添加附加子句以包含IS

我有一个查询,如果稍加修改,它的运行时间将从大约37秒减少到4秒。连接或返回的列没有更改

慢速查询37秒:

现在,对于4秒钟后返回的查询:


我的问题是:当所做的唯一更改是将IsHidden=0替换为IsHidden=0或IsHidden为NULL时,两者之间的执行时间怎么会有如此大的差异?底部的3行取决于您在IsHidden中的数据和索引


如果您有很多空值和良好的索引,那么执行计划可能会在'ishiden=0'之前首先获取它们,因此它比只扫描'ishiden=0'要快。

当您添加附加子句以包含ISNULL时,可能会从AccountRecievable返回更多的行。反过来,您将在视图中加入更多行。这意味着必须从视图的基表中读取更多行,从而增加查询时间


这里的逻辑来自于查看您提供的IO统计数据。对于您提供的查询不可见的表,还有其他读取。考虑在视图的基表上查看索引策略。

在删除数据时,移除一个条件,可能在表的大多数地方“iIDDEN”字段为空。如果查看物理读取,可以看到第二次运行查询,表从第一次就已经在内存中。为了让它成为一个公平的测试运行DBCC DROPCLEANBUFFERS来清除缓冲区缓存,运行第一个查询,再次删除干净的缓冲区,然后运行第二个查询Tanks Buzz,尽管在更快的查询中,我实际上添加了“IsHidden”为null的过滤器,而不是删除它。嗨,Pete,在两个查询之间运行DBCC DROPCLEANBUFFERS,初始值仍然是37,现在的速度是8秒,而不是4秒。
declare @PeriodFrom DateTime
declare @PeriodTo DateTime
Set @PeriodFrom = '2012-06-01'
Set @PeriodTo = '2012-06-30'

Select
  0 as PrimaryAccount,
  0 as PrintOrder,
  Cast(Null as integer) as ID,
  Sum(IsNull(MT.Amount, 0)) as Amount,
  Cast(0 as Money) as NetAmount,
  Cast(0 As Money) as TaxAmount,
  Cast(0 as Money) as AmountOutstanding,
  Cast(0 as Money) as AmountPaid,
  'Balance brought forward' as Description
From
  db_site4.dbo.AccountReceivable P
Join
  db_site4.dbo.ARType ART on ART.ARTypeID = P.ARTypeID and ART.ARTypeID = 24
left Join
  db_site4.dbo.vw_MemberTransactions MT
on
  P.AccountReceivableID = MT.AccountReceivableID
where 
  (MT.AccountingDate <= @PeriodFrom or MT.AccountingDate is null)
and
  (Authorised = 1 or Authorised is Null)
and
  IsHidden = 0
and
  P.MemberID = 123
Table 'Payment'. Scan count 16, logical reads 23558, physical reads 19, read-ahead reads 5448.
Table 'InvoiceItemPayment'. Scan count 4, logical reads 22237, physical reads 51, read-ahead reads 13432.
Table 'UnallocatedPayment'. Scan count 12, logical reads 431, physical reads 1, read-ahead reads 80.
Table 'AccountReceivable'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0.
Table 'ARType'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0.
Table 'Invoice'. Scan count 11116, logical reads 116984, physical reads 190, read-ahead reads 30910.
Table 'InvoiceItem'. Scan count 5122, logical reads 99786, physical reads 316, read-ahead reads 46236.
declare @PeriodFrom DateTime
declare @PeriodTo DateTime
Set @PeriodFrom = '2012-06-01'
Set @PeriodTo = '2012-06-30'

Select
  0 as PrimaryAccount,
  0 as PrintOrder,
  Cast(Null as integer) as ID,
  Sum(IsNull(MT.Amount, 0)) as Amount,
  Cast(0 as Money) as NetAmount,
  Cast(0 As Money) as TaxAmount,
  Cast(0 as Money) as AmountOutstanding,
  Cast(0 as Money) as AmountPaid,
  'Balance brought forward' as Description
From
  db_site4.dbo.AccountReceivable P
Join
  db_site4.dbo.ARType ART on ART.ARTypeID = P.ARTypeID and ART.ARTypeID = 24
left Join
  db_site4.dbo.vw_MemberTransactions MT
on
  P.AccountReceivableID = MT.AccountReceivableID
where 
  (MT.AccountingDate <= @PeriodFrom or MT.AccountingDate is null)
and
  (Authorised = 1 or Authorised is Null)
and
  (IsHidden = 0 or IsHidden is null)
and
  P.MemberID = 123
Table 'Payment'. Scan count 6271, logical reads 19857, physical reads 0, read-ahead reads 0.
Table 'UnallocatedPayment'. Scan count 2, logical reads 4, physical reads 0, read-ahead reads 0.
Table 'InvoiceItemPayment'. Scan count 4399, logical reads 33400, physical reads 0, read-ahead reads 0.
Table 'InvoiceItem'. Scan count 10581, logical reads 60682, physical reads 4, read-ahead reads 0.
Table 'Invoice'. Scan count 3, logical reads 22102, physical reads 3, read-ahead reads 0.
Table 'AccountReceivable'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0.
Table 'ARType'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0.