คำถามติดแท็ก temporary-tables

การใช้วัตถุตารางชั่วคราว (ไม่ใช่ตัวแปรตาราง) รวมถึงความหมายการออกแบบการเพิ่มประสิทธิภาพการทำงานและการสร้างดัชนี ดู [table-variable] ด้วย

2
ความแตกต่างระหว่างโต๊ะ temp และตัวแปร table ใน SQL Server คืออะไร?
ดูเหมือนว่าจะเป็นพื้นที่ที่มีตำนานและมุมมองที่ขัดแย้งกันอยู่บ้าง ดังนั้นความแตกต่างระหว่างตัวแปรตารางและตารางชั่วคราวใน SQL Server คืออะไร?

2
เหตุใดการใช้ตัวแปรตารางจึงเร็วกว่าตาราง #temp มากกว่าสองเท่าในกรณีเฉพาะนี้
ฉันอ่านบทความที่นี่ Temporary Tables vs. Variables Table และผลกระทบต่อประสิทธิภาพของ SQL Serverและ SQL Server 2008 ก็สามารถสร้างผลลัพธ์ที่คล้ายกันกับผลลัพธ์ที่แสดงในปี 2005 เมื่อดำเนินการตามขั้นตอนที่เก็บไว้ (คำจำกัดความด้านล่าง) โดยมีเพียง 10 แถวรุ่นตัวแปรตารางจะดำเนินการเวอร์ชันตารางชั่วคราวมากกว่าสองครั้ง ฉันเคลียร์แคชโพรซีเดอร์และรันทั้งโพรซีเดอร์ที่เก็บไว้ 10,000 ครั้งจากนั้นทำซ้ำกระบวนการสำหรับการรันอีก 4 ครั้ง ผลลัพธ์ด้านล่าง (เวลาเป็น ms ต่อชุด) T2_Time V2_Time ----------- ----------- 8578 2718 6641 2781 6469 2813 6766 2797 6156 2719 คำถามของฉันคือเหตุผลที่ทำให้ประสิทธิภาพที่ดีขึ้นของรุ่นตัวแปรตารางคืออะไร? ฉันได้ทำการสอบสวนแล้ว เช่นการดูเคาน์เตอร์วัดประสิทธิภาพด้วย SELECT cntr_value from sys.dm_os_performance_counters where …

2
MySQL สร้างตารางชั่วคราวบนดิสก์ ฉันจะหยุดมันได้อย่างไร
เรากำลังเรียกใช้ไซต์ (Moodle) ที่ผู้ใช้พบว่าช้า ฉันคิดว่าฉันได้ติดตามปัญหาของ MySQL ที่สร้างตารางชั่วคราวบนดิสก์ ฉันดูตัวแปรcreated_tmp_disk_tablesในการดูแลเซิร์ฟเวอร์ Mysql Workbench และจำนวนเพิ่มขึ้นด้วยประมาณ 50 tables / s หลังจากใช้ไป 1 วันcreated_tmp_disk_tablesคือ> 100k นอกจากนี้ดูเหมือนว่าหน่วยความจำจะไม่ออก การใช้งานเพิ่มขึ้นเรื่อย ๆ จนกระทั่งระบบใช้งานไม่ได้และเราต้องเริ่ม MySQL ใหม่ ฉันต้องเริ่มต้นใหม่เกือบทุกวันและเริ่มต้นด้วยการใช้หน่วยความจำที่มีอยู่ประมาณ 30-35% และจบวันด้วย 80% ฉันไม่มี blobs ในฐานข้อมูลและไม่สามารถควบคุมการค้นหาได้ดังนั้นฉันจึงไม่สามารถพยายามปรับให้เหมาะสม ฉันได้ใช้Percona Confirguration Wizardเพื่อสร้างไฟล์การกำหนดค่า แต่ my.ini ไม่ได้แก้ปัญหาเช่นกัน คำถาม ฉันควรเปลี่ยนอะไรเพื่อหยุด MySQL ไม่ให้สร้างตารางชั่วคราวบนดิสก์ จำเป็นต้องเปลี่ยนการตั้งค่าหรือไม่? ฉันควรจะโยนความทรงจำมากกว่านี้หรือไม่ ฉันจะหยุด MySQL ไม่ให้กินหน่วยความจำได้อย่างไร แก้ไข ฉันเปิดใช้งานการslow_queriesบันทึกและค้นพบว่าการสืบค้นSELECT GET_LOCK()ถูกบันทึกไว้ช้า การค้นหาอย่างรวดเร็วเปิดเผยว่าฉันอนุญาตการเชื่อมต่อแบบถาวรในการกำหนดค่า …

