我一直在对许多不同的数据访问框架进行一些 .net 性能测试。
我注意到的一件事是,在 SQL 中访问 tempdb 表的性能比使用常规表时要快得多。我不太清楚这是为什么,但似乎当 entityFramwork(其中一个框架)与
-- network protocol: TCP/IP
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed
其性能降低至与普通表相同的水平。
有人知道为什么会这样吗?
答案1
tempdb 的 BOL 帮助页面列出了访问 tempdb 的性能改进。
也就是说,列表中有两个设置会影响代码的执行方式:implicit_transactions
和transaction isolation level
。
因为read committed
是默认设置transaction isolation level
,所以我的猜测是,设置implicit_transactions
为以off
某种方式强制 tempdb 访问通过一个在进行隐式事务时可以避免的额外步骤。
测试一下以确保无误。
编辑:顺便说一句,考虑在表变量;这是仅限内存的,因此比 tempdb 快 100 到 1000 倍......
缺点是由于表变量没有索引,因此存在明显的收益递减点。