ผู้ดูแลฐานข้อมูล

ถามตอบสำหรับผู้เชี่ยวชาญด้านฐานข้อมูลที่ต้องการพัฒนาทักษะฐานข้อมูลและเรียนรู้จากผู้อื่นในชุมชน

1
คีย์หลักหลายตัวใน PostgreSQL
ฉันมีตารางต่อไปนี้: CREATE TABLE word( word CHARACTER VARYING NOT NULL, id BIGINT NOT NULL, repeat INTEGER NOT NULL ); ALTER TABLE public.word OWNER TO postgres; ALTER TABLE ONLY word ADD CONSTRAINT "ID_PKEY" PRIMARY KEY (word,id); เมื่อฉันพยายามกู้คืนโดยใช้คำสั่งต่อไปนี้: psql -U postgres -h localhost -d word -f word.sql มันทำให้ฉันมีข้อผิดพลาดนี้: ไม่อนุญาตให้ใช้คีย์หลักหลายตัวสำหรับตาราง "คำ" ฉันจะใช้หลายคีย์หลักใน postgres ได้อย่างไร

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

3
จะเกิดอะไรขึ้นหากทั้งสองกระบวนการพยายามที่จะดูข้อมูลอ้างอิงใหม่อย่างต่อเนื่องในเวลาเดียวกัน
ตามเอกสาร: รีเฟรชมุมมองที่เป็นรูปธรรมอย่างไม่หยุดยั้งโดยไม่ล็อคออกพร้อมกันเลือกบนมุมมองที่ปรากฏ ( ... ) ... เนื้อหาอื่น ๆ ... แม้จะมีตัวเลือกนี้REFRESH ครั้งละหนึ่งอาจทำงานกับ มุมมองที่ปรากฏขึ้นใด ๆ ฉันมีฟังก์ชั่นที่ตรวจสอบเวลารีเฟรชครั้งล่าสุดสำหรับ VIEW MATERIALIZED และถ้าผ่านไป 60 วินาทีมันจะรีเฟรช อย่างไรก็ตามจะเกิดอะไรขึ้นหากฉันพยายามรีเฟรชมุมมองที่เป็นรูปธรรมจากกระบวนการที่แยกกันสองกระบวนการในเวลาเดียวกัน พวกเขาจะจัดคิวหรือจะเพิ่มข้อผิดพลาดหรือไม่ มีวิธีการตรวจจับหรือไม่เมื่อมุมมองแบบ MATERIALIZED กำลังถูกรีเฟรชและหลีกเลี่ยงการสัมผัส ขณะนี้ฉันได้ทำการเติมข้อมูลในตารางก่อนที่จะรีเฟรช (ตั้งค่าrefreshingเป็นtrue) จากนั้นตั้งค่าเป็นfalseเมื่อกระบวนการเสร็จสิ้น EXECUTE 'INSERT INTO refresh_status (last_update, refreshing) VALUES (clock_timestamp(), true) RETURNING id') INTO refresh_id; EXECUTE 'REFRESH MATERIALIZED VIEW CONCURRENTLY my_mat_view'; EXECUTE 'UPDATE refresh_status SET …

6
ระบบปฏิบัติการส่งคืนข้อผิดพลาด 21 (อุปกรณ์ไม่พร้อม)
ทุกครั้งที่ฉันรีบูท Windows สำหรับฐานข้อมูลบางอย่างฉันจะได้รับข้อผิดพลาดนี้: ระบบปฏิบัติการส่งคืนข้อผิดพลาด 21 (อุปกรณ์ไม่พร้อม) ฉันตรวจสอบดิสก์ด้วยchkdsk /r- ไม่มีเซกเตอร์เสีย ฉันดำเนินการDBCC CHECKDBโดยไม่มีข้อผิดพลาด: *(CHECKDB found 0 allocation errors and 0 consistency errors in database)* ถ้าฉันรีสตาร์ท SQL Server ข้อผิดพลาดจะหายไป Windows 10 และ SQL Server 2016 Express