2
ขนาด varchar มีความสำคัญในตารางชั่วคราวหรือไม่?
มีการถกเถียงกันว่างานของภรรยาผมเกี่ยวกับเพียงแค่ใช้varchar(255)กับทุกvarcharสาขาในตารางชั่วคราวในขั้นตอนการจัดเก็บ โดยพื้นฐานแล้วค่ายหนึ่งต้องการใช้ 255 เพราะจะใช้ได้ตลอดแม้ว่าการเปลี่ยนแปลงคำจำกัดความและค่ายอื่นต้องการติดกับขนาดในตารางต้นฉบับเพื่อปรับปรุงประสิทธิภาพที่เป็นไปได้ ค่ายแสดงถูกต้องหรือไม่? มีความหมายอื่นหรือไม่? พวกเขากำลังใช้ SQL Server

1
ชื่อตาราง SQL Server ที่ขึ้นต้นด้วย # ในฐานข้อมูลผู้ใช้ไม่ใช่ใน tempdb ไม่ใช่ตาราง temp
#อย่างใดทศวรรษที่ผ่านมาตารางได้สร้างขึ้นในฐานข้อมูลของเราที่เริ่มต้นด้วย มันแสดงให้เห็นในวัตถุ Explorer tempdbที่ใต้ฐานข้อมูลของแอปไม่ได้อยู่ใน ด้วยเหตุผลบางอย่าง Azure จะไม่นำเข้าฐานข้อมูลเช่นนี้ เราไม่สามารถวางเปลี่ยนชื่อหรือโต้ตอบกับมันได้ ฉันได้ลองลบจาก Object Explorer, Script Drop , Renameจาก 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 …

3
ตาราง MEMORY ชั่วคราวจะคงอยู่นานแค่ไหนถ้าฉันไม่ทำมัน (MySQL)
ฉันใช้โพรซีเดอร์ที่จัดเก็บแบบเรียกซ้ำใน MySQL เพื่อสร้างตารางชั่วคราวที่เรียกว่าid_listแต่ฉันต้องใช้ผลลัพธ์ของโพรซีเดอร์นั้นในแบบสอบถามแบบติดตามผลดังนั้นฉันจึงไม่สามารถ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 …

1
เหตุใดจึงตัดทอนตาราง temp ที่ส่วนท้ายของโพรซีเดอร์ที่เก็บไว้ซึ่งสร้างพื้นที่ว่าง tempdb ให้เร็วขึ้น?
SQL Server แคชตาราง temp ที่สร้างขึ้นภายในโพรซีเดอร์ที่เก็บไว้และเปลี่ยนชื่อเพียงเมื่อโพรซีเดอร์สิ้นสุดลงและถูกเรียกใช้งานในภายหลัง คำถามของฉันเกี่ยวกับเมื่อมีการปล่อยพื้นที่ tempdb ผมเคยอ่านว่าตารางจะถูกตัดทอนในตอนท้ายของขั้นตอนที่ ฉันได้อ่านความคิดเห็นว่าสิ่งนี้ได้รับการจัดการในแต่ละช่วงและเห็นคำถามว่าจำเป็นต้องตอบคำถามเกี่ยวกับการล้างข้อมูลบน MSDNหรือไม่ แต่ถ้าหากมันไม่ถูกดำเนินการโดยเซสชั่นเดียวกันสองครั้ง? ฉันเคยได้ยินว่ามีกระบวนการเก็บรวบรวมขยะในพื้นหลังที่ทำให้มีพื้นที่ว่างเมื่อตารางไม่อยู่ในขอบเขต การตัดทอนตาราง temp ที่ส่วนท้ายของโพรซีเดอร์ที่เก็บไว้ซึ่งทำให้ดูเหมือนว่าพื้นที่ที่ตารางใช้ใน tempdb สำหรับข้อมูลที่จะเผยแพร่เร็วกว่าถ้าไม่มีการใช้คำสั่ง truncate แม้จะมีความคาดหวังที่ตรงกันข้าม ทำไม? อะไรคือความสัมพันธ์ของประสิทธิภาพในการใช้งานหรือไม่ใช้คำสั่งตัดทอน เมื่อใช้การแยก SNAPSHOT, tempdb มักจะเครียดและฉันคิดว่าการปล่อยพื้นที่ที่ใช้ใน tempdb จากตาราง tempdb ขนาดใหญ่โดยเร็วที่สุดจะช่วยป้องกันไม่ให้ tempdb เติบโตอย่างไม่จำเป็น การประหยัดพื้นที่ที่มีศักยภาพนี้จะมาพร้อมกับประสิทธิภาพหรือไม่ นี่คือรหัสบางส่วนในการทำซ้ำปัญหา (ส่วนใหญ่มาจาก @TheGameiswar โดยมีการเปลี่ยนแปลงบางอย่าง): SET NOCOUNT ON; GO ALTER PROC usp_test AS BEGIN IF object_id('tempdb..#temp') IS NOT NULL …

