คำถามติดแท็ก delete

ในภาษาแบบสอบถามที่มีโครงสร้างฐานข้อมูล (SQL) คำสั่ง DELETE จะลบระเบียนอย่างน้อยหนึ่งรายการออกจากตาราง

9
ควรจัดการการลบในฐานข้อมูลอย่างไร
ฉันต้องการใช้คุณสมบัติ "ยกเลิกการลบ" ในเว็บแอปพลิเคชันซึ่งผู้ใช้สามารถเปลี่ยนใจและกู้คืนบันทึกที่ถูกลบได้ คิดว่าจะใช้งานอย่างไร ตัวเลือกบางตัวที่ฉันคิดว่าจริง ๆ แล้วเป็นการลบระเบียนที่เป็นปัญหาและจัดเก็บการเปลี่ยนแปลงในตารางตรวจสอบแยกต่างหากหรือไม่ลบระเบียนและใช้คอลัมน์ "ลบ" บูลีนเพื่อทำเครื่องหมายว่าถูกลบ โซลูชันหลังต้องการตรรกะเพิ่มเติมของแอปพลิเคชันเพื่อละเว้นระเบียน "ลบ" ภายใต้สถานการณ์ปกติ แต่จะทำให้ง่ายต่อการใช้การกู้คืนระเบียนในด้านแอปพลิเคชัน

5
วิธีการเร่งความเร็วการลบอย่างมากจาก <table> โดยไม่มีส่วนคำสั่ง
ใช้ SQL Server 2005 ฉันกำลังทำการลบขนาดใหญ่จากที่ไม่มีส่วนคำสั่ง โดยทั่วไปแล้วเทียบเท่ากับคำสั่ง TRUNCATE TABLE - ยกเว้นฉันไม่ได้รับอนุญาตให้ใช้ TRUNCATE ปัญหาคือตารางมีขนาดใหญ่มาก - 10 ล้านแถวและใช้เวลากว่าหนึ่งชั่วโมงกว่าจะเสร็จสมบูรณ์ มีวิธีทำให้เร็วขึ้นโดยไม่: ใช้ตัดทอน ปิดการใช้งานหรือวางดัชนี? t-log มีอยู่ในดิสก์ที่แยกต่างหาก ข้อเสนอแนะใด ๆ ยินดีต้อนรับ!

5
DELETE ช้ามากใน PostgreSQL หรือไม่?
ฉันมีฐานข้อมูลบน PostgreSQL 9.2 ที่มีคีมาหลักที่มีประมาณ 70 ตารางและจำนวนตัวแปรของสกีมาต่อไคลเอนต์ที่มีโครงสร้างเหมือนกันจำนวน 30 ตาราง สกีมาไคลเอนต์มีคีย์ต่างประเทศอ้างอิงถึงสกีมาหลักและไม่ใช่วิธีอื่น ๆ ฉันเพิ่งเริ่มเติมฐานข้อมูลด้วยข้อมูลจริงบางอย่างที่นำมาจากเวอร์ชันก่อนหน้า ฐานข้อมูลมาถึงประมาณ 1.5 GB (คาดว่าจะเพิ่มขึ้นเป็น 10s GB ภายในไม่กี่สัปดาห์) เมื่อฉันต้องทำการลบจำนวนมากในตารางกลางในสคีมาหลัก คีย์ต่างประเทศที่เกี่ยวข้องทั้งหมดจะถูกทำเครื่องหมายว่า DELETE CASCADE ไม่แปลกใจเลยว่าจะใช้เวลานาน แต่หลังจากผ่านไป 12 ชั่วโมงก็เห็นได้ชัดว่าฉันเริ่มต้นได้ดีกว่าปล่อย DB และเรียกใช้การย้ายข้อมูลอีกครั้ง แต่ถ้าฉันต้องทำซ้ำการดำเนินการนี้ในภายหลังเมื่อฐานข้อมูลมีชีวิตอยู่และมีขนาดใหญ่ขึ้น? มีวิธีอื่นให้เลือกเร็วกว่านี้ไหม? มันจะเร็วกว่านี้ไหมถ้าฉันเขียนสคริปต์ที่จะเรียกดูตารางที่ขึ้นต่อกันเริ่มต้นที่ตารางที่ไกลที่สุดจากตารางกลางการลบตารางแถวที่อยู่ต่อกันทีละตาราง? รายละเอียดที่สำคัญคือมีทริกเกอร์ในบางตาราง

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