1
เหตุใดข้อความค้นหาที่คล้ายกันเหล่านี้จึงใช้ขั้นตอนการเพิ่มประสิทธิภาพที่แตกต่างกัน (การประมวลผลธุรกรรมกับแผนด่วน)
รหัสตัวอย่างในรายการเชื่อมต่อนี้ แสดงข้อบกพร่องที่ SELECT COUNT(*) FROM dbo.my_splitter_1('2') L1 INNER JOIN dbo.my_splitter_1('') L2 ON L1.csv_item = L2.csv_item ส่งคืนผลลัพธ์ที่ถูกต้อง แต่ผลลัพธ์ต่อไปนี้จะส่งกลับผลลัพธ์ที่ไม่ถูกต้อง (เมื่อปี 2014 โดยใช้เครื่องมือประมาณการ Cardinality ใหม่) SELECT (SELECT COUNT(*) FROM dbo.my_splitter_1('2') L1 INNER JOIN dbo.my_splitter_1('') L2 ON L1.csv_item = L2.csv_item) เนื่องจากมันโหลดผลลัพธ์อย่างไม่ถูกต้องสำหรับ L2 ลงในสปูลนิพจน์ย่อยทั่วไปจากนั้นรีเพลย์ผลลัพธ์ของผลลัพธ์นั้นสำหรับผลลัพธ์ L1 ฉันอยากรู้ว่าทำไมความแตกต่างของพฤติกรรมระหว่างสองข้อความค้นหา Trace ธง 8675 แสดงให้เห็นว่าคนที่ทำงานเข้ามาและเป็นคนที่ไม่เข้าsearch(0) - transaction processingsearch(1) - quick …

3
ประโยชน์ที่ได้รับจากระดับธุรกรรมการแยกรายการ SET อ่านโดยไม่ได้รับอนุญาต
ฉันใช้SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDคำสั่ง SQL ทั่วไปของฉันส่วนใหญ่เพราะนี่เป็นการฝึกฝนให้ฉันเมื่อเริ่มเรียนรู้ภาษา จากความเข้าใจของฉันระดับแยกนี้ทำหน้าที่เช่นเดียวว่าแต่ฉันเท่านั้นที่เคยมีแนวโน้มที่จะใช้งานWITH (NO LOCK)SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED มีเคยเป็นเวลาที่ผมควรจะใช้มากกว่าWITH (NO LOCK)SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ไม่ SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDผู้ใช้อื่น ๆ หยุดจากการถูกล็อคออกจากตารางที่ฉันอ่าน? ถ้า SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDใช้เพื่อหยุดล็อค แต่ฉันแค่อ่านข้อมูลจุดประสงค์ในการใช้คืออะไร? มันเป็นเพียงระบบสืบค้นที่เข้มข้นที่จะสร้างล็อค? ควรใช้หรือไม่เมื่อเรียกใช้ข้อความค้นหาที่จะกลับมาพูดอีก 5-10 วินาที? ฉันได้รับแจ้งว่าห้ามใช้ SET TRANSACTION ISOLATION LEVEL …

