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

คำสั่งหลักใน SQL ที่ทำตามที่กล่าวไว้ในกระป๋อง: แทรกข้อมูลลงในตาราง

3
วิธีแทรกค่าลงในตารางจากแบบสอบถามแบบใช้เลือกข้อมูลใน PostgreSQL ได้อย่างไร
ผมมีตารางและตารางitems (item_id serial, name varchar(10), item_group int)items_ver (id serial, item_id int, name varchar(10), item_group int) ตอนนี้ผมต้องการที่จะแทรกแถวเป็นจากitems_ver itemsมีไวยากรณ์ SQL สั้น ๆ ในการทำเช่นนี้หรือไม่? ฉันได้ลองกับ: INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item_id = 2); แต่ฉันได้รับข้อผิดพลาดทางไวยากรณ์: ERROR: syntax error at or near "select" LINE 1: INSERT INTO items_ver VALUES (SELECT * …
198 postgresql  insert 

3
ฉันจะแทรกแถวซึ่งมีรหัสต่างประเทศได้อย่างไร
ใช้ PostgreSQL v9.1 ฉันมีตารางต่อไปนี้: CREATE TABLE foo ( id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY, type VARCHAR(60) NOT NULL UNIQUE ); CREATE TABLE bar ( id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY, description VARCHAR(40) NOT NULL UNIQUE, foo_id BIGINT NOT NULL REFERENCES foo ON DELETE RESTRICT ); สมมติว่าตารางแรกfooมีข้อมูลประชากรเช่นนี้: INSERT INTO …

2
ตัวเลือกใดมีประสิทธิภาพมากกว่า: เลือกจากเซิร์ฟเวอร์ที่เชื่อมโยงหรือแทรกลงในเซิร์ฟเวอร์ที่เชื่อมโยง
สมมติว่าฉันต้องส่งออกข้อมูลจากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์อื่น (ผ่านเซิร์ฟเวอร์ที่เชื่อมโยง) ข้อความใดจะมีประสิทธิภาพมากขึ้น การดำเนินการในเซิร์ฟเวอร์ต้นทาง: INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table] SELECT a, b, c, ... FROM [dbo].Udf_GetExportData() หรือดำเนินการในเซิร์ฟเวอร์เป้าหมาย: INSERT INTO [dbo].[Table] SELECT a, b, c, ... FROM OPENQUERY([OriginLinkedServer], 'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()') อันไหนจะเร็วกว่าและใช้ทรัพยากรน้อยลง (ทั้งเซิร์ฟเวอร์ต้นทางและเซิร์ฟเวอร์เป้าหมาย) เซิร์ฟเวอร์ทั้งสองเป็น SQL Server 2005

4
ฉันจะบอกได้อย่างไรว่าทำไมการแทรกในตารางที่กำหนดจึงช้า
ฉันรู้ว่า INSERT ในตาราง SQL อาจช้าด้วยเหตุผลหลายประการ: การมีอยู่ของ INSERT TRIGGERs บนโต๊ะ ข้อ จำกัด ที่บังคับใช้จำนวนมากที่ต้องตรวจสอบ (โดยปกติคือกุญแจต่างประเทศ) หน้าแยกในดัชนีคลัสเตอร์เมื่อแถวถูกแทรกในกลางตาราง การอัพเดตดัชนีที่ไม่ใช่คลัสเตอร์ทั้งหมดที่เกี่ยวข้อง การบล็อกจากกิจกรรมอื่น ๆ บนโต๊ะ เวลาตอบสนองการเขียน IO แย่ ... ทุกอย่างที่ฉันพลาดไป? ฉันจะรู้ได้อย่างไรว่าตัวไหนมีความรับผิดชอบในกรณีเฉพาะของฉัน? ฉันจะวัดผลกระทบของการแยกหน้าเทียบกับการปรับปรุงดัชนีที่ไม่ทำคลัสเตอร์กับทุกอย่างได้อย่างไร ฉันมี proc ที่เก็บไว้ซึ่งแทรกประมาณ 10,000 แถวต่อครั้ง (จากตารางชั่วคราว) ซึ่งใช้เวลาประมาณ 90 วินาทีต่อแถว 10k นั่นเป็นสิ่งที่ยอมรับไม่ได้ช้าเพราะจะทำให้เกิดการหมดเวลาอื่น ๆ ฉันได้ดูแผนการดำเนินการและฉันเห็นงาน INSERT CLUSTERED INDEX และ INDEX SEEKS ทั้งหมดจากการค้นหา FK แต่ก็ยังไม่ได้บอกฉันว่าทำไมมันถึงใช้เวลานาน ไม่มีทริกเกอร์ แต่ตารางมี FKeys …

