Questions tagged «temporary-tables»

临时表对象(而非表变量)的使用,包括语义,设计,性能优化和索引。另请参见[表变量]。


2
在这种情况下,为什么使用表变量的速度是#temp表的两倍?
我在这里查看的文章“ 临时表与表变量及其对SQL Server性能和SQL Server 2008的影响”能够重现与2005年类似的结果。 当仅执行10行存储过程(以下定义)时,表变量version out会执行临时表版本两次以上。 我清除了过程缓存并运行了两个存储过程10,000次,然后又重复了该过程以进行另外4次运行。以下结果(每批次的时间,以毫秒为单位) T2_Time V2_Time ----------- ----------- 8578 2718 6641 2781 6469 2813 6766 2797 6156 2719 我的问题是:表变量版本具有更好的性能的原因是什么? 我已经做了一些调查。例如,用 SELECT cntr_value from sys.dm_os_performance_counters where counter_name = 'Temp Tables Creation Rate'; 确认在这两种情况下,临时对象都是在第一次运行后按预期进行缓存,而不是针对每次调用从头开始再次创建。 类似地跟踪Auto Stats,SP:Recompile,SQL:StmtRecompile在探查事件(下图)显示,这些事件只出现一次(在第一次调用#temp表的存储过程)和其他9999个执行不提高任何这些事件。(表变量版本未获得任何这些事件) 第一次运行存储过程的开销稍大一点也不能解决总体差异,但是由于清除过程缓存并同时运行两个过程只需要花费几毫秒,因此我不相信统计信息还是重新编译可能是原因。 创建所需的数据库对象 CREATE DATABASE TESTDB_18Feb2012; GO USE TESTDB_18Feb2012; CREATE TABLE NUM ( …

2
MySQL在磁盘上创建临时表。如何停止?
我们正在运行一个用户当前发现缓慢的网站(Moodle)。我认为我已将问题归结为MySQL在磁盘上创建临时表。我created_tmp_disk_tables在Mysql Workbench服务器管理中观察该变量,并且该数目以大约50个表/秒的速度增加。使用几天后,created_tmp_disk_tables> 100k。此外,似乎没有释放内存。使用率一直在增加,直到系统变得几乎无法使用为止,我们必须重新启动MySQL。我几乎每天都需要重新启动它,首先要使用大约30-35%的可用内存,然后以80%的时间结束一天。 我在数据库中没有斑点,也无法控制查询,因此我无法尝试对其进行优化。我还使用了Percona Confirguration向导来生成配置文件,但是my.ini也不能解决我的问题。 问题 我应该怎么做才能阻止MySQL在磁盘上创建临时表?是否需要更改设置?我应该为此增加更多的内存吗? 如何阻止MySQL耗尽内存? 编辑 我启用了slow_queries日志,发现查询SELECT GET_LOCK()记录得很慢。快速搜索显示,我已允许PHP配置(mysqli.allow_persistent = ON)中的持久连接。我关闭了 这降低了MySQL占用内存的速度,尽管它仍在创建临时表。 我还检查了key_buffer size是否足够大。我看着变量key_writes。应该为零。如果不是,请增加key_buffer_size.I为零key_reads和零,key_writes因此我假设key_buffer_size足够大。 我将tmp_table_size和max-heap-table-size增加到1024M,因为created_tmp_disk_tables的增加可能表示表无法容纳在内存中。这没有解决。 参考:http : //www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-temporary-tables/ 编辑2 如果sort_merge_passes在SHOW GLOBAL STATUS输出中看到每秒很多,则可以考虑增加该sort_buffer_size值。我sort_merge_passes一个小时有2个,所以我认为sort_buffer_size足够大了。 参考:Mysql手册 sort_buffer_size 编辑3 我已经按照@RolandoMySQLDBA的建议修改了排序和联接缓冲区。结果显示在下表中,但我认为created_tmp_tables_on_disk仍然很高。我更改了值并检查created_tmp_tables_on_disk了一天(8h)后并计算平均值后,重新启动了mysql服务器。还有其他建议吗?在我看来,有些东西不能放入某种容器中,但是我无法弄清楚它到底是什么。 +---------------------+-------------+-------------+--------------------+ | Tmp_table_size, | Sort_buffer | Join_buffer | No of created | | max_heap_table_size | | | tmp_tables on disk | +---------------------+-------------+-------------+--------------------+ …

2
临时表中的varchar大小重要吗?
在我妻子的工作中,关于仅对存储过程中的临时表中的varchar(255)所有varchar字段使用都存在争议。基本上,一个营地希望使用255,因为即使定义更改,它也将始终有效,而另一个营地则希望坚持使用源表中的大小以提高性能。 表演营对吗?还有其他含义吗?他们正在使用SQL Server。

1
SQL Server表名以用户数据库中的#开头,而不是tempdb(不是临时表)
几十年前,以某种方式在我们的数据库中创建了一个以#。开头的表。它显示在应用程序数据库下的对象资源管理器中,而不是中tempdb。由于某些原因,Azure不会像这样导入数据库。 我们无法删除它,对其重命名或与之交互。我试过从对象资源管理器中删除,从GUI中删除脚本,重命名,但它们都没有起作用。 我们正在使用SQL 2008 R2。 drop table [*app*].[dbo]."#OBSOLETE"; Database name '*app*' ignored, referencing object in tempdb. Msg 3701, Level 11, State 5, Line 1 Cannot drop the table '#OBSOLETE', because it does not exist or you do not have permission. exec sp_rename "dbo.#OBSOLETE", "dbo.obsolete" Msg 15225, Level 11, State 1, …

3
如果我不删除临时内存表,该表将保留多长时间(MySQL)
我在MySQL中使用递归存储过程来生成名为的临时表id_list,但我必须在后续的select查询中使用该过程的结果,因此无法DROP在该过程中使用该临时表... BEGIN; /* generates the temporary table of ID's */ CALL fetch_inheritance_groups('abc123',0); /* uses the results of the stored procedure in the WHERE */ SELECT a.User_ID FROM usr_relationships r INNER JOIN usr_accts a ON a.User_ID = r.User_ID WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list) GROUP BY …