2
อะไรคือจุดร้อนในบริบทของการเพิ่มไฟล์ไปยัง tempdb?
ฉันพยายามค้นหาว่าสามารถเพิ่มไฟล์ tempdb ลงใน SQL Server ได้หรือไม่โดยไม่ต้องเริ่มบริการ SQL Server อีกครั้ง ฉันเห็นคำตอบนี้ที่นี่ในผู้ดูแลฐานข้อมูล: Tempdb เพิ่มไฟล์ต้องมีการรีสตาร์ท และหนึ่งคำตอบระบุว่า: เพิ่ม - ไม่จำเป็นต้องหยุดทำงาน แม้ว่าฌอนจาก Microsoft ชี้ให้เห็นว่า SQL จะต้องการใช้ไฟล์ที่เติมด้านล่าง หากคุณไปจากไฟล์ข้อมูล 1 ไฟล์และเพิ่มมากขึ้นแล้ว SQL จะใช้ไฟล์ใหม่ชั่วครู่หนึ่ง แต่ประสิทธิภาพของคุณจะไม่แย่ไปกว่าการมีเพียงไฟล์เดียว อย่างไรก็ตามหากคุณมี 2+ แล้วและเพิ่มอีกหนึ่งมันจะฮอตสปอตในใหม่และลดประสิทธิภาพ อย่างไรก็ตามความคิดเห็นข้อควรระวังต่อไปนี้: ฉันจะใส่ภาคผนวกไว้ในส่วน "เพิ่ม": "เพิ่ม: ไม่ แต่คุณมักจะมีความไม่สมดุลดังนั้นคุณจะพบว่าร้อนแรงซึ่งอาจทำให้สิ่งต่าง ๆ แย่ลงมาก" ฉันมีคำถามต่อไปนี้เกี่ยวกับความคิดเห็นนั้น แต่ได้รับคำแนะนำให้ถามคำถามเหล่านั้นในคำถามใหม่ของฉันเอง (คำถามนี้) แทนที่จะถามผู้แสดงความคิดเห็นผ่านความคิดเห็นในคำตอบของคำถามนั้น โดยเฉพาะ: การจำที่ร้อนแรงคืออะไร (ฉันได้รับข้อมูลบางอย่างผ่านทาง Google แต่ไม่มีรายละเอียดว่าจะเกิดอะไรขึ้นกับฮอตสปอตบน tempdb หลังจากเพิ่มไฟล์) สิ่งที่เกี่ยวกับการจำร้อนทำให้สิ่งเลวร้ายยิ่งขึ้นใน …