3
INSERT ที่มีประสิทธิภาพเข้าสู่ตารางที่มีดัชนีเป็นกลุ่ม
ฉันมีคำสั่ง SQL ที่แทรกแถวลงในตารางที่มีดัชนีคลัสเตอร์ในคอลัมน์ TRACKING_NUMBER เช่น: INSERT INTO TABL_NAME (TRACKING_NUMBER, COLB, COLC) SELECT TRACKING_NUMBER, COL_B, COL_C FROM STAGING_TABLE คำถามของฉันคือ - มันช่วยในการใช้คำสั่งย่อย ORDER BY ในคำสั่ง SELECT สำหรับคอลัมน์ดัชนีคลัสเตอร์หรือไม่หรือการได้รับผลประโยชน์ใด ๆ จะได้รับผลกระทบจากการเรียงลำดับพิเศษที่จำเป็นสำหรับคำสั่ง ORDER BY?

2
วิธีที่เร็วที่สุดในการแทรกแถวจำนวนมากคืออะไร?
ฉันมีฐานข้อมูลที่ฉันโหลดไฟล์ลงในตารางการแสดงละครจากตารางการแสดงนี้ฉันมี 1-2 ร่วมเพื่อแก้ไขคีย์ต่างประเทศแล้วใส่แถวนี้ลงในตารางสุดท้าย (ซึ่งมีหนึ่งพาร์ติชันต่อเดือน) ฉันมีข้อมูลประมาณ 3.4 พันล้านแถวสำหรับสามเดือน วิธีที่เร็วที่สุดในการดึงแถวเหล่านี้จากการจัดเตรียมลงในตารางสุดท้ายคืออะไร SSIS Data Flow Task (ที่ใช้มุมมองเป็นแหล่งที่มาและมีการโหลดที่ใช้งานอย่างรวดเร็ว) หรือคำสั่งแทรกลงใน SELECT ... ฉันลอง Data Flow Task และสามารถรับประมาณ 1 พันล้านแถวในเวลาประมาณ 5 ชั่วโมง (8 cores / 192 GB RAM บนเซิร์ฟเวอร์) ซึ่งรู้สึกช้ามากสำหรับฉัน

1
แทรกด้วย OUTPUT ที่สัมพันธ์กับตารางคิวรีย่อย
ฉันกำลังแก้ไขโครงสร้างของฐานข้อมูล เนื้อหาหลายคอลัมน์ของตารางสถาบันการเงินจะต้องมีการโอนเข้ามาในตารางบุคคล FinancialInstitution เชื่อมโยงกับบุคคลที่มีคีย์ต่างประเทศ FinancialInstitution แต่ละรายการต้องการรหัสของบุคคลที่เกี่ยวข้อง ดังนั้นสำหรับแต่ละบรรทัดใหม่ที่แทรกใน Person ID ของบรรทัดใหม่นี้ (IDENTITY) จะต้องถูกคัดลอกกลับไปยังบรรทัดที่เกี่ยวข้องของ FinancialInstit วิธีที่ชัดเจนในการทำเช่นนี้คือรหัส T-SQL ซ้ำ ๆ แต่ฉันสนใจที่จะรู้ว่ามันเป็นไปได้ที่จะทำเฉพาะกับการดำเนินการตามชุด ฉันจินตนาการถึงระดับภายในของคำขอดังกล่าวจะเป็นเช่น: INSERT INTO Person (Street1, Number1, City1, State1, PostCode1, CountryId1, WorkDirectPhone1, Fax1, Email1) OUTPUT inserted.Id, FinancialInstitution.Id SELECT Id, Street, Number, City, [State], PostCode, CountryId, PhoneNumber, Fax, Email FROM FinancialInstitution; น่าเสียดายที่ดูเหมือนว่า OUTPUT จะไม่สามารถมีความสัมพันธ์แบบนั้น …

