คำถามติดแท็ก alter-table

คำสั่ง SQL ที่ใช้เพื่อแก้ไขวัตถุตารางที่มีอยู่

5
เหตุใดการเปลี่ยนแปลงคอลัมน์ไม่เป็นศูนย์ทำให้เกิดการเติบโตของไฟล์บันทึกขนาดใหญ่
ฉันมีตารางที่มีแถว 64 ม. ที่ใช้ดิสก์ 4.3 GB สำหรับข้อมูล แต่ละแถวมีประมาณ 30 ไบต์ของคอลัมน์จำนวนเต็มบวกNVARCHAR(255)คอลัมน์ตัวแปรสำหรับข้อความ ฉันเพิ่ม AA คอลัมน์ nullable Datetimeoffset(0)กับข้อมูลประเภท จากนั้นฉันก็อัพเดทคอลัมน์นี้สำหรับทุกแถวและตรวจสอบให้แน่ใจว่าเม็ดมีดใหม่ทั้งหมดวางค่าในคอลัมน์นี้ เมื่อไม่มีรายการ NULL ฉันก็วิ่งคำสั่งนี้เพื่อให้ฟิลด์ใหม่ของฉันได้รับคำสั่ง: ALTER TABLE tblCheckResult ALTER COLUMN [dtoDateTime] [datetimeoffset](0) NOT NULL ผลที่ได้คือการเติบโตอย่างมากในขนาดของบันทึกการทำธุรกรรม - จาก 6GB เป็นมากกว่า 36GB จนกว่าจะหมดพื้นที่! ไม่มีใครมีความคิดอะไรในโลก SQL Server 2008 R2 ที่กำลังทำอยู่สำหรับคำสั่งง่ายๆนี้เพื่อให้เกิดการเติบโตอย่างมาก

1
ฉันจะสลับตารางใน MySQL ได้อย่างไร
สมมติว่าฉันมีตารางfooซึ่งมีสถิติบางอย่างที่คำนวณได้ทุกตอนแล้ว มันถูกใช้อย่างหนักโดยการสอบถามอื่น ๆ นั่นเป็นเหตุผลที่ฉันต้องการคำนวณสถิติล่าสุดfoo_newและสลับเมื่อการคำนวณพร้อมใช้งาน ฉันทำได้ ALTER TABLE foo RENAME foo_tmp; ALTER TABLE foo_new RENAME foo; แต่สิ่งที่เกิดขึ้นถ้าการสอบถามความต้องการของตารางfooinbetween ทั้งสองสายเมื่อมีโต๊ะไม่foo? ฉันเดาว่าฉันต้องล็อคมันไว้ ... หรือจะมีวิธีอื่นอีกไหม?

