我发现在使用公共子表达式假脱机的执行计划中,报告的逻辑读取对于大型表来说非常高.
经过一些试验和错误后,我发现了一个似乎适用于下面的测试脚本和执行计划的公式. 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) 我想询问是否有一种方法可以使用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语句中的记录总数,以确定结果集页面的总数.
假设您有一个观点:
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倍.
有任何想法吗?
我已经确定了一种使用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) 我有一个 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)
有没有有效的方法?
谢谢
给定一个具有多行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 ×3
sql-server ×3
t-sql ×2
aggregate ×1
count ×1
pagination ×1
performance ×1
where-clause ×1