4
วิธี จำกัด จำนวนแถวสูงสุดในตารางให้เหลือเพียง 1
ฉันมีตารางการกำหนดค่าในฐานข้อมูล SQL Server ของฉันและตารางนี้ควรมีแถวเดียวเท่านั้น เพื่อช่วยให้นักพัฒนาในอนาคตเข้าใจสิ่งนี้ฉันต้องการป้องกันไม่ให้มีการเพิ่มข้อมูลมากกว่าหนึ่งแถว ฉันเลือกที่จะใช้ทริกเกอร์สำหรับสิ่งนี้ดังนี้ ... ALTER TRIGGER OnlyOneConfigRow ON [dbo].[Configuration] INSTEAD OF INSERT AS BEGIN DECLARE @HasZeroRows BIT; SELECT @HasZeroRows = CASE WHEN COUNT (Id) = 0 THEN 1 ELSE 0 END FROM [dbo].[Configuration]; IF EXISTS(SELECT [Id] FROM inserted) AND @HasZeroRows = 0 BEGIN RAISERROR ('You should not …

1
จะปลอดภัยหรือไม่ที่จะพึ่งพาคำสั่งของส่วนคำสั่งเอาท์พุทของ INSERT?
รับตารางนี้: CREATE TABLE dbo.Target ( TargetId int identity(1, 1) NOT NULL, Color varchar(20) NOT NULL, Action varchar(10) NOT NULL, -- of course this should be normalized Code int NOT NULL, CONSTRAINT PK_Target PRIMARY KEY CLUSTERED (TargetId) ); ในสองสถานการณ์ที่แตกต่างกันเล็กน้อยฉันต้องการแทรกแถวและคืนค่าจากคอลัมน์ข้อมูลประจำตัว สถานการณ์ 1 INSERT dbo.Target (Color, Action, Code) OUTPUT inserted.TargetId SELECT t.Color, t.Action, …

2
Postgres รักษาลำดับการแทรกของระเบียนหรือไม่
ตัวอย่างเช่นเมื่อฉันใช้การสืบค้นซึ่งจะส่งกลับรหัสบันทึก INSERT INTO projects(name) VALUES (name1), (name2), (name3) returning id; ซึ่งผลิตผลผลิต: 1 2 3 รหัสนี้จะชี้ไปที่ค่าแทรกที่สอดคล้องกันหรือไม่ 1 -> name1 2 -> name2 3 -> name3

1
INSERT แบบแถวเดียว…เลือกช้ากว่าการเลือกแบบแยก
รับตารางฮีปต่อไปนี้ด้วย 400 แถวหมายเลขตั้งแต่ 1 ถึง 400: DROP TABLE IF EXISTS dbo.N; GO SELECT SV.number INTO dbo.N FROM master.dbo.spt_values AS SV WHERE SV.[type] = N'P' AND SV.number BETWEEN 1 AND 400; และการตั้งค่าต่อไปนี้: SET NOCOUNT ON; SET STATISTICS IO, TIME OFF; SET STATISTICS XML OFF; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; ต่อไปนี้SELECTเสร็จสมบูรณ์คำสั่งในรอบ6 …

2
พื้นที่ดิสก์เต็มในระหว่างการแทรกเกิดอะไรขึ้น
วันนี้ฉันค้นพบฮาร์ดไดรฟ์ที่เก็บฐานข้อมูลของฉันเต็ม สิ่งนี้เคยเกิดขึ้นมาก่อนโดยปกติสาเหตุจะชัดเจนมาก มักจะมีแบบสอบถามที่ไม่ดีซึ่งทำให้เกิดการรั่วไหลขนาดใหญ่เพื่อ tempdb ซึ่งเติบโตขึ้นจนดิสก์เต็ม คราวนี้มันเห็นได้ชัดน้อยลงว่าเกิดอะไรขึ้นเนื่องจาก tempdb ไม่ได้เป็นสาเหตุของไดรฟ์เต็มรูปแบบมันเป็นฐานข้อมูลของตัวเอง ข้อเท็จจริง: ขนาดฐานข้อมูลปกติประมาณ 55 GB เพิ่มขึ้นเป็น 605 GB ไฟล์บันทึกมีขนาดปกติและมีขนาดใหญ่มาก Datafile มีพื้นที่ว่าง 85% (ฉันตีความว่าเป็น 'อากาศ': พื้นที่ที่ใช้ แต่ได้รับการปล่อยให้ว่างแล้ว SQL Server จะสำรองพื้นที่ทั้งหมดเมื่อจัดสรรแล้ว) ขนาด Tempdb เป็นปกติ ฉันได้พบสาเหตุที่น่าจะเป็น; มีหนึ่งแบบสอบถามที่เลือกแถวมากเกินไป (การรวมที่ไม่ดีทำให้เกิดการเลือก 11 พันล้านแถวซึ่งคาดว่าสองแสนคน) นี่คือSELECT INTOแบบสอบถามซึ่งทำให้ฉันสงสัยว่าสถานการณ์ต่อไปนี้อาจเกิดขึ้น: SELECT INTO ถูกใช้งาน สร้างตารางเป้าหมายแล้ว ข้อมูลถูกแทรกขณะที่ถูกเลือก ดิสก์เต็มทำให้การแทรกล้มเหลว SELECT INTO ถูกยกเลิกและย้อนกลับ การย้อนกลับเพิ่มพื้นที่ว่าง (ข้อมูลที่แทรกไว้แล้วจะถูกลบ) แต่ SQL Server …

2
การใช้คอลัมน์แหล่งที่มาในส่วนคำสั่ง OUTPUT INTO ของคำสั่ง INSERT (SQL Server)
ฉันกำลังเขียนคำสั่งแทรกการประมวลผลแบบแบทช์และต้องการใช้ตาราง temp เพื่อติดตาม ID ที่ถูกแทรกแทนการวนลูปผ่านไอเท็มด้วยตัวเองและเรียก SCOPE_IDENTITY () สำหรับแต่ละแถวที่แทรก ข้อมูลที่ต้องถูกแทรกมี (ชั่วคราว) ของ ID ที่เชื่อมโยงไปยังข้อมูลอื่นที่ควรถูกแทรกลงในตารางอื่นดังนั้นฉันต้องการอ้างอิงไขว้ของรหัสจริงและรหัสชั่วคราว นี่คือตัวอย่างของสิ่งที่ฉันมี: -- The existing table DECLARE @MyTable TABLE (ID INT IDENTITY(1,1), [Name] NVARCHAR(MAX)); -- My data I want to insert DECLARE @MyInsertData TABLE (ID INT, [Name] NVARCHAR(MAX)); INSERT INTO @MyInsertData ( ID,Name) VALUES ( -1 , 'bla'),(-2,'test'),(-3,'last'); …

1
ประโยชน์ของการใช้ WITH TABLOCK บน INSERT
ในบางกรณีการทำINSERT INTO <tablename> (WITH TABLOCK)จะเร็วขึ้นเนื่องจากการบันทึกขั้นต่ำ สถานการณ์เหล่านั้นรวมถึงการมีฐานข้อมูลในBULK_LOGGEDรูปแบบการกู้คืน มีประโยชน์ด้านประสิทธิภาพที่เป็นไปได้อื่น ๆ ที่จะใช้WITH TABLOCKในINSERTตารางว่างเปล่าเมื่อฐานข้อมูล ( tempdb ) กำลังใช้SIMPLEโมเดลการกู้คืนหรือไม่? ฉันทำงานกับ SQL Server 2012 Standard Edition กรณีการใช้งานของฉันใช้สำหรับการสร้างและจากนั้นสร้างตารางชั่วคราวภายในโพรซีเดอร์ที่เก็บไว้โดยใช้INSERT...SELECT, ซึ่งอาจมีแถวได้มากถึงสองสามล้านแถว ฉันพยายามหลีกเลี่ยงการใช้tempdb ในทางที่ผิด แต่บางครั้งก็จำเป็น TABLOCKฉันพยายามที่จะสร้างกรณีที่จะต้องใช้ ดูเหมือนว่ามันจะไม่ทำร้ายอะไรและอาจมีประโยชน์ ฉันพยายามที่จะคิดออกว่ามีประโยชน์พอที่จะเพิ่มได้ทุกที่ในฐานรหัสของเราหรือไม่ซึ่งฉันแน่ใจว่าไม่มีกระบวนการอื่นที่ต้องการเขียนลงในตาราง ฉันมักจะแทรกลงในตารางชั่วคราวที่สร้างขึ้นใหม่ด้วย PK แบบคลัสเตอร์ แต่บางครั้งก็ใช้กอง

3
คัดลอกจากตาราง MySQL หนึ่งไปยังอีกตาราง MySQL ของฐานข้อมูลเดียวกัน
ฉันมีประมาณ 40 ล้านแถวในตาราง MySQL และฉันต้องการคัดลอกตารางนี้ไปยังตารางอื่นในฐานข้อมูลเดียวกัน วิธีที่มีประสิทธิภาพที่สุดในการทำเช่นนี้คืออะไร? ใช้เวลานานเท่าไร (ประมาณ)

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