4
ฉันต้องเรียกใช้ VACUUM FULL โดยไม่มีพื้นที่ว่างในดิสก์
ฉันมีหนึ่งตารางที่ใช้พื้นที่เกือบ 90% ของ hd พื้นที่บนเซิร์ฟเวอร์ของเรา ฉันตัดสินใจที่จะวางคอลัมน์ไม่กี่คอลัมน์เพื่อเพิ่มพื้นที่ว่าง แต่ฉันต้องคืนพื้นที่ไปยังระบบปฏิบัติการ อย่างไรก็ตามปัญหาคือฉันไม่แน่ใจว่าจะเกิดอะไรขึ้นถ้าฉันเรียกใช้ VACUUM FULL และมีพื้นที่ว่างไม่เพียงพอที่จะทำสำเนาของตาราง ฉันเข้าใจว่าไม่ควรใช้สูญญากาศเต็มรูปแบบ แต่ฉันคิดว่านี่เป็นตัวเลือกที่ดีที่สุดในสถานการณ์นี้ ความคิดใด ๆ ที่จะได้รับการชื่นชม ฉันใช้ PostgreSQL 9.0.6

2
วิธีที่มีประสิทธิภาพที่สุดในการลบแถวจำนวนมากออกจาก postgres
ฉันสงสัยว่าวิธีที่มีประสิทธิภาพมากที่สุดคือการลบจำนวนแถวขนาดใหญ่ออกจาก PostgreSQL กระบวนการนี้จะเป็นส่วนหนึ่งของงานที่เกิดซ้ำทุกวันเพื่อนำเข้าข้อมูลจำนวนมาก (ส่วนที่แทรก + ลบ) ลงในตาราง อาจมีหลายพันแถวที่อาจลบเป็นล้านแถว ฉันมีไฟล์ของคีย์หลักหนึ่งรายการต่อบรรทัด ตัวเลือกสองตัวที่ฉันคิดว่ามีอยู่ตามลำดับด้านล่าง แต่ฉันไม่ทราบ / เข้าใจ internals ของ PostgreSQL มากพอที่จะทำการตัดสินใจอย่างชาญฉลาดซึ่งจะดีที่สุด ดำเนินการDELETEค้นหาสำหรับแต่ละแถวในไฟล์โดยใช้WHEREคีย์หลักอย่างง่าย(หรือจัดกลุ่มการลบเป็นกลุ่มnโดยใช้ส่วนIN()คำสั่ง) นำเข้าคีย์หลักเข้าสู่ตารางชั่วคราวโดยใช้COPYคำสั่งแล้วลบออกจากตารางหลักโดยใช้การเข้าร่วม ข้อเสนอแนะใด ๆ จะได้รับการชื่นชมมาก!

6
คำสั่ง DELETE ไม่เสร็จในตาราง 30,000,000 แถว
ฉันได้รับฐานข้อมูลและต้องการทำความสะอาดและเร่งความเร็ว ฉันมีตารางที่มีแถว 30,000,000 แถวซึ่งส่วนใหญ่เป็นข้อมูลขยะที่แทรกเนื่องจากข้อผิดพลาดในนามของโปรแกรมเมอร์ของเรา ก่อนที่ฉันจะเพิ่มดัชนีใหม่ที่ได้รับการปรับปรุงให้ดีขึ้นฉันจะแปลงตารางจาก MyISAM เป็น InnoDB และฉันต้องการลบแถวจำนวนมากที่มีข้อมูลขยะ ฐานข้อมูลคือ MySQL 5.0 และฉันมีสิทธิ์เข้าถึงรูทไปยังเซิร์ฟเวอร์ ฉันใช้งานคำสั่งเหล่านี้เป็นครั้งแรกผ่านทาง Adminer จากนั้น phpMyAdmin ทั้งคู่ก็มีผลลัพธ์เหมือนกัน คำสั่งที่ฉันใช้คือ DELETE FROM `tablename` WHERE `columnname` LIKE '-%' -เป็นหลักอะไรลบในคอลัมน์นี้ที่เริ่มต้นด้วยเส้นประ มันใช้เวลาประมาณ 3-5 นาทีและเมื่อฉันดูรายการกระบวนการมันก็หายไป จากนั้นฉันก็วิ่ง SELECT * FROM `tablename` WHERE `columnname` LIKE '-%' และจะส่งคืนแถวนับล้าน ทำไมคำสั่งลบของฉันจึงไม่เสร็จ PS, ฉันรู้ว่า MySQL 5.0 ล้าสมัยแล้วอย่างไร ฉันกำลังทำงานเกี่ยวกับการย้ายฐานข้อมูลไปยัง MySQL 5.6 w …