1
为什么在存储过程的末尾截断临时表以更快地创建其可用的tempdb空间?
SQL Server缓存在存储过程中创建的临时表,并仅在过程结束并随后执行时重命名它们。我的问题与何时释放tempdb空间有关。我已经知道该表在过程结束时被截断了。我已经读到评论说,这是基于每个会话进行处理的,并且看到了有关是否需要在MSDN上进行清理的问题。但是,如果它从未在同一会话中两次执行过,该怎么办? 我还听说过,有一个后台垃圾收集过程,一旦表超出范围,就会释放该空间。 尽管有相反的预期,但在创建存储过程的末尾截断一个临时表时,似乎导致该表在tempdb中用于释放数据的空间比没有使用truncate语句时要快。为什么? 使用或不使用这样的截断语句对性能的影响是什么?使用SNAPSHOT隔离时,经常会感到tempdb压力,我认为尽快从大型temp表中释放tempdb中使用的空间将防止tempdb的不必要增长。这种潜在的空间节省是以性能为代价的吗? 这是一些重现此问题的代码(主要来自@TheGameiswar,但有一些更改): SET NOCOUNT ON; GO ALTER PROC usp_test AS BEGIN IF object_id('tempdb..#temp') IS NOT NULL DROP TABLE #temp SELECT * INTO #temp FROM [dbo].[Event_28] -- This is a table with 15313 rows, using 35648 KB according to sp_spaceused --SELECT SUM(user_object_reserved_page_count) AS [user object pages used] …

2
临时表和表变量之间的INSERT性能差异
我在SQL Server 2005中遇到以下问题:与使用临时表进行相同插入相比,尝试将一些行插入表变量中需要花费大量时间。 这是要插入到表变量中的代码 DECLARE @Data TABLE(...) INSERT INTO @DATA( ... ) SELECT .. FROM ... 这是要插入到临时表中的代码 CREATE #Data TABLE(...) INSERT INTO #DATA( ... ) SELECT .. FROM ... DROP TABLE #Data 临时表没有任何键或索引,两个查询之间的选择部分相同,并且选择返回的结果数约为10000行。单独执行选择所需的时间约为10秒。 临时表版本最多需要10秒才能执行,我不得不在5分钟后停止表变量版本。 我必须使用表变量,因为查询是表值函数的一部分,该函数不允许访问临时表。 表变量版本的执行计划 临时表版本的执行计划

1
将存储过程的结果插入表变量
我有一个存储过程,将值存储在表变量中。我选择这些值并在调用过程时将其返回。 我试图在另一个表变量中设置这些返回值,但我无法弄清楚。 存储过程 ALTER PROCEDURE [dbo].[GetOrSetDomainId] @DomainName varchar(50), @DomainUrl varchar(50) AS BEGIN DECLARE @DomainId bigint; DECLARE @NumberOfRwos bigint; DECLARE @DomainHistory TABLE ( DomainId bigint, HasHistory bit, ServerOnline bit, DatabaseOnline bit, ServerPerformance bigint, DatabasePerformance bigint, SoldTickets bigint ) SELECT @NumberOfRwos = COUNT(Id) FROM DomainData WHERE DomainName = @DomainName OR DomainUrl = …


2
究竟何时有多个用户无法同时使用临时表运行存储过程?
我对最近在TechNet上阅读的有关Temp Tables的文档有疑问。该页面上“ 临时表”部分的第四段内容如下: 如果使用命名约束创建了一个临时表,并且该临时表是在用户定义的事务范围内创建的,则一次只能有一个用户可以执行创建临时表的语句。例如,如果存储过程创建具有命名主键约束的临时表,则该存储过程不能由多个用户同时执行。 我在这样一个环境中工作:我们大量使用了一些使用索引临时表的存储过程,而我们从未遇到过用户必须等待一个执行完成才能开始下一个执行的问题。我希望情况会继续如此,但我担心,如果未正确理解此警告,可能会成为一个问题。 具体来说,我不清楚以下几点: 这仅适用于全局临时表还是局部临时表?一个在会话外部不可见的表(在后一种情况下)会阻止另一个会话同时执行,这似乎很奇怪。 什么才算是“命名约束”?并非所有约束都具有名称(即使它们是系统生成的)?这是否指的是具有用户定义别名的约束?对我来说,这似乎是措辞不好。 “多个用户”实际上意味着多个会话吗?这些过程是通过使用单个服务帐户的应用程序调用的,因此99.9%的脚本调用是由该单个帐户进行的(对于管理员偶尔在后端进行的调用,我并不担心)。如果服务帐户可以同时在多个会话中运行该存储过程,那么出于我的目的,这个问题就没有意义了。

