回答

收藏

相同的查询-执行计划不同

技术问答 技术问答 256 人阅读 | 0 人回复 | 2023-09-14

SQL2008。 我有一个测试表:( P  C0 V9 T3 V+ e7 ]4 E2 r
create table Sale(    SaleId int identity(1,1)        constraint PK_Sale primary key,   Test1 varchar(10) null,   RowVersion rowversion not null        constraint UQ_Sale_RowVersion unique)我用10k试行填充。
6 r0 V' I, R! jdeclare @RowCount int = 10000while(@RowCount > 0)begin    insert Sale default values    set @RowCount -= 1end我操作以下两个查询:; o3 t: N( Y! {# L1 e
-- Query #1select *from Salewhere RowVersion > 0x000000000001C310-- Query #2declare @LastVersion rowversion = 0x000000000001C310select *from Salewhere RowVersion > @LastVersion我不知道为什么这两个查询有不同的执行计划。- {+ d) Z) x; h& y
查询1确实针对UQ_Sale_RowVersion索引搜索。
+ n  m, a/ Q1 x7 |& |4 N6 f查询2对PK_Sale扫描索引。
' h1 I2 b! x( J+ u, D; u我想查询2做索引搜索。
3 m' u/ `. Z. @我将不胜感激。
% G0 U: _; l8 u. l: S: \谢谢你。& \$ i8 y+ G8 C3 L' S
[编辑]
+ ^( A, j: E4 o- i9 i" z) q7 J尝试使用datetime2而不是rowversion。同样的问题。
5 W. v& S  a) @7 M' ^我也试着用索引(查询)#3). [7 w% q0 N' T) u) ~7 U( q
select *from Sale with (index = IX_Sale_RowVersion)where RowVersion > @LastVersion这似乎显示了和查询#1.相同的查询执行计划,但执行计划显示此查询#三是这三个查询中最昂贵的查询。, r9 I1 r, a; b0 e* `. ?) r* Y2 i
[编辑]    执行计划:
+ W4 B  Q1 C# q% D8 a  [B]    [B]                                                                                                                                                                                                                                                                                                        [I]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        [/I]                                                                                                          [I]                                                                                                                                                                                                                                                                                              7 t9 _* [  S3 w4 Q+ u
                                                                                                              [I]                                                                  [/I]                                                                                                                                                                        [/I]                                                                                                                                                                                                                                                  [I]                                                                                                                                                                                                                                                                                                            [I]                                                  [/I]                                                                    [I]                                                  [/I]                                                                                          [/I]                                        [/B]  [/B]               
# B; V! V8 j! v5 `    解决方案:                                                                ( ]4 w( C! N6 e+ |9 V' T  w$ C- {
                                                                查询2使用变量。. F* C2 p& @( L  P; `
编译批处理时,SQL Server我不知道变量的值,所以我回到了非常类似的启发方法。OPTIMIZE FOR (UNKNOWN)2 ]- s1 T1 K% E, W. v7 E
因为>它将假设30%最终匹配行(或示例数据中的3000行)。在执行计划图像中可以看到,如下所示。这大大超过了12行(0.12%),这是使用聚簇索引扫描或非聚簇索引搜索和键搜索的引爆点。
" p" H" w2 ^0 \3 E1 a" f您需要使用OPTION (RECOMPILE)考虑实际变量值,如下面的第三个计划所示。
2 L+ G9 V( C  c( n" [* u$ K) z/ X# N( M& ?4 E; W& `+ \
脚本CREATE TABLE #Sale(    SaleId INT IDENTITY(1,1)        CONSTRAINT PK_Sale PRIMARY KEY,   Test1 VARCHAR(10) NULL,   RowVersion rowversion NOT NULL        CONSTRAINT UQ_Sale_RowVersion UNIQUE)/*A better way of populating the table!*/INSERT INTO #Sale (Test1)SELECT TOP 10000 NULL FROM master..spt_values v1,master..spt_values v2GOSELECT *FROM #SaleWHERE RowVersion > 0x000000000001C310-- Query #1DECLARE @LastVersion rowversion = 0x000000000001C310SELECT *FROM #SaleWHERE RowVersion > @LastVersion-- Query #2SELECT *FROM #SaleWHERE RowVersion > @LastVersionOPTION (RECOMPILE)-- Query #3DROP TABLE #Sale

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则