除了在创建临时文件 table 之前,最好在使用后删除临时文件 table 吗?
Is it a best practice to drop the temp table after using it, in addition to before creating the temp table?
我有一个创建临时文件的存储过程 table。仅此存储过程的范围需要它,其他地方不需要。
当我使用 temp tables list this 时,我总是检查 temp table 是否存在,如果存在则将其删除,然后再在存储过程中创建它。即:
IF OBJECT_ID('tempdb..#task_role_order') IS NOT NULL
DROP TABLE #task_role_order
CREATE TABLE #task_role_order(...)
大多数情况下,除了在创建临时 table 之前删除临时 table 之外,最好的做法是在完成后删除临时 table 吗?
如果需要更多上下文,我有一个 .NET Web API 后端调用数据库中的存储过程。我相信 SQL 服务器会在 SQL 服务器会话结束时删除温度 table。但我不知道 .NET 是否会在每次查询数据库时打开一个新的 SQL 服务器会话,或者每个应用程序生命周期只打开一次,等等
我读过这个similar question,但认为它略有不同。
不太可能产生太大影响,但如果我必须选择,我什么都不做。临时 table 可通过嵌套存储过程访问,因此除非您有特定需要在过程之间传递数据,否则如果您碰巧使用相同的名称,递归地调用过程,则不执行任何一项都有助于避免争用循环方式(并且它是有效的),或者您有另一个过程恰好使用相同的名称和列。放弃它可能会隐藏一些奇怪的逻辑错误。
例如 Proc A 创建临时 table,然后调用 B。B 丢弃并创建 table。现在要么 Proc A 正在引用创建的临时 table,要么因为 Proc A 没有嵌套在 B 中,Proc A 神秘地失败了。最好让 proc B 在尝试创建临时 table.
时失败
一天结束时 SQL 服务器会清理这些,但它不会阻止您在嵌套过程之间泄漏。
通常,释放不再需要的资源被认为是一种很好的做法。所以我会在存储过程的末尾添加 DROP TABLE。
临时 table 只要连接存在就存在。通常,应用程序使用连接池(它是可配置的)并且当您调用 Connection.Close 时连接不会关闭。在重新使用连接之前,客户端执行特殊的存储过程(sp_reset_connection)来完成所有清理任务。所以 temp tables 在任何情况下都会被丢弃,但有时会在一些延迟之后。
我有一个创建临时文件的存储过程 table。仅此存储过程的范围需要它,其他地方不需要。
当我使用 temp tables list this 时,我总是检查 temp table 是否存在,如果存在则将其删除,然后再在存储过程中创建它。即:
IF OBJECT_ID('tempdb..#task_role_order') IS NOT NULL
DROP TABLE #task_role_order
CREATE TABLE #task_role_order(...)
大多数情况下,除了在创建临时 table 之前删除临时 table 之外,最好的做法是在完成后删除临时 table 吗?
如果需要更多上下文,我有一个 .NET Web API 后端调用数据库中的存储过程。我相信 SQL 服务器会在 SQL 服务器会话结束时删除温度 table。但我不知道 .NET 是否会在每次查询数据库时打开一个新的 SQL 服务器会话,或者每个应用程序生命周期只打开一次,等等
我读过这个similar question,但认为它略有不同。
不太可能产生太大影响,但如果我必须选择,我什么都不做。临时 table 可通过嵌套存储过程访问,因此除非您有特定需要在过程之间传递数据,否则如果您碰巧使用相同的名称,递归地调用过程,则不执行任何一项都有助于避免争用循环方式(并且它是有效的),或者您有另一个过程恰好使用相同的名称和列。放弃它可能会隐藏一些奇怪的逻辑错误。
例如 Proc A 创建临时 table,然后调用 B。B 丢弃并创建 table。现在要么 Proc A 正在引用创建的临时 table,要么因为 Proc A 没有嵌套在 B 中,Proc A 神秘地失败了。最好让 proc B 在尝试创建临时 table.
时失败一天结束时 SQL 服务器会清理这些,但它不会阻止您在嵌套过程之间泄漏。
通常,释放不再需要的资源被认为是一种很好的做法。所以我会在存储过程的末尾添加 DROP TABLE。
临时 table 只要连接存在就存在。通常,应用程序使用连接池(它是可配置的)并且当您调用 Connection.Close 时连接不会关闭。在重新使用连接之前,客户端执行特殊的存储过程(sp_reset_connection)来完成所有清理任务。所以 temp tables 在任何情况下都会被丢弃,但有时会在一些延迟之后。