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

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

2
เคียวรีที่มีประสิทธิภาพเพื่อรับค่าสูงสุดต่อกลุ่มจากตารางขนาดใหญ่
รับตาราง: Column | Type id | integer latitude | numeric(9,6) longitude | numeric(9,6) speed | integer equipment_id | integer created_at | timestamp without time zone Indexes: "geoposition_records_pkey" PRIMARY KEY, btree (id) ตารางมี 20 ล้านบันทึกที่ไม่ได้พูดค่อนข้างมาก แต่มันทำให้การสแกนตามลำดับช้าลง ฉันจะได้รับบันทึกสุดท้ายmax(created_at)ของแต่ละรายการได้equipment_idอย่างไร ฉันได้ลองค้นหาทั้งสองข้อต่อไปนี้โดยมีหลายรุ่นที่ฉันได้อ่านจากคำตอบของหัวข้อนี้: select max(created_at),equipment_id from geoposition_records group by equipment_id; select distinct on (equipment_id) equipment_id,created_at from …

5
แบ่งปันลำดับคีย์หลักเดียวข้ามฐานข้อมูลหรือไม่
เป็นวิธีปฏิบัติที่ยอมรับได้หรือไม่ในการใช้ลำดับเดียวเป็นคีย์หลักในทุกตาราง (แทนที่จะเป็นคีย์หลักที่มีลักษณะเฉพาะสำหรับตารางที่กำหนด ถ้าเป็นเช่นนั้นจะเป็นการดีกว่าการใช้ลำดับคีย์หลักเดียวในตาราง ฉันเป็นผู้พัฒนาซอฟต์แวร์รุ่นเยาว์ไม่ใช่ DBA ดังนั้นฉันยังคงเรียนรู้พื้นฐานการออกแบบฐานข้อมูลที่ดีมากมาย แก้ไข: ในกรณีที่มีใครสงสัยฉันเพิ่งอ่านบทวิจารณ์ของการออกแบบฐานข้อมูลโดยหนึ่งใน DBA ของ บริษัท ของเราซึ่งกล่าวว่าเป็นปัญหาที่การออกแบบไม่ได้ใช้คีย์หลักเดียวในฐานข้อมูลทั้งหมดซึ่งฟังดูแตกต่างจากสิ่งที่ ฉันเรียนมาแล้ว แก้ไข 2: เพื่อตอบคำถามในความคิดเห็นนี่สำหรับ Oracle 11g แต่ฉันสงสัยในระดับที่ไม่ใช่ฐานข้อมูล หากคำถามนี้ขึ้นอยู่กับฐานข้อมูลฉันจะสนใจที่จะรู้ว่าทำไม แต่ในกรณีเช่นนี้ฉันจะหาคำตอบเฉพาะสำหรับ Oracle

1
SQL Server การจำลองแบบหลายต่อหนึ่ง
ฉันมีเครื่อง SQL Server 2008 R2 8 เครื่องแต่ละเครื่องแต่ละเครื่องโฮสต์ 1 ฐานข้อมูล แต่ละฐานข้อมูลมีโครงสร้างตารางที่เหมือนกันและสคีมาและข้อมูลที่ไม่ซ้ำทั้งหมด ฉันต้องการสร้างเซิร์ฟเวอร์การรายงาน (อาจเป็น 2008 หรือ 2012) ซึ่งรวมแถวจากตารางที่เลือกไว้ใน 8 เซิร์ฟเวอร์ต้นทางเป็นอินสแตนซ์เดียวของตารางเหล่านั้นบนเซิร์ฟเวอร์รายงาน นี่คือการจำลองแบบทางเดียว (จะไม่มีการเปลี่ยนแปลงกับเซิร์ฟเวอร์การรายงาน) ฉันจะต้องทำซ้ำการเปลี่ยนแปลงจากฐานข้อมูลต้นทางที่มีเวลาแฝงค่อนข้างต่ำ (ประมาณ 20-30 วินาที) นอกจากนี้ฉันต้องการค้นหาวิธีการเพื่อให้บรรลุผลนี้โดยมีผลกระทบเพียงเล็กน้อยต่อเซิร์ฟเวอร์ต้นทางตามจริง เอเจนต์บุคคลที่สามทริกเกอร์หรือสคีมา mods ไปยังเซิร์ฟเวอร์เหล่านั้นยากในสภาพแวดล้อมของฉัน คำถามของฉัน: สถาปัตยกรรมและเทคโนโลยีที่มีแนวโน้มในการบรรลุเป้าหมายนี้คืออะไร ฉันดู SQL Server Merge Replication แต่ฉันกังวลเรื่องเวลาในการตอบสนอง นี่เป็นเทคโนโลยีที่เหมาะสมสำหรับเป้าหมายนี้หรือไม่? มีสถาปัตยกรรมแบบหนึ่งต่อหนึ่งสำหรับการจำลองแบบของทรานแซคชันหรือไม่? ฉันควรดูการจำลองแบบ 1 ต่อ 1 เป็น 8 ฐานข้อมูลบนเซิร์ฟเวอร์การรายงานของฉันแล้วตามด้วยฟังก์ชันการผสานแบบกำหนดเอง (การจำลองแบบ 2 ขั้นตอน) ขอบคุณ John

5
บังคับให้ SQL Server รันเงื่อนไขการสืบค้นตามที่เขียนไว้หรือไม่
ฉันใช้ SQL Server 2008 R2 และฉันมีแบบสอบถามหลอก (SP) นี้: select ... from ... WHERE @LinkMode IS NULL AND (myColumn IN (...very long-running query...)) ... ... ปัญหาคือว่าแบบสอบถามใช้เวลานานมากในการดำเนินการ - แม้ว่าผมจะดำเนินการ SP @LinkMode=2ด้วย ดังที่คุณสังเกตเห็นเคียวรีที่รันนานควรถูกเรียกใช้งานต่อเมื่อ @LinkMode เป็นโมฆะซึ่งไม่ใช่กรณีที่นี่ ในกรณีของฉัน @LinkMode = 2! อย่างไรก็ตามหากฉันเปลี่ยนเป็น: select ... from ... WHERE 1=2 AND (myColumn IN (...very long time exeted …

4
คิวรีการบันทึกและ T-SQL อื่น ๆ
ฉันต้องการทราบว่า SQL Server 2008 R2 มีรูปแบบการบันทึกเริ่มต้นสำหรับSELECTคำสั่ง (หรือ T-SQL อื่น ๆ สำหรับเรื่องนั้น) ถ้าใช่ฉันจะดูได้ที่ไหน หากไม่มีฉันจะตั้งค่าได้อย่างไร

6
ปิดการใช้งานหน่วยความจำ SQL โดยบังเอิญต่ำเกินไปที่จะเข้าสู่ระบบฉันจะแก้ไขได้อย่างไร
ฉันปิดหน่วยความจำสูงสุดของอินสแตนซ์ SQL Server ของฉันเป็น 15 MB ... ตอนนี้ฉันไม่สามารถเข้าสู่ระบบเพื่อเพิ่มมันได้ ฉันจะเพิ่มหน่วยความจำสูงสุดโดยไม่ต้องเข้าสู่ระบบได้อย่างไร เวอร์ชันคือ SQL 2008 R2

2
เปอร์เซ็นต์ค่าใช้จ่ายใน SQL Server นี้วางแผนมากกว่า 100% ด้วยเหตุผลที่ถูกต้องหรือไม่?
ฉันกำลังมองผ่านแคชแผนมองหาผลไม้เพิ่มประสิทธิภาพที่แขวนต่ำและพบกับตัวอย่างนี้: ทำไมต้นทุนหลายรายการที่แสดงไว้สูงกว่า 100% ไม่ควรที่จะเป็นไปไม่ได้?

3
กุญแจต่างประเทศ - ลิงค์ใช้ตัวแทนเสมือนหรือกุญแจธรรมชาติ?
มีวิธีปฏิบัติที่ดีที่สุดหรือไม่ว่าคีย์ต่างประเทศระหว่างตารางควรเชื่อมโยงกับคีย์ธรรมชาติหรือคีย์ตัวแทน? การสนทนาเดียวที่ฉันพบ (ยกเว้น google-fu ของฉัน) คือคำตอบของแจ็คดักลาสในคำถามนี้และเหตุผลของเขาดูเหมือนจะฟังฉัน ฉันตระหนักถึงการอภิปรายเกินกว่าที่กฎจะเปลี่ยนแปลง แต่นี่จะเป็นสิ่งที่ต้องพิจารณาในทุกสถานการณ์ เหตุผลหลักในการถามคือฉันมีแอปพลิเคชั่นรุ่นเก่าที่ใช้ประโยชน์จาก FKs ด้วยปุ่มธรรมชาติ แต่มีแรงผลักดันจาก devlopers ที่จะย้ายไปยัง OR / M (NHibernate ในกรณีของเรา) และส้อมได้สร้างบางอย่างแล้ว ทำลายการเปลี่ยนแปลงดังนั้นฉันจึงกำลังมองหาที่จะผลักพวกเขากลับมาในการติดตามโดยใช้คีย์ธรรมชาติหรือย้ายแอปรุ่นเก่าเพื่อใช้คีย์ตัวแทนสำหรับ FK ไส้ของฉันบอกว่าจะคืนค่า FK ดั้งเดิม แต่ฉันก็ไม่แน่ใจว่านี่เป็นเส้นทางที่ถูกต้องจริงๆหรือไม่ ตารางส่วนใหญ่ของเรามีทั้งคีย์ตัวแทนและคีย์ธรรมชาติที่กำหนดไว้แล้ว (แม้ว่าจะมีข้อ จำกัด ที่ไม่ซ้ำกันและ PK) ดังนั้นการเพิ่มคอลัมน์เพิ่มเติมจึงไม่ใช่ประเด็นสำหรับเราในเรื่องนี้ เรากำลังใช้ SQL Server 2008 แต่ฉันหวังว่านี่จะเพียงพอสำหรับฐานข้อมูลใด ๆ

5
ข้อผิดพลาดเซิร์ฟเวอร์ที่เชื่อมโยงไม่ถูกจับโดย TRY-CATCH
ฉันกำลังตั้งค่างานเพื่อวนรอบรายการเซิร์ฟเวอร์ที่เชื่อมโยงและดำเนินการแบบสอบถามเฉพาะกับแต่ละรายการ ฉันพยายามที่จะดำเนินการค้นหาภายในบล็อก TRY-CATCH ดังนั้นหากมีปัญหากับเซิร์ฟเวอร์หนึ่งฉันสามารถเข้าสู่ระบบ แต่แล้วดำเนินการกับเซิร์ฟเวอร์อื่น ๆ แบบสอบถามที่ฉันกำลังดำเนินการภายในลูปมีลักษณะดังนี้: BEGIN TRY SELECT * FROM OPENQUERY([server1], 'SELECT 1 AS c;'); END TRY BEGIN CATCH SELECT ERROR_NUMBER(), ERROR_MESSAGE(); END CATCH; PRINT 'We got past the Catch block!'; หากมีปัญหาในการเชื่อมต่อกับเซิร์ฟเวอร์รหัสจะล้มเหลวทันทีและไม่ได้ถ่ายโอนไปยังCATCHบล็อก หากเซิร์ฟเวอร์เชื่อมต่อ แต่มีข้อผิดพลาดในแบบสอบถามจริงเช่นหารด้วยศูนย์จะมีการตรวจจับสิ่งนี้ตามที่คาดไว้โดยCATCHบล็อก ตัวอย่างเช่นฉันสร้างเซิร์ฟเวอร์ที่เชื่อมโยงกับชื่อที่ฉันรู้ว่าไม่มีอยู่ เมื่อดำเนินการข้างต้นฉันเพิ่งได้รับ: OLE DB provider "SQLNCLI" for linked server "nonserver" returned message "Login timeout …

4
วิธีสร้างแบบจำลองการสืบทอดของสองตาราง MySQL
ฉันมีตารางบางส่วนที่ฉันเก็บข้อมูลและขึ้นอยู่กับประเภทของบุคคล (คนงานพลเรือน) ที่ทำงานฉันต้องการเก็บไว้ในeventตารางตอนนี้พวกเหล่านี้ช่วยสัตว์ (มีanimalโต๊ะ) ในที่สุดฉันต้องการโต๊ะเพื่อเก็บเหตุการณ์ที่ผู้ชาย (คนงานพลเรือน) ช่วยชีวิตสัตว์ แต่ฉันควรเพิ่มกุญแจต่างประเทศหรือคำนับให้รู้ถึงidคุณค่าของพลเรือนหรือคนงานที่ทำงานนั้นหรือไม่? ตอนนี้ในการออกแบบนี้ฉันไม่ทราบวิธีการที่เกี่ยวข้องกับคนที่ทำงานถ้าฉันจะมีเพียงคนชนิด (พลเรือนหรือพลเรือน) ฉันจะเก็บcivil_idหุบเขาไว้ในpersonคอลัมน์ในตารางสุดท้ายนี้ แต่วิธีการ รู้ว่ามันเป็นทางแพ่งหรือคนงานฉันต้องการโต๊ะ "กลาง" อื่น ๆ หรือไม่? จะสะท้อนการออกแบบไดอะแกรมต่อไปนี้ใน MySQL ได้อย่างไร? รายละเอียดเพิ่มเติม ฉันสร้างแบบจำลองด้วยวิธีต่อไปนี้: DROP TABLE IF EXISTS `tbl_animal`; CREATE TABLE `tbl_animal` ( id_animal INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(25) NOT NULL DEFAULT "no name", specie VARCHAR(10) NOT NULL DEFAULT …


1
ให้สิทธิ์ในการเลือกจากตารางระบบ
ฉันมีฐานข้อมูล Microsoft SQL Server 2008 r2 ผู้ใช้ชื่อ marie ถูกกำหนดผู้ที่สามารถเข้าถึงตารางในฐานข้อมูลหลัก มันใช้งานได้ดี ตอนนี้ฉันต้องการให้ marie สามารถทำแบบสอบถามนี้ได้: SELECT resource_type,spid,login_time,status,hostname,program_name,nt_domain,nt_username,loginame FROM sys.dm_tran_locks dl JOIN sys.sysprocesses sp on dl.request_session_id = sp.spid ตารางที่เกี่ยวข้องคือตารางต้นแบบ ฉันจะอนุญาตให้ marie อ่านจากพวกเขาได้อย่างไร ฉันได้ลองดำเนินการดังต่อไปนี้เป็น dbo: GRANT ALL on sys.dm_tran_locks TO marie GRANT ALL on sys.sysprocesses TO marie ยังคงเมื่อ marie พยายามที่จะดำเนินการค้นหาข้างต้นข้อผิดพลาดคือ: Msg 297, Level 16, …
14 sql-server 

2
วิธีใช้ SUBSTRING โดยใช้ REGEXP ใน MySQL
ฉันมีสถานการณ์ต่อไปนี้ ฉันต้อง substring นิพจน์ปกติจากคำอธิบายการใช้ MySQL รายละเอียด: Lorem D9801 ipsum dolor sit amet ตำแหน่งที่ D9801 คือ REGEXP คำอธิบายข้อความที่แข็งแกร่งทุกข้อความมีเนื้อหาที่แตกต่างกัน แต่ regexp ของฉันควรมีลักษณะดังนี้: REGEXP 'D [[::]]] {4}' REGEXP มี "D" ที่จุดเริ่มต้นเสมอและ "xxxx" - 4 หลักที่ท้าย: Dxxxx ฉันรู้ว่า REGEXP จะส่งกลับเฉพาะค่าจริง / เท็จ แต่ฉันจะสร้างคิวรีเพื่อส่งคืนเฉพาะค่า 'D9801' ได้อย่างไร ฉันลองทำสิ่งนี้: SELECT SUBSTRING (description, LOCATE(REGEXP 'D[[:digit:]]{4}', description), 5) FROM …

1
ย้ายคีย์หลักไปยังกลุ่มไฟล์ (SQL Server 2012)
ฉันจะย้ายคีย์หลักแบบคลัสเตอร์ไปยังกลุ่มไฟล์ใหม่ได้อย่างไร ฉันได้พบ "อัลกอริทึม" ที่เป็นไปได้แล้ว แต่มันไม่มีประสิทธิภาพอย่างน่ากลัว: วางดัชนีที่ไม่ได้ทำคลัสเตอร์ (ต้องการให้สร้างใหม่และสร้างใหม่) ดร็อปดัชนีแบบคลัสเตอร์ (ต้องใช้ทั้งตารางเพื่อนำไปใช้) สร้างข้อ จำกัด คีย์หลักใหม่ (การดำเนินการเรียงลำดับขนาดใหญ่) สร้างดัชนีที่ไม่ทำคลัสเตอร์ทั้งหมด (จำเป็นต้องมีการเรียงลำดับและการเขียน) มีวิธีที่มีประสิทธิภาพมากกว่านี้ไหม? สิ่งนี้ไม่มีประสิทธิภาพอย่างน่ากลัวและใช้เวลานานเนื่องจากตารางมีขนาด 50GB บนเซิร์ฟเวอร์ที่อ่อนแอ ไม่มีวิธีที่จะข้ามสิ่งเหล่านี้ทั้งหมดและสร้างใหม่ในกลุ่มไฟล์ใหม่หรือไม่ ที่จะไม่ต้องเรียงลำดับข้อมูลใด ๆ

4
คิวรีช้าลงบนโต๊ะขนาดใหญ่ที่มี GROUP BY และ ORDER BY
ฉันมีตารางที่มี 7.2 ล้านสิ่งอันดับซึ่งมีลักษณะดังนี้: table public.methods column | type | attributes --------+-----------------------+---------------------------------------------------- id | integer | not null DEFAULT nextval('methodkey'::regclass) hash | character varying(32) | not null string | character varying | not null method | character varying | not null file | character varying | not null type | character …

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