4
MySQL为什么会产生这么多临时MYD文件?
在托管许多PHP / MySQL网站(照相馆)的Debian Linux服务器上,有时我有“许多”文件,例如/tmp/#sql_6405_58.MYD。 例如今天: [2012-12-15 15:18:11] /tmp/#sql_6405_6.MYD : 88MB [2012-12-15 15:18:11] /tmp/#sql_6405_3.MYD : 22MB [2012-12-15 15:18:11] /tmp/#sql_6405_4.MYD : 138MB [2012-12-15 15:18:11] /tmp/#sql_6405_10.MYD : 88MB ... [2012-12-15 15:18:11] /tmp/#sql_6405_9.MYD : 15MB [2012-12-15 15:18:11] /tmp/#sql_6405_65.MYD : 49MB [2012-12-15 15:18:11] /tmp/#sql_6405_44.MYD : 69MB (同时59个文件,超过6GB ...是的,我监视/ tmp中的大文件) 不幸的是,/tmp它位于同一个分区,/并且临时中断了Web服务器,因为/我想它已满。然后文件消失,服务器恢复正常。 所有文件名都遵循该#sql_6405_*.MYD模式。我想了解哪个MySQL操作意味着这么多的临时文件。我在此服务器上大约有2000个数据库。是否可以知道与哪个数据库有关?

1
sp_prepexec(sp_execute)与sp_executeSQL
问题的实质:实际的存储过程是实现临时表缓存的唯一机制,还是sp_executeSQL/ 等系统存储过程sp_execute也利用了它们? 我不是DBA,所以请少说话。我们的应用程序发送了准备好的语句,这些语句从探查器中运行,我看到它运行所有SQL,sp_prepexec这是同时运行sp_prepare和的系统过程sp_execute。我要尝试做的是弄清楚我是否从临时表缓存中受益。 我一直在使用带有object_id()的本指南来检查行为 https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html 然后,此博客文章上的第3点表明EXEC无法使用临时表缓存,但忽略了sp_executeSQL是否可以:http : //blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx 在通过客户端发送的查询中,我创建了一个简单的临时表。 DECLARE @foo int; -- set by JDBC, unused but required to force a prepared statement SELECT 1 AS id INTO #tmp SELECT OBJECT_ID('tempdb..#tmp'); 在探查器中,我可以看到: declare @p1 int set @p1=NULL exec sp_prepexec @p1 output,N'@P1 int',N'declare @foo INT = @P1 SELECT 1 …

1
在这种情况下,表变量如何提高查询性能?
对于这种特定情况,我将在下面尝试说明,使用表变量比不使用表变量要好。 我想知道为什么,如果可能的话,摆脱表变量。 这是使用表变量的查询: USE [BISource_UAT] GO set statistics io on SET STATISTICS TIME ON SET NOCOUNT ON; DECLARE @OrderStartDate DATETIME = '15-feb-2015' DECLARE @OrderEndDate DATETIME = '28-feb-2016' DECLARE @tmp TABLE ( strBxOrderNo VARCHAR(20) ,sintReturnId INT ) INSERT INTO @tmp SELECT strBxOrderNo ,sintReturnId FROM TABLEBACKUPS.dbo.tblBReturnHistory rh WHERE rh.sintReturnStatusId in ( 3 …

2
XML解析缓慢
我目前正在尝试调整一个有问题的存储过程,并且我已经注意到,与运行该存储过程相关的大部分成本来自将某些XML解析为临时表的解析。这是有问题的SQL: CREATE TABLE #ChangeSet ( RemarkTypeID TINYINT NOT NULL PRIMARY KEY, RemarkText VARCHAR(2500) NOT NULL, ListingID INT NOT NULL ) INSERT INTO #ChangeSet (RemarkTypeID, RemarkText, ListingID) SELECT T.c.value('@RemarkTypeID[1]','tinyint') AS RemarkTypeID, T.c.value('@RemarkText[1]','varchar(2500)') AS RemarkText, @ListingID FROM @RemarksXml.nodes('/Remarks[1]/Remark') AS T(c) 此外,因此您对要解析的XML的结构有一些了解: <Remarks> <Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" RemarkID="211767" DateTimeCreated="1991-11-19T10:43:50" DateTimeModified="1992-01-01T10:43:50" RemarkTypeID="8" RemarkText="aaaWasher,Dryer,Refriger,Microwav" /> <Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.