是否可以计算给定 SQL 语句的 SQL Server sql_handle?

hoo*_*tor 2 sql-server

以下站点提到的sql_handle是整个批处理文本的 MD5 哈希

https://techcommunity.microsoft.com/t5/sql-server/2-0-sql-handle-and-plan-handle-explained/ba-p/383204

但是,我无法手动计算它。从dm_exec_query_stats我们判断下面的语句有以下几点sql_handle

SQL: (@P1 bigint)SELECT NID MimeTypeID, Name FROM DDocumentClass WHERE Type = @P1
SQL_HANDLE: 0x02000000CA17931BEF7F24A1787BF580EA365A56408697B30000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

以下 Ruby 脚本计算 MD5。

require 'digest'

sql1 = 'SELECT NID MimeTypeID, Name FROM DDocumentClass WHERE Type = @P1'
sql2 = '(@P1 bigint)SELECT NID MimeTypeID, Name FROM DDocumentClass WHERE Type = @P1'

puts Digest::MD5.hexdigest sql1
puts Digest::MD5.hexdigest sql2
Run Code Online (Sandbox Code Playgroud)

输出:

81707e73438befe82957c766dca86799
2652dc1d05e927ac7c5bfc985a3d1483
Run Code Online (Sandbox Code Playgroud)

必须有更多的算法。

我们可以计算出Oracle 的SQL_ID,我希望也能计算出SQL Server 的SQL_HANDLE。

Pau*_*ite 8

44 字节sql_handle具有以下组件(按顺序):

  1. 4 个字节:目标缓存的字节反转整数代码,例如
    • 0x02000000(2) 对于 SQL 计划 ( CACHESTORE_SQLCP)
    • 0x03000000(3) 对于对象计划 ( CACHESTORE_OBJCP)
  2. 4 个字节:字节反转整数对象 id
  3. 16 字节:批处理文本的 MD5 散列,包括(参数定义)前缀(如果存在)。
  4. 20 字节 0000000000000000000000000000000000000000