2
ความแตกต่างของประสิทธิภาพ INSERT ระหว่างตารางชั่วคราวและตัวแปรตาราง
ฉันมีปัญหาดังต่อไปนี้ใน SQL Server 2005: การพยายามแทรกแถวบางแถวในตัวแปรตารางใช้เวลานานเมื่อเทียบกับการแทรกแบบเดียวกันโดยใช้ตารางชั่วคราว นี่คือรหัสที่จะแทรกลงในตัวแปรตาราง DECLARE @Data TABLE(...) INSERT INTO @DATA( ... ) SELECT .. FROM ... นี่คือรหัสที่จะแทรกลงในตารางอุณหภูมิ CREATE #Data TABLE(...) INSERT INTO #DATA( ... ) SELECT .. FROM ... DROP TABLE #Data ตารางชั่วคราวไม่มีคีย์หรือดัชนีใด ๆ ส่วนที่เลือกจะเหมือนกันระหว่าง 2 แบบสอบถามและจำนวนผลลัพธ์ที่ส่งคืนโดยการเลือกคือ ~ 10,000 แถว เวลาที่ใช้ในการดำเนินการเลือกอย่างเดียวคือ ~ 10 วินาที เวอร์ชันของ temp table ใช้เวลาในการรันสูงสุด …

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 …

1
ตรรกะอ่านบนโต๊ะ temp ทั่วโลก แต่ไม่ได้อยู่ในตาราง temp ระดับเซสชั่น
พิจารณา MCVE แบบง่าย ๆ ต่อไปนี้: SET STATISTICS IO, TIME OFF; USE tempdb; IF OBJECT_ID(N'tempdb..#t1', N'U') IS NOT NULL DROP TABLE #t1; CREATE TABLE #t1 ( r int NOT NULL ); IF OBJECT_ID(N'tempdb..##t1', N'U') IS NOT NULL DROP TABLE ##t1; CREATE TABLE ##t1 ( r int NOT NULL ); IF OBJECT_ID(N'dbo.s1', …

1
sp_prepexec (sp_execute) กับ sp_executeSQL
เนื้อของคำถาม: เป็นขั้นตอนการจัดเก็บจริงกลไกเดียวที่ดำเนินการแคชตารางชั่วคราวหรือทำขั้นตอนการจัดเก็บระบบเช่นsp_executeSQL/ sp_executeยังใช้ประโยชน์จากพวกเขา? ฉันไม่ใช่ DBA ดังนั้นโปรดใช้คำพูดเล็กน้อย โปรแกรมของเราส่งงบเตรียมมากกว่าว่าจาก Profiler ที่ฉันเห็นเรียกใช้ SQL ทั้งหมดที่ผ่านsp_prepexecซึ่งเป็นขั้นตอนของระบบสำหรับทั้งทำงานและsp_prepare sp_executeสิ่งที่ฉันพยายามทำคือหาว่าฉันได้รับประโยชน์จากการแคชตารางชั่วคราว ฉันใช้คู่มือนี้กับ object_id () เพื่อตรวจสอบพฤติกรรม https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html แล้วชี้ # 3 โพสต์บล็อกนี้แสดงให้เห็นว่า EXEC ไม่สามารถใช้แคชตาราง temp แต่ใบออกว่า 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 …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.