Hau*_*uri 5 performance sql-server optimization query-performance
我在 SQL Server 中运行以下(非常简单)查询:
SELECT MAX(PK_Field1)
FROM MainTable kh
WHERE kh.PK_Field1 >= '2014-12-01T00:00:00'
AND kh.PK_Field2 = 1572
AND kh.PK_Field3= 'FD5BF2F3-8ED7-479C-A71F-D04E4288CBFC'
Run Code Online (Sandbox Code Playgroud)
我从中得到了这些统计数据:
Table 'MainTable'. Scan count 9, logical reads 31078, 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 = 171 ms, elapsed time = 44 ms.
Run Code Online (Sandbox Code Playgroud)
虽然经过的时间并不多,但这个查询每十分钟执行大约一千次,所以超过 30k 的逻辑读取对我来说似乎不是很理想。但是,该表中的主索引的设计方式使这样的查询可以充分利用它。表 MainTable 包含以下内容:
PK_Field1 datetime
PK_Field2 int
PK_Field3 uniqueidentifier
Another_Field datetime
Run Code Online (Sandbox Code Playgroud)
该表不包含其他列,它有 300 万条记录,唯一的索引是 PK 字段上的聚集索引(与表中定义的顺序相同,按 ASC 排序)。实际执行计划显示如下:
此外,字段PK_Field2
和PK_Field3
是引用其他两个表的外键。引用的列是它们各自表中的 ID。
你怎么认为?有没有优化的空间?
抱歉这么晚才回复,我最近太忙了。我尝试通过添加具有以下字段和顺序的新非聚集索引来对索引中的列重新排序:
PK_Field3 uniqueidentifier
PK_Field1 datetime
PK_Field2 int
Run Code Online (Sandbox Code Playgroud)
结果很棒:
(1 filas afectadas)
Table 'MainTable'. Scan count 1, logical reads 6, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 filas afectadas)
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
Run Code Online (Sandbox Code Playgroud)
实际的查询计划没有显示并行性。现在,尽管结果很好,但我仍然需要决定是否保留它,因为我发现为单个查询保留 100 MB 索引并不是最佳选择。如果我发现它对其他常见查询有用,我会保留它。感谢您的建议!
归档时间: |
|
查看次数: |
1331 次 |
最近记录: |