2
เหตุใด DELETE จึงมีผลกระทบต่อประสิทธิภาพอย่างมาก
ในตอนท้ายคือสคริปต์ทดสอบสำหรับเปรียบเทียบประสิทธิภาพระหว่างตัวแปร @table และตาราง #temp ฉันคิดว่าฉันตั้งค่าไว้อย่างถูกต้อง - การกำหนดเวลาการทำงานนั้นเกิดขึ้นนอกคำสั่ง DELETE / TRUNCATE ผลลัพธ์ที่ฉันได้รับมีดังนี้ (คูณเป็นมิลลิวินาที) @Table Variable #Temp (delete) #Temp (truncate) --------------- -------------- ---------------- 5723 5180 5506 15636 14746 7800 14506 14300 5583 14030 15460 5386 16706 16186 5360 เพียงเพื่อให้แน่ใจว่าฉันมีสติสิ่งนี้แสดงให้เห็นว่า CURRENT_TIMESTAMP (aka GetDate()) ถูกนำมาใช้ในเวลาของคำสั่งไม่ใช่ของแบตช์ดังนั้นจึงไม่มีการโต้ตอบระหว่าง TRUNCATE / DELETE กับSET @StartTime = CURRENT_TIMESTAMPคำสั่ง select current_timestamp …

2
ทริกเกอร์: ย้ายแถวที่ถูกลบไปยังตารางเก็บถาวร
ฉันมีตารางเล็ก ๆ (~ 10 แถว) ที่เรียกว่าrestrictionsในฐานข้อมูล PostgreSQL ของฉันซึ่งค่าจะถูกลบและแทรกทุกวัน ฉันต้องการเรียกตารางrestrictions_deletedที่ซึ่งทุกแถวที่ถูกลบrestrictionsจะถูกเก็บไว้โดยอัตโนมัติ เนื่องจากrestrictionsมีรหัสซีเรียลจะไม่มีการทำซ้ำ ฉันจะเขียนทริกเกอร์ใน PostgreSQL ได้อย่างไร

6
วิธีที่ดีที่สุดในการลบชุดระเบียนที่มีขนาดใหญ่มากใน Oracle
ฉันจัดการแอปพลิเคชันที่มีข้อมูลขนาดใหญ่มาก (เกือบ 1TB ของข้อมูลมีมากกว่า 500 ล้านแถวในหนึ่งตาราง) ฐานข้อมูล Oracle ส่วนหลัง ฐานข้อมูลไม่ได้ทำอะไรเลย (ไม่มี SProcs, ไม่มีทริกเกอร์หรืออะไรเลย) เป็นเพียงแหล่งข้อมูล ทุกเดือนเราจะต้องล้างเร็กคอร์ดจากตารางหลักสองตาราง เกณฑ์สำหรับการกำจัดแตกต่างกันไปและเป็นการรวมกันของอายุแถวและฟิลด์สถานะสองสาม โดยทั่วไปแล้วเราจะกวาดล้างระหว่าง 10 ถึง 50 ล้านแถวต่อเดือน (เราเพิ่มประมาณ 3-5 ล้านแถวต่อสัปดาห์ผ่านการนำเข้า) ขณะนี้เราต้องทำการลบแบบกลุ่มประมาณ 50,000 แถว (เช่นลบ 50000, comit, ลบ 50000, กระทำ, ทำซ้ำ) การพยายามลบชุดข้อมูลทั้งหมดในครั้งเดียวทำให้ฐานข้อมูลไม่ตอบสนองประมาณหนึ่งชั่วโมง (ขึ้นอยู่กับจำนวนแถว) การลบแถวในแบทช์เช่นนี้จะหยาบมากในระบบและโดยทั่วไปเราจะต้องทำมัน "ตามเวลาที่อนุญาต" ในช่วงเวลาหนึ่งสัปดาห์ การอนุญาตให้สคริปต์รันอย่างต่อเนื่องอาจส่งผลให้ประสิทธิภาพการทำงานลดลงซึ่งผู้ใช้ไม่สามารถยอมรับได้ ฉันเชื่อว่าการลบแบทช์ประเภทนี้จะลดประสิทธิภาพของดัชนีและมีผลกระทบอื่น ๆ ซึ่งในที่สุดจะทำให้ประสิทธิภาพของฐานข้อมูลลดลง มี 34 ดัชนีในตารางเดียวและขนาดข้อมูลดัชนีใหญ่กว่าข้อมูลจริง นี่คือสคริปต์ที่หนึ่งในพนักงานไอทีของเราใช้ในการล้างข้อมูลนี้: BEGIN LOOP delete …

