使用 SQL Server 2016 及更高版本
我目前正在评估两种显示搜索结果的方法。显示所有符合“标准”的“产品”。
我正在研究将符合条件的 ID 列表存储在临时表中的优点,然后加入我的主要产品与动态创建的会话视图,其中 ID 编码为值。
下面的脚本示例。我省略了主要产品表本身,因为它只是一个大的平面表,但确实包含公司专有的详细信息。代码本身不是问题,而是它生成的统计信息。
SET STATISTICS IO, TIME OFF;
DROP TABLE IF EXISTS dba.Temp;
DROP VIEW IF EXISTS dba.Test1;
DROP VIEW IF EXISTS dba.Test2;
CREATE TABLE dba.Temp (ProductID INT);
INSERT INTO dba.Temp (ProductID)
SELECT TOP 1000
ProductID
FROM dbo.Products
ORDER BY NEWID();
GO
CREATE VIEW dba.Test1
AS
SELECT P.*
FROM Products P
JOIN dba.Temp T ON T.ProductID = P.ProductID;
GO
DECLARE @strSQL AS NVARCHAR(MAX);
SET @strSQL = N'';
SELECT @strSQL = @strSQL + N',(' + CAST(ProductID AS NVARCHAR(MAX)) + N')'
FROM dba.Temp;
SET @strSQL = STUFF(@strSQL, 1, 1, ('CREATE VIEW dba.Test2 AS SELECT P.* FROM Products P JOIN (VALUES ')) + N') T (ProductID) ON T.ProductID = P.ProductID';
EXEC sp_executesql @stmt = @strSQL;
GO
SET STATISTICS IO, TIME ON;
PRINT '------------------------------ Test 1';
SELECT * FROM dba.Test1;
PRINT '------------------------------ Test 2';
SELECT * FROM dba.Test2;
PRINT '------------------------------ End';
SET STATISTICS IO, TIME OFF;
我发现我的数据集上的两个选项之间几乎没有区别,但是根据我的测试方式,我得到了一些非常奇怪的结果。
如果我只从测试 1 中读取数据,我会收到与以下类似的统计数据,但经过时间的波动很小 - 我不是服务器上唯一的用户。
SQL Server parse and compile time:
CPU time = 8 ms, elapsed time = 8 ms.
------------------------------ Test 1
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
(1000 rows affected)
Table 'Products'. Scan count 0, logical reads 3071, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Temp'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 47 ms, elapsed time = 56 ms.
运行测试 2,我收到了非常相似的结果,只有较低的 IO(预期为临时表没有被读取)
SQL Server parse and compile time:
CPU time = 46 ms, elapsed time = 46 ms.
------------------------------ Test 2
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
(1000 rows affected)
Table 'Products'. Scan count 0, logical reads 3071, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 47 ms, elapsed time = 57 ms.
然而,同时运行这两个测试,我看到第二个运行查询的结果始终较慢。
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
------------------------------ Test 1
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
(1000 rows affected)
Table 'Products'. Scan count 0, logical reads 3063, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Temp'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 47 ms, elapsed time = 56 ms.
------------------------------ Test 2
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
(1000 rows affected)
Table 'Products'. Scan count 0, logical reads 3063, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 62 ms, elapsed time = 200 ms.
------------------------------ End
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
第二个查询的结果偏斜是否有任何合乎逻辑的原因?是否第一个查询正在创建影响第二个查询的负载?我想知道我是否遗漏了什么或有根本的误解。这就是我通常会如何调整我的流程,强调 IO,关注时间。如果我需要调整我的调音方法,那么我们将不胜感激地收到任何建议。