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

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

1
ดัชนีแบบคลัสเตอร์ไม่ได้ใช้ในคำสั่งลบ
ฉันมีตาราง SQL Server ที่กำหนดดังนี้ CREATE TABLE [dbo].[Production_Detail] ( [Id] [bigint] NOT NULL DEFAULT (NEXT VALUE FOR [dbo].[Production_Detail_Seq]), [Meta_Data_ID] INT NOT NULL , [Production_Detail_Time] DATETIME NOT NULL, [Production_Detail_Time_Local] DATETIME NOT NULL, [Production_Detail_Value] FLOAT NULL, [IntegratedDM] BIT NOT NULL DEFAULT 0, [DailyIntegratedDM] BIT NOT NULL DEFAULT 0, [InsertedDate] DateTime NOT NULL, [ModifiedDate] …

1
ผลกระทบไฟล์ดิสก์ของการลบและสูญญากาศ
ฉันมีตารางที่อัปเดตบ่อยมากที่มี 240 ล้านแถว (และเพิ่มขึ้น) ทุกๆสามชั่วโมง 1.5 ล้านแถวจะถูกแทรกและ 1.5 ล้านแถวจะถูกลบ เมื่อฉันย้ายคลัสเตอร์ไปยัง SSD เวลาแทรกจำนวนมาก (โดยใช้การคัดลอก) นี้ถูกตัดจาก 22 นาทีเป็น 2.3 นาที เวลาลบก็ดีขึ้นเช่นกัน ฉันวางแผนที่จะทำการอัปเดตจำนวนมากนี้ทุกสองชั่วโมงหรือทุกชั่วโมง แม้ว่าประสิทธิภาพในตอนนี้ (หลังจาก SSD) เข้ากันได้กับการอัปเดตบ่อยครั้งมากขึ้นฉันได้อ่านเรื่องราวสยองขวัญเกี่ยวกับการตายของ SSD เนื่องจากความอดทนของ NAND จำกัด รวมกับการขยายการเขียน เนื่องจาก SSD มีราคาแพงฉันจึงต้องการผลักดันความตายไปสู่อนาคตเท่าที่จะทำได้ ดังนั้นคำถามของฉัน: เกิดอะไรขึ้นกับไฟล์ดิสก์ในการลบและสูญญากาศที่ตามมา? ฉันเดาว่ามีการเขียนดิสก์สองรายการหนึ่งรายการเพื่อทำเครื่องหมายแถวว่าถูกลบและอีกรายการหนึ่งเมื่อดูดฝุ่นเพื่อทำเครื่องหมายว่าพร้อมใช้งานเพื่อเขียนทับ หากแทนที่การลบและการดูดฉันจะแบ่งพาร์ติชันตารางที่สร้างและวางตารางที่แต่ละส่วนแทรก / ลบจำนวนมากฉันจะลดการสึกหรอของ SSD หรือไม่

1
เหตุใด DELETE จึงช้ากว่า SELECT มากแล้วจึงลบตาม id
ฉันมีตาราง InnoDB ที่ค่อนข้างยุ่ง (200,000 แถวฉันเดาได้ว่ามีหลายสิบข้อความค้นหาต่อวินาที) เนื่องจากข้อผิดพลาดฉันได้รับ 14 แถวที่มีที่อยู่อีเมลไม่ถูกต้อง (เหมือนกัน) และต้องการลบทิ้ง ฉันลองDELETE FROM table WHERE email='invalid address'และได้รับ "เกินเวลารอการล็อค" หลังจากนั้นประมาณ 50 วินาที สิ่งนี้ไม่น่าประหลาดใจนักเนื่องจากคอลัมน์แถวไม่ได้จัดทำดัชนี อย่างไรก็ตามฉันทำSELECT id FROM table WHERE email='invalid address'และใช้เวลา 1.25 วินาที วิ่งDELETE FROM table WHERE id in (...)คัดลอกรหัสจากผลลัพธ์ SELECT ใช้เวลา 0.02 วินาที เกิดอะไรขึ้น? ใครสามารถอธิบายได้ว่าเหตุใด DELETE ที่มีเงื่อนไขจึงช้าลงจนหมดเวลา แต่การเลือก SELECT จากนั้นการลบด้วย id นั้นเร็วมาก …

2
ดูเหมือนว่าคิวรีลบขนาดใหญ่จะหยุดชะงัก
เราเรียกใช้คิวรีการลบในฐานข้อมูลที่มีแถว 1.8 พันล้าน การลบนี้จะลบแถว 1.2 พันล้าน ในการเข้าใจย้อนหลังเราจะแยกแบบสอบถามนี้เป็น 100m ต่อครั้ง แต่เราอยู่ในตำแหน่งที่มีการเรียกใช้งานเป็นเวลา 24 ชั่วโมงและไฟล์บันทึกอยู่ที่ 2Tb ซึ่งดูเหมือนจะเป็นขนาดสูงสุดที่อนุญาตสำหรับไฟล์บันทึก ฐานข้อมูลอยู่ในโหมดการกู้คืนแบบง่าย มีการบันทึกแบบสอบถามนี้หรือไม่? หรือเราต้องรีสตาร์ทเซิร์ฟเวอร์ SQL และดูว่าเกิดอะไรขึ้น ฐานข้อมูลจะใช้ไม่ได้หรือไม่ มีอะไรที่เราสามารถทำได้เพื่อกำจัดสิ่งนี้ให้หมดจดที่สุด

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

4
คำสั่ง DELETE ขัดแย้งกับข้อ จำกัด การอ้างอิง
สถานการณ์ของฉันเป็นดังนี้: ตาราง STOCK_ARTICLES: ID *[PK]* OTHER_DB_ID ITEM_NAME ตาราง LOCATION: ID *[PK]* LOCATION_NAME ตาราง WORK_PLACE: ID *[PK]* WORKPLACE_NAME ตาราง INVENTORY_ITEMS: ID *[PK]* ITEM_NAME STOCK_ARTICLE *[FK]* LOCATION *[FK]* WORK_PLACE *[FK]* 3 FKs ใน INVENTORY_ITEMS อ้างอิงคอลัมน์ "ID" ในตารางอื่น ๆ ที่เกี่ยวข้องอย่างชัดเจน ตารางที่เกี่ยวข้องที่นี่คือ STOCK_ARTICLE และ INVENTORY_ITEMS ขณะนี้มีงาน SQL ประกอบด้วยหลายขั้นตอน (สคริปต์ SQL) ที่ "ประสาน" ฐานข้อมูลที่กล่าวถึงข้างต้นกับฐานข้อมูลอื่น (OTHER_DB) …

3
ลบล้านแถวออกจากตาราง SQL
ฉันต้องลบมากกว่า 16 ล้านระเบียนจากตารางแถว 221 ล้านและมันจะช้ามาก ฉันขอขอบคุณถ้าคุณแบ่งปันคำแนะนำในการทำโค้ดด้านล่างให้เร็วขึ้น: SET TRANSACTION ISOLATION LEVEL READ COMMITTED; DECLARE @BATCHSIZE INT, @ITERATION INT, @TOTALROWS INT, @MSG VARCHAR(500); SET DEADLOCK_PRIORITY LOW; SET @BATCHSIZE = 4500; SET @ITERATION = 0; SET @TOTALROWS = 0; BEGIN TRY BEGIN TRANSACTION; WHILE @BATCHSIZE > 0 BEGIN DELETE TOP (@BATCHSIZE) FROM MySourceTable …

2
MySQL: ลบ…ใน .. ใน () เทียบกับลบ .. จาก .. เข้าร่วมและล็อคตารางเมื่อลบด้วยการเลือกย่อย
คำเตือน: โปรดแก้ตัวความรู้ของฉันเกี่ยวกับฐานข้อมูลภายใน นี่มันไป: เราเรียกใช้แอปพลิเคชั่น (ไม่ได้เขียนโดยเรา) ซึ่งมีปัญหาประสิทธิภาพการทำงานใหญ่ในงานล้างข้อมูลเป็นระยะในฐานข้อมูล แบบสอบถามมีลักษณะดังนี้: delete from VARIABLE_SUBSTITUTION where BUILDRESULTSUMMARY_ID in ( select BUILDRESULTSUMMARY_ID from BUILDRESULTSUMMARY where BUILDRESULTSUMMARY.BUILD_KEY = "BAM-1"); ตรงไปตรงมา SQL ที่อ่านง่ายและมาตรฐาน แต่น่าเสียดายที่ช้ามาก การอธิบายเคียวรีแสดงว่าไม่ได้ใช้ดัชนีที่VARIABLE_SUBSTITUTION.BUILDRESULTSUMMARY_IDมีอยู่: mysql> explain delete from VARIABLE_SUBSTITUTION where BUILDRESULTSUMMARY_ID in ( -> select BUILDRESULTSUMMARY_ID from BUILDRESULTSUMMARY -> where BUILDRESULTSUMMARY.BUILD_KEY = "BAM-1"); | id | select_type …

4
จะปรับปรุงประสิทธิภาพของ InnoDB DELETE ได้อย่างไร
ดังนั้นฉันมีตารางการตรวจสอบนี้ (ติดตามการดำเนินการในตารางใด ๆ ในฐานข้อมูลของฉัน): CREATE TABLE `track_table` ( `id` int(16) unsigned NOT NULL, `userID` smallint(16) unsigned NOT NULL, `tableName` varchar(255) NOT NULL DEFAULT '', `tupleID` int(16) unsigned NOT NULL, `date_insert` datetime NOT NULL, `action` char(12) NOT NULL DEFAULT '', `className` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `userID` (`userID`), KEY …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.