相关疑难解决方法(0)

为什么窗口聚合函数的逻辑读取如此之高?

我发现在使用公共子表达式假脱机的执行计划中,报告的逻辑读取对于大型表来说非常高.

经过一些试验和错误后,我发现了一个似乎适用于下面的测试脚本和执行计划的公式. Worktable logical reads = 1 + NumberOfRows * 2 + NumberOfGroups * 4

我不明白为什么这个公式成立的原因.这比我想象的更有必要看一下这个计划.任何人都可以通过吹嘘这个帐户的内容来打击这个吗?

或者失败那是否有任何方法来跟踪每个逻辑读取中读取的页面,以便我可以自己解决?

SET STATISTICS IO OFF; SET NOCOUNT ON;

IF Object_id('tempdb..#Orders') IS NOT NULL
  DROP TABLE #Orders;

CREATE TABLE #Orders
  (
     OrderID    INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED,
     CustomerID NCHAR(5) NULL,
     Freight    MONEY NULL,
  );

CREATE NONCLUSTERED INDEX ix
  ON #Orders (CustomerID)
  INCLUDE (Freight);

INSERT INTO #Orders
VALUES (N'ALFKI', 29.46), 
       (N'ALFKI', 61.02), 
       (N'ALFKI', 23.94), 
       (N'ANATR', 39.92), 
       (N'ANTON', 22.00);

SELECT PredictedWorktableLogicalReads = 
        1 + …
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2008

22
推荐指数
1
解决办法
2584
查看次数

如何在SELECT T-SQL命令中包含结果集中返回的行总数?

我想询问是否有一种方法可以使用Row_Number(SQL 2005)命令在TSQL查询的返回结果集中包含总行数(作为附加列).例如,以类似于以下的形式从Book表中获取查询结果集:

RowNum   BookId     BookTitle    TotalRows
--------------------------------------------
1        1056       Title1       5    
2        1467       Title2       5    
3        121        Title3       5    
4        1789       Title4       5    
5        789        Title5       5
Run Code Online (Sandbox Code Playgroud)

该查询是存储过程中实现的自定义分页功能的一部分.目标是仅返回当前页面索引的记录并限制为页面大小,还要返回select语句中的记录总数,以确定结果集页面的总数.

sql t-sql sql-server

19
推荐指数
3
解决办法
4万
查看次数

为什么在视图外部放置WHERE子句会产生糟糕的性能

假设您有一个观点:

CREATE VIEW dbo.v_SomeJoinedTables AS
SELECT
    a.date,
    a.Col1,
    b.Col2,
    DENSE_RANK() 
      OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b on a.date = b.date
Run Code Online (Sandbox Code Playgroud)

我发现了以下的表现:

SELECT *
FROM v_SomeJoinedTables
WHERE date > '2011-01-01'
Run Code Online (Sandbox Code Playgroud)

比...差很多

SELECT *, 
   DENSE_RANK() 
     OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b ON a.date = b.date
WHERE a.date > '2011-01-01'
Run Code Online (Sandbox Code Playgroud)

我很惊讶这两个语句的查询计划不一样.

我也尝试使用内联表值函数,但查询仍然比我复制和粘贴视图逻辑的代码长100-1000倍.

有任何想法吗?

t-sql sql-server-2005 where-clause sql-execution-plan

16
推荐指数
1
解决办法
8162
查看次数

如何在单独的数据集中获取cte的rowcount?

我已经确定了一种使用CTE和Row_Number函数从数据库中获取快速分页结果的方法,如下所示......

DECLARE @PageSize INT = 1
DECLARE @PageNumber INT = 2

DECLARE @Customer TABLE (
  ID       INT IDENTITY(1, 1),
  Name     VARCHAR(10),
  age      INT,
  employed BIT)

INSERT INTO @Customer
    (name,age,employed)
SELECT 'bob',21,1
    UNION ALL
SELECT 'fred',33,1
    UNION ALL
SELECT 'joe',29,1
    UNION ALL
SELECT 'sam',16,1
    UNION ALL
SELECT 'arthur',17,0;


WITH cteCustomers
     AS ( SELECT
            id,
            Row_Number( ) OVER(ORDER BY Age DESC) AS Row
          FROM   @Customer
          WHERE  employed = 1 
     /*Imagine I've joined to loads more tables with a really complex where clause*/ …
Run Code Online (Sandbox Code Playgroud)

performance common-table-expression sql-server-2008

6
推荐指数
1
解决办法
2975
查看次数

如何使用 TOP 检索查询的总行数

我有一个 SQL Server 2008 查询

SELECT TOP 10 *
FROM T
WHERE ...
ORDER BY ...
Run Code Online (Sandbox Code Playgroud)

我还想获得总行数。obious 方法是进行第二次查询

SELECT COUNT(*)
FROM T
WHERE ...
ORDER BY ...
Run Code Online (Sandbox Code Playgroud)

有没有有效的方法?

谢谢

sql-server pagination aggregate count

5
推荐指数
1
解决办法
1万
查看次数

第二个最大值和最小值

给定一个具有多行int字段和相同标识符的表,是否可以从表中返回第二个最大值和第二个最小值.

一张桌子由

ID      |   number
------------------------
1       |     10
1       |     11
1       |     13
1       |     14
1       |     15
1       |     16
Run Code Online (Sandbox Code Playgroud)

最终结果将是

ID      |   nMin    |   nMax
--------------------------------
1       |     11    |    15
Run Code Online (Sandbox Code Playgroud)

sql sql-server-2008

5
推荐指数
1
解决办法
1万
查看次数