3
การเพิ่มคอลัมน์ในตารางการผลิต
วิธีที่ดีที่สุดในการเพิ่มคอลัมน์ในตารางการผลิตขนาดใหญ่บน SQL Server 2008 R2 คืออะไร ตามหนังสือของ Microsoft ทางออนไลน์: การเปลี่ยนแปลงที่ระบุใน ALTER TABLE จะถูกนำไปใช้งานทันที หากการเปลี่ยนแปลงนั้นต้องการการแก้ไขแถวในตาราง ALTER TABLE จะอัพเดตแถว ALTER TABLE ได้รับ schema แก้ไขการล็อกบนตารางเพื่อให้แน่ใจว่าไม่มีการอ้างอิงการเชื่อมต่ออื่น ๆ แม้แต่ข้อมูลเมตาสำหรับตารางในระหว่างการเปลี่ยนแปลงยกเว้นการดำเนินการดัชนีออนไลน์ที่ต้องใช้การล็อค SCH-M ที่สั้นมากในตอนท้าย (http://msdn.microsoft.com/en-us/library/ms190273.aspx) บนโต๊ะขนาดใหญ่ที่มีแถวนับล้านแถวอาจใช้เวลาสักครู่ การดับเป็นตัวเลือกเดียวหรือไม่ วิธีที่ดีที่สุดในการจัดการกับสถานการณ์เช่นนี้คืออะไร?

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

2
เปลี่ยนคอลัมน์จาก NOT NULL เป็น NULL - เกิดอะไรขึ้นภายใต้ประทุน?
เรามีตารางที่มีแถว 2.3B อยู่ เราต้องการเปลี่ยนคอลัมน์จาก NOT NULL เป็น NULL คอลัมน์มีอยู่ในหนึ่งดัชนี (ไม่ใช่ดัชนีแบบคลัสเตอร์หรือ PK) ชนิดข้อมูลไม่เปลี่ยนแปลง (เป็น INT) เพียงความไร้ค่า คำสั่งดังต่อไปนี้: Alter Table dbo.Workflow Alter Column LineId Int NULL การดำเนินการใช้เวลาเกินกว่า 10 ก่อนที่เราจะหยุดมัน (เรายังไม่ปล่อยให้มันทำงานจนเสร็จเพราะมันเป็นการปิดกั้นและใช้เวลานานเกินไป) เราอาจคัดลอกตารางไปยังเซิร์ฟเวอร์ dev เพื่อทดสอบว่าใช้เวลานานเท่าใด แต่ฉันอยากรู้ถ้าใครรู้ว่าสิ่งที่ SQL Server ทำภายใต้ประทุนเมื่อแปลงจาก NOT NULL เป็น NULL นอกจากนี้ดัชนีที่ได้รับผลกระทบจะต้องได้รับการสร้างใหม่หรือไม่ แผนแบบสอบถามที่สร้างขึ้นไม่ได้ระบุว่าเกิดอะไรขึ้น ตารางในคำถามถูกทำคลัสเตอร์ (ไม่ใช่ฮีป)

6
แก้ไขตารางในฐานข้อมูลที่ใช้งานจริง
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Exchange Administrators Stack Exchange อพยพ 7 ปีที่ผ่านมา ระบบฐานข้อมูล "ยอดนิยม" (MySQL, Postgres ... ) ส่วนใหญ่จะจัดการกับการเปลี่ยนแปลงตารางบนฐานข้อมูลการผลิตจริง (เช่นการเพิ่มการลบหรือการเปลี่ยนประเภทของโคลลัส) ได้อย่างไร ฉันรู้ว่าวิธีที่ถูกต้องคือการสำรองข้อมูลทุกอย่างกำหนดเวลาหยุดทำงานและทำการเปลี่ยนแปลง แต่ ... ระบบฐานข้อมูลปัจจุบันสนับสนุนการทำสิ่งเหล่านี้ "ออนไลน์" โดยไม่หยุดอะไรหรือไม่? (อาจเป็นเพียงการชะลอการสืบค้นที่อ้างอิงคอลัมน์ที่เพิ่งมีการเปลี่ยนแปลง / ลบ) และจะเกิดอะไรขึ้นเมื่อฉันเพิ่งALTER TABLE...สร้างฐานข้อมูลที่ทำงานอยู่ ทุกอย่างหยุดลงเมื่อสิ่งนี้เกิดขึ้นหรือไม่? ข้อมูลเสียหายหรือไม่ เป็นต้น อีกครั้งฉันส่วนใหญ่หมายถึง Postgres หรือ MySQL เป็นสิ่งที่ฉันพบ (และใช่ทุกครั้งที่ฉันต้องทำสิ่งนี้ก่อนที่ฉันจะทำ "วิธีการที่ถูกต้อง" สำรองสิ่งต่างๆจัดตารางเวลาดาวน์ไทน์ ฯลฯ ... แต่ฉันแค่อยากรู้ว่ามันเป็นไปได้ไหมที่จะทำสิ่งนี้ " สกปรก "หรือหากมีระบบฐานข้อมูลใด ๆ ที่รองรับการเปลี่ยนแปลงสคีมา" …

3
ฉันจะเพิ่มคอลัมน์ rowversion ลงในตารางขนาดใหญ่โดยมีเวลาหยุดทำงานน้อยที่สุดได้อย่างไร
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Exchange Administrators Stack Exchange อพยพ 7 ปีที่ผ่านมา ใช้ SQL Server 2008 และใหม่กว่าฉันต้องการเพิ่มคอลัมน์ rowversion ในตารางขนาดใหญ่อย่างไรก็ตามเมื่อฉันเพียงแค่ ALTER TABLE [Tablename] ADD Rowversion [Rowversion] NOT NULL จากนั้นตารางจะไม่พร้อมใช้งานสำหรับการอัปเดตนานเกินไป ฉันสามารถใช้กลยุทธ์ใดในการลดเวลาหยุดทำงานนี้ ฉันจะพิจารณาอะไร แน่นอนง่ายกว่าดีกว่า แต่ฉันจะพิจารณากลยุทธ์ใด ๆ ความคิดของฉันคือเป็นทางเลือกสุดท้ายฉันสามารถรักษาตารางการแสดงละครที่ปรับปรุงใหม่โดยทริกเกอร์แล้ว sp_rename ตาราง staging ลงในตารางเดิม แต่ฉันหวังว่าจะได้อะไรที่ง่ายกว่า / ง่ายกว่านี้

4
Memory Optimized Tables - พวกเขายากที่จะรักษาหรือไม่?
ฉันกำลังตรวจสอบประโยชน์ของการอัปเกรดจาก MS SQL 2012 เป็น 2014 หนึ่งในจุดขายที่ยิ่งใหญ่ของ SQL 2014 คือตารางที่ปรับให้เหมาะสมกับหน่วยความจำ ฉันพบว่ามีข้อ จำกัด บางประการเกี่ยวกับตารางที่เพิ่มประสิทธิภาพหน่วยความจำเช่น: ไม่มี(max)ฟิลด์ขนาด สูงสุด ~ 1KB ต่อแถว ไม่มีtimestampสาขา ไม่มีคอลัมน์ที่คำนวณ ไม่มีUNIQUEข้อ จำกัด สิ่งเหล่านี้มีคุณสมบัติเป็นสิ่งรบกวน แต่ถ้าฉันต้องการที่จะหลีกเลี่ยงพวกเขาเพื่อให้ได้รับผลประโยชน์จากการทำงานฉันสามารถวางแผนได้ นักเตะตัวจริงคือความจริงที่ว่าคุณไม่สามารถเรียกใช้ALTER TABLEคำสั่งได้และคุณจะต้องผ่านอุปกรณ์ตรวจจับนี้ทุกครั้งที่คุณเพิ่มฟิลด์ลงในINCLUDEรายการดัชนี นอกจากนี้ยังปรากฏว่าคุณต้องปิดผู้ใช้ออกจากระบบเพื่อที่จะเปลี่ยนแปลงสคีมาใด ๆ กับตาราง MO บนฐานข้อมูลสด ฉันพบว่าสิ่งนี้ช่างเลวร้ายเหลือเกินจนฉันไม่อยากเชื่อเลยว่าไมโครซอฟท์อาจลงทุนด้านการพัฒนาเป็นจำนวนมากในฟีเจอร์นี้ สิ่งนี้นำฉันไปสู่ข้อสรุปที่ว่าฉันต้องผ่านจุดผิดที่ผิดพลาด ฉันต้องเข้าใจผิดบางอย่างเกี่ยวกับตารางที่ปรับให้เหมาะสมกับหน่วยความจำซึ่งทำให้ฉันเชื่อว่าการบำรุงรักษามันยากกว่าที่เป็นจริง ดังนั้นฉันเข้าใจผิดอะไร คุณใช้ตาราง MO แล้วหรือยัง มีการสลับลับหรือกระบวนการบางอย่างที่ทำให้สามารถใช้งานและบำรุงรักษาได้จริงหรือไม่?

3
ทำไมฉันถึงชอบ ALGORITHM = COPY ถึง ALGORITHM = INPLACE
ตั้งแต่ MySQL 5.6 แนะนำ DDL ออนไลน์ALTER TABLEคำสั่งสามารถเลือกที่จะมีALGORITHM=INPLACEหรือALGORITHM=COPYระบุก็ได้ ภาพรวมของ DDL ออนไลน์หมายเหตุที่โดยปกติINPLACEจะใช้ที่ใดก็ตามที่เป็นไปได้และหมายถึง (โดยที่ไม่เคยระบุว่าค่อนข้าง) ว่าINPLACEอัลกอริทึมที่มีราคาถูกกว่าCOPYหนึ่งคือ ดังนั้นฉันจะต้องระบุเหตุผลอะไรALGORITHM=COPYในALTER TABLEแถลงการณ์?

1
ทำไมการเพิ่มคอลัมน์ NOT NULL ด้วยข้อ จำกัด เริ่มต้นทันที?
CREATE TABLE TestTab (ID INT IDENTITY(1,1), st nvarchar(100)) INSERT INTO TestTab (st) values ('a') INSERT INTO TestTab (st) values ('b') INSERT INTO TestTab (st) values ('c') INSERT INTO TestTab (st) values ('d') INSERT INTO TestTab (st) values ('e') INSERT INTO TestTab (st) SELECT TOP 10000 st from testtab GO 30 …

3
รีเซ็ตค่าตัวตน
ฉันมีตารางที่มีคอลัมน์ประจำตัว ในขณะที่กำลังพัฒนาฉันจะลบแถวเป็นครั้งคราวและเพิ่มอีกครั้ง แต่ค่าตัวตนต่าง ๆ เพิ่มขึ้นเรื่อย ๆ และไม่ได้เริ่มต้นจาก 1 เมื่อฉันเพิ่มพวกเขาอีกครั้ง ตอนนี้รหัสของฉันไปจาก 68 -> 92 และนี่ทำให้รหัสของฉันล่ม ฉันจะรีเซ็ตค่าตัวตนได้อย่างไร

2
ฐานข้อมูล“ ตรึง” บน ALTER TABLE
สภาพแวดล้อมการผลิตของเราเพิ่งแข็ง * เช้านี้สักพักเมื่อเปลี่ยนโต๊ะเพิ่มคอลัมน์จริง การละเมิด SQL:ALTER TABLE cliente ADD COLUMN topicos character varying(20)[]; * การเข้าสู่ระบบของเราต้องเลือกจากตารางเดียวกันนั้นดังนั้นจึงไม่มีใครสามารถเข้าสู่ระบบในช่วงตารางการเปลี่ยนแปลง เราต้องฆ่ากระบวนการเพื่อให้ระบบกลับมาทำงานตามปกติ โครงสร้างตาราง: CREATE TABLE cliente ( rut character varying(30) NOT NULL, nombre character varying(150) NOT NULL, razon_social character varying(150) NOT NULL, direccion character varying(200) NOT NULL, comuna character varying(100) NOT NULL, ciudad character varying(100) NOT NULL, …

1
เมื่อเปลี่ยนขนาดของคอลัมน์ nvarchar ฉันจำเป็นต้องทำดัชนีที่ไม่ซ้ำหรือไม่? และตารางจะถูกล็อคเมื่อสร้างดัชนีใหม่หรือไม่
ในฐานข้อมูลของเรามีตารางขนาดใหญ่ที่มีลักษณะคล้ายกันมากขึ้นหรือน้อยลง: CREATE TABLE dbo.production_data ( pd_id BIGINT PRIMARY KEY, serial NVARCHAR(16) NOT NULL UNIQUE, ... ); แต่ตอนนี้ขนาดของเขตข้อมูลอนุกรมกลายเป็นต่ำดังนั้นฉันต้องการเปลี่ยนเป็น 32 schema Visual Studio เปรียบเทียบเครื่องมือแนะนำการทำเช่นนี้โดย: DROP INDEX ux_production_data_serial ON dbo.production_data; GO ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL; GO CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC); มันจำเป็นจริงๆหรือ? หรือมากกว่านั้นเป็นวิธีที่ประหยัดมากในการทำเช่นนี้? เมื่อสร้างดัชนีที่ไม่ซ้ำอีกครั้งตารางของฉันจะถูกล็อคหรือไม่ เพราะนี่จะเป็นปัญหาใหญ่ (เนื่องจากตารางมี 30 …

3
ALTER TABLE บนตารางขนาดใหญ่พร้อมคอลัมน์ที่จัดทำดัชนี
ฉันมีตารางขนาดใหญ่ที่มีคอลัมน์ VARCHAR (20) และฉันต้องแก้ไขเพื่อให้เป็นคอลัมน์ VARCHAR (50) โดยปกติแล้วการแสดง ALTER TABLE (การเพิ่ม TINYINT) ในตารางนี้จะใช้เวลาประมาณ 90-120 นาทีในการดำเนินการดังนั้นฉันสามารถทำได้ในคืนวันเสาร์หรือวันอาทิตย์เท่านั้นเพื่อหลีกเลี่ยงผลกระทบต่อผู้ใช้ฐานข้อมูล ถ้าเป็นไปได้ฉันต้องการจะทำการแก้ไขก่อนหน้านี้ คอลัมน์ถูกทำดัชนีด้วยซึ่งฉันเข้าใจว่าจะทำให้ ALTER TABLE ช้าลงเนื่องจากต้องสร้างดัชนีใหม่หลังจากแก้ไขความยาวคอลัมน์ แอพพลิเคชั่นเว็บถูกตั้งค่าในสภาพแวดล้อมการจำลองแบบ MySQL (26 ทาสและต้นแบบหนึ่งคน) ฉันจำได้ว่าเมื่ออ่านที่ไหนสักแห่งว่าวิธีหนึ่งคือการดำเนินการ ALTER TABLE บนแต่ละสลาฟก่อน (ลดผลกระทบต่อผู้ใช้) จากนั้นทำสิ่งนี้กับ Master แต่จะไม่ลองทำซ้ำคำสั่ง ALTER TABLE กับทาส? ดังนั้นคำถามของฉันคือ: วิธีที่ดีที่สุดสำหรับฉันที่จะปรับเปลี่ยนตารางนี้มีการหยุดชะงักขั้นต่ำให้กับผู้ใช้ของฉันคืออะไร? แก้ไข: ตารางคือ InnoDB

3
เหตุใดคำสั่ง ALTER TABLE แบบธรรมดาจึงใช้เวลานานในตารางที่มีดัชนีข้อความแบบเต็ม?
ฉันมีตารางชื่อมูลค่าขนาดใหญ่ (~ 67 ล้านแถว) ที่มีการจัดทำดัชนีข้อความแบบเต็มในDataValueคอลัมน์ ถ้าฉันพยายามเรียกใช้คำสั่งต่อไปนี้: ALTER TABLE VisitorData ADD NumericValue bit DEFAULT 0 NOT NULL; มันทำงานเป็นเวลา 1 ชั่วโมง 10 นาทีและยังไม่เสร็จสมบูรณ์ในVisitorDataตารางที่มีประมาณ 67 ล้านแถว ทำไมการดำเนินการนี้ใช้เวลานานและไม่เสร็จสมบูรณ์ ฉันจะทำอะไรได้บ้าง นี่คือรายละเอียดเพิ่มเติมเกี่ยวกับตาราง: CREATE TABLE [dbo].[VisitorData]( [VisitorID] [int] NOT NULL, [DataName] [varchar](80) NOT NULL, [DataValue] [nvarchar](3800) NOT NULL, [EncryptedDataValue] [varbinary](max) NULL, [VisitorDataID] [int] IDENTITY(1,1) NOT NULL, CONSTRAINT …

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