4
คอลัมน์ Fast change NVARCHAR (4000) เป็น NVARCHAR (260)
ฉันมีปัญหาด้านประสิทธิภาพกับหน่วยความจำขนาดใหญ่มากที่จัดการตารางนี้ด้วยNVARCHAR(4000)คอลัมน์สองสามรายการ NVARCHAR(260)สิ่งที่เป็นคอลัมน์เหล่านี้ไม่เคยมีขนาดใหญ่กว่า การใช้ ALTER TABLE [table] ALTER COLUMN [col] NVARCHAR(260) NULL ผลใน SQL Server เขียนใหม่ทั้งตาราง (และใช้ขนาดตาราง 2x ในพื้นที่บันทึก) ซึ่งเป็นพันล้านแถวเท่านั้นที่จะเปลี่ยนแปลงอะไรไม่มีตัวเลือก การเพิ่มความกว้างของคอลัมน์ไม่มีปัญหานี้ แต่เป็นการลดลง ฉันได้ลองสร้างข้อ จำกัดCHECK (DATALENGTH([col]) <= 520)หรือCHECK (LEN([col]) <= 260)และ SQL Server ยังคงตัดสินใจที่จะเขียนตารางใหม่ทั้งหมด มีวิธีใดบ้างในการแก้ไขชนิดข้อมูลคอลัมน์เป็นการดำเนินการเฉพาะเมทาดาทา ไม่มีค่าใช้จ่ายในการเขียนใหม่ทั้งตาราง? ฉันใช้ SQL Server 2017 (14.0.2027.2 และ 14.0.3192.2) นี่คือตาราง DDL ตัวอย่างที่จะใช้ในการทำซ้ำ: CREATE TABLE [table]( id INT IDENTITY(1,1) …

3
เพิ่มคอลัมน์การเปลี่ยนแปลงความเร็วในตารางขนาดใหญ่เป็น NON NULL
ฉันเพิ่งเพิ่มคอลัมน์บิตแบบ NULL ไปยังตารางที่มีเกือบ 500 ล้านแถว ไม่มีค่าเริ่มต้นในคอลัมน์อย่างไรก็ตามส่วนแทรกทั้งหมดกำลังระบุค่าเป็น 0 หรือ 1 และฉันใช้รูทีนแบบครั้งเดียวเพื่อกำหนด 0 หรือ 1 ให้กับแถวที่มีอยู่ทั้งหมด (อัปเดตแถวเป็นชุดเล็ก ๆ ) ตอนนี้ทุกแถวควรมี 0 หรือ 1 ในคอลัมน์นั้น ฉันต้องการทำให้คอลัมน์บิตเป็นโมฆะไม่ได้ แต่เมื่อฉันพยายามทำมันผ่านALTER TABLE t1 ALTER COLUMN c1 bit not nullมันเริ่มทำงานเป็นเวลา 3 นาทีและฉันหยุดมันเพราะมันบล็อกการอ่านตารางทั้งหมดและฉันสงสัยว่ามันจะใช้เวลานานกว่าจะเสร็จสมบูรณ์ . เป็นไปได้ที่จะใช้เวลาไม่นาน แต่ฉันไม่สามารถเสี่ยงกับการขาดความพร้อมมากเกินไป การย้อนกลับใช้เวลา 6 นาที คุณมีคำแนะนำใด ๆ เกี่ยวกับวิธีที่ฉันจะทำให้คอลัมน์ไม่เป็นโมฆะโดยที่ไม่ต้องใช้เวลาหลายชั่วโมงกว่าจะเสร็จ นอกจากนี้ยังมีวิธีใดที่จะประมาณว่าALTER TABLE ALTER COLUMNคำสั่งที่ฉันเริ่มและยกเลิกจะใช้เวลานานเท่าใด ฉันใช้ SQL Server …

3
การค้นหาและการอัปเดตช้ามากหลังจากดัชนีเพิ่มประสิทธิภาพ
ฐานข้อมูล SQL Server 2017 Enterprise CU16 14.0.3076.1 เราเพิ่งพยายามเปลี่ยนจากดัชนีเริ่มต้นสร้างงานบำรุงรักษาไป Ola IndexOptimizeHallengren งานสร้างดัชนีเริ่มต้นใหม่ทำงานเป็นเวลาสองสามเดือนโดยไม่มีปัญหาใด ๆ และแบบสอบถามและการปรับปรุงกำลังทำงานด้วยเวลาดำเนินการที่ยอมรับได้ หลังจากทำงานIndexOptimizeบนฐานข้อมูล: EXECUTE dbo.IndexOptimize @Databases = 'USER_DATABASES', @FragmentationLow = NULL, @FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', @FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', @FragmentationLevel1 = 5, @FragmentationLevel2 = 30, @UpdateStatistics = 'ALL', @OnlyModifiedStatistics = 'Y' ประสิทธิภาพลดลงอย่างมาก คำสั่งการปรับปรุงที่ใช้เวลา 100 มิลลิวินาทีก่อนที่จะIndexOptimizeใช้เวลา 78.000ms หลังจากนั้น (โดยใช้แผนเหมือนกัน) และข้อความค้นหาก็มีประสิทธิภาพที่แย่กว่านั้นอีกหลายคำสั่ง เนื่องจากสิ่งนี้ยังคงเป็นฐานข้อมูลทดสอบ (เรากำลังย้ายระบบการผลิตจาก …

1
SQL Extended Events Session สำหรับการตรวจจับการชะงักงัน
มีวิธีในการเพิ่มขนาดของ<inputbuf>องค์ประกอบในการหยุดชะงัก XML ที่บันทึกโดยเซสชันเหตุการณ์ที่เพิ่มขึ้นของการหยุดชะงักหรือไม่? เราต้องการดูแบบสอบถามที่สมบูรณ์เพื่อช่วยระบุปัญหาในรหัสแอปพลิเคชัน ดูเหมือนว่าจะถูก จำกัด ที่ 1024 อักขระ +/- จะเพิ่มขึ้นได้ไหม ดูตัวอย่าง XML ด้านล่าง คุณจะเห็นว่าข้อความค้นหาใน<inputbuf>องค์ประกอบนั้นถูกตัดกลางรายการที่เลือก: <deadlock> <victim-list> <victimProcess id="processc9c0829848" /> </victim-list> <process-list> <process id="processc9c0829848" taskpriority="0" logused="0" waitresource="PAGE: 5:1:40600276 " waittime="696" ownerId="255115931225" transactionname="SELECT" lasttranstarted="2019-04-24T09:29:25.950" XDES="0xc8dfa8da40" lockMode="S" schedulerid="13" kpid="8480" status="suspended" spid="245" sbid="2" ecid="0" priority="0" trancount="0" lastbatchstarted="2019-04-24T09:29:25.950" lastbatchcompleted="2019-04-24T09:29:25.950" lastattention="1900-01-01T00:00:00.950" clientapp="EntityFramework" hostname="MSR-PRD-BDB02" hostpid="43440" loginname="IUSR_BuildDB" …

1
นี่เป็นอาการของเซิร์ฟเวอร์ที่โอเวอร์โหลดหรือไม่
ฉันพยายามวินิจฉัยช้าลงในแอปพลิเคชัน สำหรับสิ่งนี้ฉันได้บันทึกกิจกรรมเพิ่มเติมของ SQL Server แล้ว สำหรับคำถามนี้ฉันกำลังดูขั้นตอนการจัดเก็บเฉพาะอย่างใดอย่างหนึ่ง แต่มีชุดหลักของขั้นตอนการจัดเก็บโหลที่เท่ากันสามารถใช้เป็นการสอบสวนแอปเปิ้ลแอปเปิ้ล และเมื่อใดก็ตามที่ฉันเรียกใช้หนึ่งในกระบวนงานที่เก็บไว้ด้วยตนเองมันจะทำงานได้อย่างรวดเร็วเสมอ และหากผู้ใช้ลองอีกครั้งมันจะทำงานเร็ว เวลาดำเนินการของโพรซีเดอร์ที่เก็บแตกต่างกันไป การประมวลผลของโพรซีเดอร์ที่เก็บไว้นี้ส่งคืนเป็นจำนวนมากใน <1s: และสำหรับถัง"เร็ว"นั้นมันน้อยกว่า 1 วินาทีมาก จริง ๆ แล้วประมาณ 90 ms: แต่มีหางยาวของผู้ใช้ที่ต้องรอ 2 วินาที, 3 วินาที, 4s วินาที บางคนต้องรอ 12 วินาที, 13 วินาที, 14 วินาที จากนั้นก็มีวิญญาณที่น่าสงสารจริงๆที่ต้องรอ 22s, 23s, 24s และหลังจาก 30s, โปรแกรมไคลเอนต์ให้ขึ้นยกเลิกแบบสอบถามและผู้ใช้ต้องรอ30 วินาที สหสัมพันธ์เพื่อค้นหาสาเหตุ ดังนั้นฉันจึงพยายามที่จะมีความสัมพันธ์: ระยะเวลาและตรรกะอ่าน ระยะเวลาเทียบกับการอ่านทางกายภาพ ระยะเวลาเทียบกับเวลา cpu และดูเหมือนจะไม่มีความสัมพันธ์ใด ๆ …

1
เหตุใดกระแสรวมนี้จึงมีความจำเป็น
ลองดูคำถามนี้ มันค่อนข้างง่าย (ดูจุดสิ้นสุดของการโพสต์สำหรับคำจำกัดความของตารางและดัชนีและสคริปต์ที่ซ้ำกัน): SELECT MAX(Revision) FROM dbo.TheOneders WHERE Id = 1 AND 1 = (SELECT 1); หมายเหตุ: "AND 1 = (SELECT 1) เพียงเพื่อป้องกันไม่ให้มีการกำหนดพารามิเตอร์อัตโนมัติซึ่งฉันรู้สึกว่าสับสนปัญหา - จริง ๆ แล้วได้รับแผนเดียวกันโดยมีหรือไม่มีประโยคนั้นแม้ว่า และนี่คือแผน ( วางลิงก์แผน) : เนื่องจากมี "อันดับ 1" อยู่ที่นั่นฉันรู้สึกประหลาดใจที่เห็นผู้ดำเนินการรวมสตรีม ไม่จำเป็นสำหรับฉันเนื่องจากมีการรับประกันว่าจะมีแถวเดียวเท่านั้น เพื่อทดสอบทฤษฎีนั้นฉันลองใช้เคียวรีที่มีเหตุผลเชิงตรรกะนี้: SELECT MAX(Revision) FROM dbo.TheOneders WHERE Id = 1 GROUP BY Id; นี่คือแผนสำหรับแผนนั้น ( …

3
เหตุใดจึงต้องใช้ master เพื่อสร้างฐานข้อมูล
ฉันมีคำถามสั้น ๆ เหตุใดฉันจึงใช้use master;เพื่อสร้างฐานข้อมูล นี่คือตัวอย่างจากเอกสารของ Microsoft USE master ; GO CREATE DATABASE Sales ON ( NAME = Sales_dat, FILENAME = 'C:\Program Files\...\saledat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = Sales_log, FILENAME = 'C:\Program Files\...\salelog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = …

3
ความท้าทายในการค้นหา: การสร้างถังขนาดใหญ่ขึ้นอยู่กับการวัดที่ไม่นับจำนวนแถว
ฉันจะอธิบายปัญหาในแง่ของการโหลดรถบรรทุกจำนวนคงที่พร้อมคำสั่งเท่าที่จะทำได้ ปัจจัยการผลิต: @TruckCount - the number of empty trucks to fill ชุด: OrderId, OrderDetailId, OrderDetailSize, TruckId (initially null) Ordersประกอบด้วยหนึ่งหรือมากกว่าOrderDetailsนั้น ความท้าทายที่นี่คือการกำหนดให้TruckIdกับแต่ละระเบียน คำสั่งเดียวไม่สามารถแยกข้ามรถบรรทุกได้ รถบรรทุกควรจะเป็นอย่างเท่าเทียมกัน * sum(OrderDetailSize)โหลดเป็นไปได้ที่วัดโดย * สม่ำเสมอ: เดลต้าที่เล็กที่สุดที่ทำได้ระหว่างรถบรรทุกที่มีน้ำหนักน้อยที่สุดและรถบรรทุกที่โหลดมากที่สุด ตามคำจำกัดความนี้ 1,2,3 จะกระจายอย่างเท่าเทียมกันมากกว่า 1,1,4 ถ้ามันช่วยคุณแกล้งทำเป็นอัลกอริทึมสถิติสร้างฮิสโตแกรมความสูงได้ ไม่มีการพิจารณาน้ำหนักบรรทุกสูงสุด เหล่านี้เป็นรถบรรทุกยืดหยุ่นวิเศษ อย่างไรก็ตามจำนวนรถบรรทุกได้รับการแก้ไขแล้ว มีวิธีแก้ปัญหาที่ชัดเจนซึ่งซ้ำแล้วซ้ำอีก - โรบินกลมจัดสรรคำสั่งซื้อ แต่มันสามารถทำได้ตามตรรกะที่ตั้งไว้? ความสนใจหลักของฉันคือ SQL Server 2014 หรือใหม่กว่า แต่การตั้งค่าโซลูชันพื้นฐานสำหรับแพลตฟอร์มอื่น ๆ ก็น่าสนใจเช่นกัน นี่ให้ความรู้สึกเหมือนดินแดน Itzik Ben-Gan …

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