2
Tombstone Table vs Deleted Flag ในสถานการณ์การซิงโครไนซ์ฐานข้อมูล & การลบแบบอ่อน
ฉันต้องติดตามรายการที่ถูกลบเพื่อให้ตรงกับความต้องการของลูกค้า โดยทั่วไปจะเป็นการดีกว่าถ้าเพิ่มตาราง tombstoneและทริกเกอร์ที่ติดตามเมื่อแถวถูกลบออกจากฐานข้อมูลเซิร์ฟเวอร์ - โดยทั่วไปแล้วเพิ่มแถวใหม่ลงในตาราง tombstone ด้วยข้อมูลจากรายการที่ถูกลบหรือเพื่อเก็บรายการใน ตารางดั้งเดิมและตั้งค่าสถานะพวกเขาว่าถูกลบโดยทั่วไปจะมีคอลัมน์ประเภทบิตเพื่อระบุว่าแถวถูกลบและคอลัมน์อื่นที่จะติดตามเมื่อการลบเกิดขึ้น?
17 delete 

3
การลบระเบียนช้าเมื่อเปิดใช้งานทริกเกอร์
ความคิดนี้ได้รับการแก้ไขด้วยลิงก์ด้านล่าง - งานแก้ไข - แต่โปรแกรมแก้ไขไม่ได้ ทำงานกับฝ่ายสนับสนุนของ Microsoft เพื่อแก้ไขปัญหา http://support.microsoft.com/kb/2606883 ตกลงดังนั้นฉันมีปัญหาที่ฉันต้องการจะออกไป StackOverflow เพื่อดูว่ามีใครมีความคิด หมายเหตุนี่คือกับ SQL Server 2008 R2 ปัญหา: การลบ 3000 รายการจากตารางที่มีระเบียน 15000 รายการใช้เวลา 3-4 นาทีเมื่อเปิดใช้งานทริกเกอร์และเพียง 3-5 วินาทีเมื่อปิดการใช้งานทริกเกอร์ การตั้งค่าตาราง เราจะเรียกสองโต๊ะหลักและรอง มัธยมศึกษามีบันทึกรายการที่ฉันต้องการลบดังนั้นเมื่อฉันลบฉันเข้าร่วมในตารางรอง กระบวนการทำงานก่อนคำสั่งลบเพื่อเติมข้อมูลตารางรองที่มีระเบียนที่จะถูกลบ ลบคำชี้แจง: DELETE FROM MAIN WHERE ID IN ( SELECT Secondary.ValueInt1 FROM Secondary WHERE SECONDARY.GUID = '9FFD2C8DD3864EA7B78DA22B2ED572D7' ); ตารางนี้มีคอลัมน์จำนวนมากและดัชนี NC …

1
การลบอายุอัตโนมัติ (ลบ) ของบันทึกเก่า ๆ ใน Postgres
Postgres มีคุณสมบัติใด ๆ เพื่อรองรับระเบียนเก่าที่ล้าสมัยหรือไม่? ฉันต้องการใช้ Postgres สำหรับบันทึกเป็นคิวซึ่งบันทึก (เหตุการณ์บันทึก) ที่เก่ากว่าสองสัปดาห์ถูกลบโดยอัตโนมัติ

2
เหตุใดจึงตัด DDL
ฉันมีคำถามสัมภาษณ์ซึ่งถูกถามระหว่างการสัมภาษณ์ ฉันตอบคำถาม แต่ผู้สัมภาษณ์ไม่เชื่อมั่นกับคำตอบของฉัน ดังนั้นทุกคนโปรดแก้ไขฉันด้วยความเข้าใจของฉัน Q. ทำไม Truncate เป็น DDL ที่ไหนในขณะที่ Delete เป็น DML ทั้งสองทำงานเกือบเหมือนกัน (ลบแถว) Ans เมื่อเราใช้ Truncate เราจะยกเลิกการจัดสรรพื้นที่ทั้งหมดที่จัดสรรโดยข้อมูลโดยไม่บันทึกลงใน undo-table-space แต่ในกรณีของการลบเราจะใส่ข้อมูลทั้งหมดในเลิกทำพื้นที่ตารางแล้วเราจะลบข้อมูลทั้งหมด กรุณาถ้าใครรู้คำตอบที่ดีที่สุดสำหรับข้างต้นโปรดอธิบาย
15 oracle  delete  ddl  truncate 

1
ลบแถวที่ไม่ได้อ้างอิงในตารางอื่น
ฉันมีสองตารางในฐานข้อมูล PostgreSQL 9.3 ตารางที่link_replyมีคีย์ต่างประเทศชื่อชี้ไปที่โต๊ะwhich_grouplink_group ฉันต้องการลบแถวทั้งหมดจากlink_groupที่ไม่มีแถวที่เกี่ยวข้องlink_replyอยู่ ฟังดูธรรมดาพอ แต่ฉันก็ดิ้นรนกับมัน มันจะเป็นอะไรที่เรียบง่ายแบบนี้ (ไม่ทำงาน)? DELETE FROM link_group WHERE link_reply = NULL;

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.