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

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

3
บังคับให้ Flow Distinct
ฉันมีโต๊ะแบบนี้: CREATE TABLE Updates ( UpdateId INT NOT NULL IDENTITY(1,1) PRIMARY KEY, ObjectId INT NOT NULL ) การติดตามการอัปเดตพื้นฐานไปยังวัตถุที่มี ID เพิ่มขึ้น ผู้ใช้บริการของตารางนี้จะเลือกรหัสวัตถุที่แตกต่างกัน 100 รายการเรียงลำดับตาม UpdateIdUpdateIdและเริ่มจากที่เฉพาะเจาะจง โดยพื้นฐานแล้วการติดตามจุดที่มันค้างไว้แล้วทำการสอบถามเพื่อรับการปรับปรุงใด ๆ ฉันพบสิ่งนี้เป็นปัญหาการปรับให้เหมาะสมที่น่าสนใจเพราะฉันสามารถสร้างแผนคิวรีที่เหมาะสมที่สุดโดยการเขียนคิวรีที่เกิดขึ้นกับสิ่งที่ฉันต้องการเนื่องจากดัชนี แต่ไม่รับประกันสิ่งที่ฉันต้องการ: SELECT DISTINCT TOP 100 ObjectId FROM Updates WHERE UpdateId > @fromUpdateId ที่ไหน @fromUpdateIdพารามิเตอร์กระบวนงานที่เก็บไว้ ด้วยแผนของ: SELECT <- TOP <- Hash match (flow distinct, …

2
เหตุใด TVP ต้องพร้อมใช้งานและทำไมพารามิเตอร์ประเภทอื่นไม่สามารถอ่านได้อย่างเดียว
ตามพารามิเตอร์บล็อกนี้สำหรับฟังก์ชั่นหรือขั้นตอนการจัดเก็บเป็นหลักผ่านตามมูลค่าถ้าพวกเขาไม่ได้OUTPUTพารามิเตอร์และถือว่าเป็นรุ่นที่ปลอดภัยกว่าของการอ้างอิงโดยใช้รหัสผ่านถ้าพวกเขาเป็นOUTPUTพารามิเตอร์ ในตอนแรกที่ผมคิดว่าเป้าหมายของการบังคับให้ TVP ที่จะได้รับการประกาศREADONLYเป็นอย่างชัดเจนส่งสัญญาณไปยังนักพัฒนาที่ TVP ไม่สามารถนำมาใช้เป็นOUTPUTพารามิเตอร์ แต่จะต้องมีมากขึ้นที่เกิดขึ้นเพราะเราไม่สามารถประกาศไม่ใช่ TVP READONLYเป็น ตัวอย่างเช่นล้มเหลว: create procedure [dbo].[test] @a int readonly as select @a ข่าวสารเกี่ยวกับ 346, ระดับ 15, สถานะ 1, การทดสอบขั้นตอน ไม่สามารถประกาศพารามิเตอร์ "@a" แบบเรียลไทม์ได้เนื่องจากไม่ใช่พารามิเตอร์ที่มีค่าเป็นตาราง เนื่องจากสถิติไม่ได้ถูกจัดเก็บใน TVP เหตุผลในการป้องกันการดำเนินงาน DML คืออะไร มันเกี่ยวข้องกับการไม่ต้องการให้ TVP เป็นOUTPUTพารามิเตอร์ด้วยเหตุผลบางอย่างหรือไม่?

2
เน้นการเรียงที่ละเอียดอ่อน
ทำไมทั้งสองSELECTคำสั่งจึงส่งผลให้เรียงลำดับที่แตกต่างกัน USE tempdb; CREATE TABLE dbo.OddSort ( id INT IDENTITY(1,1) PRIMARY KEY , col1 NVARCHAR(2) , col2 NVARCHAR(2) ); GO INSERT dbo.OddSort (col1, col2) VALUES (N'e', N'eA') , (N'é', N'éB') , (N'ë', N'ëC') , (N'è', N'èD') , (N'ê', N'êE') , (N'ē', N'ēF'); GO SELECT * FROM dbo.OddSort ORDER BY col1 …

2
มีบทลงโทษสำหรับการใช้ BINARY (16) แทนที่จะเป็น UNIQUEIDENTIFIER หรือไม่?
ฉันเพิ่งได้รับมรดกฐานข้อมูล SQL Server ที่ใช้BINARY(16)แทนUNIQUEIDENTIFIERการจัดเก็บ Guids มันทำสิ่งนี้สำหรับทุกสิ่งรวมถึงกุญแจหลัก ฉันควรจะกังวลหรือไม่

2
คำถามสัมภาษณ์ SQL
รับตาราง 'พนักงาน' employee_id | salary | department_id -------------+--------+--------------- การใช้ SQL ค้นหาตัวแปรทั้งหมดของการถ่ายโอนพนักงานจากแผนกหนึ่งไปอีกแผนกหนึ่งเท่านั้นดังนั้นเงินเดือนโดยเฉลี่ยในแผนก 'ออกเดินทาง' และ 'มาถึง' จึงเพิ่มขึ้น ป.ล. ฉันถูกถามคำถามเกี่ยวกับการสัมภาษณ์ซึ่งไม่เคยให้คำตอบและ Google มีความช่วยเหลือเล็กน้อย

2
LOB_DATA สแกนตารางช้าและคำถาม I / O บางข้อ
ฉันมีตารางที่ค่อนข้างใหญ่โดยหนึ่งในคอลัมน์เป็นข้อมูล XML และขนาดเฉลี่ยของรายการ XML อยู่ที่ประมาณ 15 กิโลไบต์ คอลัมน์อื่น ๆ ทั้งหมดเป็น ints ปกติ bigints GUIDs ฯลฯ หากต้องการมีตัวเลขที่เป็นรูปธรรมสมมติว่าตารางมีหนึ่งล้านแถวและมีขนาดประมาณ 15 GB สิ่งที่ฉันสังเกตคือตารางนี้ช้ามากในการเลือกข้อมูลจากถ้าฉันต้องการเลือกคอลัมน์ทั้งหมด เมื่อฉันทำ SELECT TOP 1000 * FROM TABLE ใช้เวลาประมาณ 20-25 วินาทีในการอ่านข้อมูลจากดิสก์ - แม้ว่าฉันจะไม่ได้กำหนดผลลัพธ์ไว้ก็ตาม ฉันเรียกใช้แบบสอบถามด้วยแคชเย็น (เช่นหลังจากDBCC DROPCLEANBUFFERS) นี่คือผลสถิติ IO: จำนวนการสแกน 1, อ่านโลจิคัล 364, อ่านฟิสิคัล 24 อ่านล่วงหน้าอ่าน 7191, ล็อบโลจิคัลอ่าน 7924, lob ฟิสิคัลอ่าน 1690, lob …

4
ปัญหาความสัมพันธ์ของเอนทิตี
ฉันมี 4 ตารางที่เกี่ยวข้องเช่นนี้ (เป็นตัวอย่าง): Company: ID Name CNPJ Department: ID Name Code ID_Company Classification: ID Name Code ID_Company Workers: Id Name Code ID_Classification ID_Department สมมติว่าผมมีกับclassification id = 20, id_company = 1และdepartmentที่มีid_company = 2(ที่แสดงถึง บริษัท อื่น) สิ่งนี้จะทำให้เกิดการสร้างคนงานที่มาจากสอง บริษัท เนื่องจากการจำแนกประเภทและแผนกเชื่อมโยงกับ บริษัท แยกกัน ฉันไม่ต้องการที่จะเกิดขึ้นดังนั้นฉันคิดว่าฉันมีปัญหากับความสัมพันธ์ของฉันและฉันไม่รู้วิธีแก้ปัญหา

2
มีวิธีที่ยอดเยี่ยมในการอัปเดต CU สำหรับ SQL Server บนเครื่องหลายร้อยเครื่องหรือไม่?
บริษัท ของฉันเติบโตจากเซิร์ฟเวอร์ SQL 50 เครื่องไปเป็นเวลากว่า 200 คืนในการควบรวมกิจการ ช่วยด้วย! คำถามของฉันคือ: ฉันจะทำการอัปเดต CU บนเซิร์ฟเวอร์จำนวนมากนี้ได้อย่างไรและยังมีชีวิตและรักษาความมีสติอยู่ SCCM ดูเหมือนจะไม่สามารถทำการอัปเดต CU มีใครอีกบ้างที่สามารถทำการอัปเดต CU บนเซิร์ฟเวอร์ 100s ได้หรือไม่ อะไรคือทางเลือกอื่น ๆ

4
ดัชนีในคอลัมน์ข้อมูลควรจะไม่เป็นแบบคลัสเตอร์หรือไม่?
สำหรับตารางที่มีคอลัมน์ข้อมูลประจำตัวควรสร้างดัชนี PK / ไม่ซ้ำกันแบบคลัสเตอร์หรือไม่เป็นคลัสเตอร์สำหรับคอลัมน์ข้อมูลประจำตัวหรือไม่ เหตุผลคือดัชนีอื่น ๆ จะถูกสร้างขึ้นสำหรับการค้นหา แบบสอบถามที่ใช้ดัชนี nonclustered (บนฮีป) และส่งกลับคอลัมน์ที่ไม่ครอบคลุมโดยดัชนีจะใช้ตรรกะ I / O (LIO) น้อยลงเนื่องจากไม่มีดัชนี b-tree ที่ทำคลัสเตอร์พิเศษค้นหาขั้นตอน? create table T ( Id int identity(1,1) primary key, -- clustered or non-clustered? (surrogate key, may be used to join another table) A .... -- A, B, C have mixed data type …

2
PostgreSQL เพิ่มประสิทธิภาพ SSD
ฉันจะมีฐานข้อมูล PostgreSQL 9.3 ขนาดใหญ่ที่มีหลายตารางที่มีมากกว่า 100M รายการต่อตาราง ฐานข้อมูลนี้จะเป็นแบบอ่านอย่างเดียว (เมื่อฉันกรอกตารางที่จำเป็นทั้งหมดและสร้างดัชนีไม่มีการเขียนบนฐานข้อมูลอีกต่อไป) และการเข้าถึงของผู้ใช้คนเดียว เพื่อการวิจัยเท่านั้น ข้อความค้นหาจะใช้ JOIN บนฟิลด์ฐานข้อมูลจำนวนเต็มเสมอ ฉันอาจจะซื้อ SSD (256-512GB) เพื่อวัตถุประสงค์นี้ ฉันไม่เคยใช้ SSD สำหรับฐานข้อมูลมาก่อนดังนั้นมีอะไรที่ฉันควรกลัว ฉันสามารถใส่ DB ทั้งหมดลงใน SSD หรือเพียงแค่สร้างดัชนีได้หรือไม่ จำเป็นต้องมีคำแนะนำ / การสอนพิเศษสำหรับปรับแต่ง PostgreSQL สำหรับ SSD หรือไม่? โปรดทราบว่าฉันมีเวิร์กสเตชันที่ดีที่มี i7 และ 32Gb of RAM ดังนั้นบางทีคุณสามารถให้คำแนะนำบางอย่างได้เช่นกัน

8
แบบสอบถามที่แสดงผู้ใช้ที่แมปทั้งหมดสำหรับการเข้าสู่ระบบที่กำหนด
เมื่อดูคุณสมบัติของการเข้าสู่ระบบโดยเฉพาะเป็นไปได้ที่จะเห็นรายการผู้ใช้ที่แมปเข้าสู่การเข้าสู่ระบบนั้น: ฉันทำโปรไฟล์ SQL Server Management Studio (SSMS) และฉันเห็นว่า SSMS เชื่อมต่อกับฐานข้อมูลทุกรายการทีละรายการและดึงข้อมูลจาก sys.database_permissions เป็นไปได้ไหมที่จะเขียนเคียวรีเดี่ยวที่ดึงข้อมูลการแม็พผู้ใช้ที่แสดงด้านบนหรือฉันถูกบังคับให้ใช้เคอร์เซอร์หรือ sp_MSforeachdb หรืออะไรทำนองนั้น

3
ติดตามสถานะ 4199 - เปิดใช้งานทั่วโลกหรือไม่
สิ่งนี้อาจอยู่ภายใต้หมวดหมู่ของความเห็น แต่ฉันอยากรู้ว่าผู้คนกำลังใช้การตั้งค่าสถานะการสืบค้นกลับ 4199เป็นพารามิเตอร์เริ่มต้นสำหรับ SQL Server สำหรับผู้ที่เคยใช้มาแล้วคุณพบกับการถดถอยของแบบสอบถามภายใต้สถานการณ์ใดบ้าง ดูเหมือนว่ามันจะเป็นประโยชน์ต่อการปฏิบัติงานทั่วทั้งกระดานฉันกำลังพิจารณาที่จะเปิดใช้งานทั่วโลกในสภาพแวดล้อมที่ไม่ใช่การผลิตของเราและปล่อยให้มันนั่งสองสามเดือนเพื่อแก้ไขปัญหา การแก้ไขใน 4199 มีการสะสมในเครื่องมือเพิ่มประสิทธิภาพโดยปริยายในปี 2014 (หรือ 2016) หรือไม่? แม้ว่าฉันจะเข้าใจกรณีที่ไม่แนะนำการเปลี่ยนแปลงแผนโดยไม่คาดคิด แต่ก็แปลกที่จะซ่อนการแก้ไขทั้งหมดนี้ไว้ระหว่างรุ่น เรากำลังใช้ 2008, 2008R2 และส่วนใหญ่ 2012

3
ฉันจะวัดประสิทธิภาพของแบบสอบถามได้ดีที่สุดได้อย่างไร
ฉันมี 2 โพรซีเดอร์ที่เก็บซึ่งโพรซีเดอร์ที่เก็บที่สองคือการปรับปรุงของโพรซีเดอร์แรก ฉันพยายามวัดว่าการปรับปรุงนั้นดีเพียงใด 1 / การวัดclock timeไม่ได้เป็นตัวเลือกเนื่องจากฉันได้รับเวลาในการดำเนินการที่แตกต่างกัน ยิ่งแย่ลงบางครั้ง (ไม่ค่อยเกิดขึ้น แต่เกิดขึ้น) เวลาดำเนินการของโพรซีเดอร์ที่เก็บไว้สองครั้งนั้นใหญ่กว่าเวลาดำเนินการของโพรซีเดอร์แรก (ฉันเดาว่าเนื่องจากเวิร์กโหลดเซิร์ฟเวอร์ในขณะนั้น) 2 / Include client statisticsยังให้ผลลัพธ์ที่แตกต่าง 3 / DBCC DROPCLEANBUFFERS, DBCC FREEPROCCACHEเป็นสิ่งที่ดี แต่เป็นเรื่องเดียวกัน ... 4 / SET STATISTICS IO ONอาจเป็นตัวเลือก แต่ฉันจะได้คะแนนโดยรวมได้อย่างไรเนื่องจากฉันมีตารางจำนวนมากที่เกี่ยวข้องกับขั้นตอนการจัดเก็บของฉัน 5 / Include actual execution planอาจเป็นตัวเลือกด้วย ฉันได้รับestimated subtreecost0.3253 สำหรับขั้นตอนการจัดเก็บครั้งแรกและ 0.3079 สำหรับขั้นตอนที่สอง ฉันสามารถพูดได้ว่าขั้นตอนการเก็บที่สองเร็วขึ้น 6% (= 0.3253 / 0.3079) …

1
หน้าต่างเวลากลางคืน 24x7
ฉันจะหาแหล่งข้อมูลเกี่ยวกับวิธีย้ายการปฏิบัติการ 24x7 ไปได้ดีกว่าที่ใด บริษัท ใหญ่ที่มีฐานข้อมูลขนาดใหญ่ทำสิ่งนี้ได้อย่างไร งานยามค่ำคืนของเราเช่น ล้างข้อมูลเก่า Reindex อัปเดตสถิติ ดูเหมือนว่าทั้งหมดจะก่อให้เกิดผลกระทบร้ายแรงต่อระบบของเรา ( เช่นผู้ใช้ออนไลน์และฟีดข้อมูลเรียลไทม์) ฉันได้ดูหนังสือที่เกี่ยวข้องกับเรื่องนี้ใน Amazon แล้วและยังไม่พบอะไรเลย
19 sql-server 

2
ล็อคสร้างตาราง
ในแอปพลิเคชันอื่นฉันรู้สึกประทับใจกับการออกแบบที่ไม่ดี: มีหลายเธรดที่รันEnsureDatabaseSchemaExists()เมธอดพร้อมกันซึ่งมีลักษณะดังนี้: IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN CREATE TABLE MyTable ( ... ); END อย่างไรก็ตามแม้ว่าจะดำเนินการในการทำธุรกรรม SERIALIZABLE รหัสนี้ดูเหมือนจะไม่ปลอดภัยต่อเธรด (เช่นรหัสขนานพยายามสร้างตารางหลายครั้ง) มีโอกาสที่จะบังคับให้คำสั่ง SELECT ได้รับการล็อกซึ่งป้องกันเธรดอื่นให้ทำคำสั่ง SELECT ที่เหมือนกันหรือไม่? มีรูปแบบที่ดีกว่าสำหรับวิธีการแบบมัลติเธรด -CheckSchemaExists () หรือไม่?

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