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

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

3
แปลงฟังก์ชัน Scalar เป็นฟังก์ชัน TVF สำหรับการประมวลผลแบบขนาน - ยังคงทำงานในโหมดอนุกรม
หนึ่งในแบบสอบถามของฉันทำงานในโหมดการดำเนินการแบบอนุกรมหลังจากวางจำหน่ายและฉันสังเกตเห็นว่ามีการใช้ฟังก์ชันใหม่สองรายการในมุมมองซึ่งอ้างอิงใน LINQ ไปยัง SQL Query ที่สร้างขึ้นจากแอปพลิเคชัน ดังนั้นฉันจึงแปลงฟังก์ชัน SCALAR เหล่านั้นเป็นฟังก์ชั่น TVF แต่คำถามก็ยังคงทำงานอยู่ในโหมดอนุกรม ก่อนหน้านี้ฉันได้แปลง Scalar เป็น TVF ในข้อความค้นหาอื่นและแก้ปัญหาการบังคับให้เรียกใช้งานอนุกรม นี่คือฟังก์ชันสเกลาร์: CREATE FUNCTION [dbo].[FindEventReviewDueDate] ( @EventNumber VARCHAR(20), @EventID VARCHAR(25), @EventIDDate BIT ) RETURNS DateTime AS BEGIN DECLARE @CurrentEventStatus VARCHAR(20) DECLARE @EventDateTime DateTime DECLARE @ReviewDueDate DateTime SELECT @CurrentEventStatus = (SELECT cis.EventStatus FROM CurrentEventStatus cis INNER …

2
จำกัด การใช้งาน CPU สูงสุด SQL SERVER ด้วย WSRM
ฉันมีเซิร์ฟเวอร์จริงที่ใช้งาน SQL Server อยู่หนึ่งอินสแตนซ์ ฉันสังเกตเห็นว่าบ่อยครั้งที่เซิร์ฟเวอร์นี้ใช้งาน CPU 100% ทีมไอทีของฉันไม่มีความสุขกับเรื่องนี้และแนะนำให้เราสำรอง 2 จาก 32 คอร์สำหรับระบบปฏิบัติการ ใช้งานได้ดีตอนนี้การใช้งานสูงสุดจะต่ำกว่า 90% นอกจากนี้การดึงข้อมูลช้าจากผู้ใช้หลายคนจะไม่ถูกรายงานอีกต่อไป มีเหตุผลใดที่จะไม่ใช้ WSRM (Windows System Resource Manager) ด้วยวิธีนี้ - แทนที่จะเป็น SQL Resource Governor?

1
การใช้กระบวนการไม่ถูกต้องจากเหตุการณ์ที่เพิ่มความสมบูรณ์ของระบบหรือไม่
ฉันเพิ่งทำงานเกี่ยวกับการทำความเข้าใจข้อมูลหรือตัวชี้วัดที่ถูกเก็บไว้ในไฟล์เหตุการณ์ขยายระบบสุขภาพ เรากำลังพยายามใช้การรวบรวมข้อมูลของตัวชี้วัดประสิทธิภาพโดยใช้ความสมบูรณ์ของระบบตามที่ระบุไว้ที่นี่ มีรายงานที่ให้ตัวชี้วัดเช่นการใช้ CPU, การใช้งานกระบวนการอื่น ๆ ที่รวบรวมจากเหตุการณ์สถานะระบบ scheduler_monitor_system_health_ring_buffer_recorded ฉันไม่สามารถเข้าใจเซิร์ฟเวอร์ไม่กี่แห่งของฉันได้เพราะเหตุใดฟิลด์ "process_utilization" ซึ่งแสดงอยู่ในรายงานเนื่องจากการใช้งาน CPU CPU นั้นใช้เวลาส่วนใหญ่มากกว่า 100 เวลาสูงสุดในช่วงเวลาสูงสุดจะแตกต่างกันระหว่าง 120-160 และเพราะรายงานนั้น แสดง CPU ที่สูงกว่า 100 เสมอแม้ว่าฉันจะตรวจสอบจากเซิร์ฟเวอร์กิจกรรมการตรวจสอบที่ไม่เคยกรณี ฉันได้หยิบยกปัญหานี้ขึ้นใน Github แต่ดูเหมือนไม่มีการแก้ไขหรือตอบสนอง ดังนั้นคำถามของฉันจะเป็น ฉันจะได้รับหมายเลขที่ถูกต้องสำหรับการใช้งาน CPU CPU สำหรับเซิร์ฟเวอร์ของฉันโดยใช้บัฟเฟอร์เสียงเรียกทำงานระบบได้อย่างไร? รายงานยังแสดงตัวนับสำหรับเขตข้อมูลด้านล่าง 2 คำนวณจากรายงานของพวกเขา 100-System_idle-process_utilization เป็น OtherProcessUtil 100-system_idle เป็น SystemUtil OtherProcessUtilและSystemUtilเหล่านี้มีความจำเป็น / มีประโยชน์สำหรับอะไร? ฉันยังเห็นการใช้หน่วยความจำทุกครั้งที่แสดงเป็น 100 ซึ่งดูไม่ถูกต้องเช่นกัน มีใครสังเกตเห็นไหม เครื่องมืออื่น ๆ เช่น …

1
SHRINKFILE Failure - ทำไมการเพิ่มขนาดไฟล์จึงแก้ไขได้?
ฉันใช้SHRINKFILEการดำเนินการบางอย่างเพื่อทำความสะอาดไฟล์เล็ก ๆ ที่ไม่จำเป็นในกลุ่มไฟล์ สำหรับการย่อขนาดหนึ่งคำสั่งด้านล่างส่งผลให้เกิดข้อผิดพลาด: DBCC SHRINKFILE (N'myfile' , EMPTYFILE)' ID ไฟล์ x ของ ID ฐานข้อมูล x ไม่สามารถย่อขนาดได้เนื่องจากเป็นกระบวนการที่ถูกย่อโดยกระบวนการอื่นหรือว่างเปล่า มันไม่ได้ว่างเปล่าหรือหดตัว มันกำลังถูกรันบนฐานข้อมูลที่ไม่ได้ใช้งานโดยทุกคนยกเว้นตัวฉันเอง ไม่ได้เปิดใช้งานการย่อขนาดอัตโนมัติและไม่เคยเป็น แต่มีอยู่ shrinks คู่มือการดำเนินการเกี่ยวกับฐานข้อมูลนี้เป็นประจำก่อนที่จะฉันได้รับในมือของฉันที่มันถ้าเรื่องที่ทุก บนSQLServerCentralเธรดจากทศวรรษที่ผ่านมาแนะนำการเพิ่ม MB ไม่กี่ MB ลงในแฟ้มได้เนื่องจาก "ตั้งค่าตัวนับภายในหรือสวิตช์ภายในที่บอกว่ามันไม่ได้อยู่ในช่วงหดตัวในขณะนี้" สิ่งนี้ใช้ได้ - ยอดเยี่ยม แต่ทุกคนสามารถอธิบายรายละเอียดที่มากขึ้นว่า / ทำไมมันถึงเกี่ยวกับ SQL Server internals?

3
เงื่อนไขการกรองไม่ถูกต้องนำไปใช้กับดัชนีคอลัมน์ที่เก็บแบบคลัสเตอร์
จากตัวอย่างด้านล่างเพรดิเคตจะเหมือนกันอย่างไรก็ตามคำสั่ง top (ถูกต้อง) ส่งคืน 0 แถวคำสั่งด้านล่างส่งคืน 1 - แม้ว่าเพรดิเคตจะไม่ตรงกัน: declare @barcode nchar(22)=N'RECB012ZUKI449M1VBJZ' declare @tableId int = null declare @total decimal(10, 2) = 5.17 SELECT 1 FROM [dbo].[transaction] WITH (INDEX([IX_Transaction_TransactionID_PaymentStatus_DeviceID_DateTime_All])) WHERE Barcode = @barcode AND StatusID = 1 AND TableID = @tableID AND @total <= Total SELECT 1 FROM [dbo].[transaction] WHERE …

5
วิธีปฏิเสธการเข้าถึง SQL Server เพื่อเข้าสู่ระบบบางอย่างผ่าน SSMS แต่อนุญาตผ่าน. Net SqlClient Data Provider
เรามีสถานการณ์ที่นักพัฒนาไม่ได้UPDATEรับอนุญาตใด ๆแต่พวกเขาทำงานกับแอปพลิเคชันและดูสตริงการเชื่อมต่อ -> พวกเขารู้รหัสผ่านจากบัญชี SQL บางบัญชี (ตัวอย่างSQLLogin1) ที่มีสิทธิ์อัปเดต การดำเนินงานของเราในปัจจุบันยังไม่สมบูรณ์แบบและบางครั้งข้อมูลการผลิตจะต้องมีการแก้ไข (ยังไม่มี GUI สำหรับสิ่งนั้น) แทนที่จะติดต่อ DBA และขอให้เขาแก้ไขข้อมูลนักพัฒนาจะใช้บัญชี SQL (ไม่ถูกต้อง) SQLLogin1(ที่มีสิทธิ์ในการปรับเปลี่ยนข้อมูล) และเชื่อมต่อกับ SQL Server Management Studio เพื่อแก้ไขข้อมูลเอง DBA ไม่สามารถเปลี่ยนรหัสผ่านได้หากSQLLogin1ไม่มี Developer จะเห็นสตริงการเชื่อมต่อใหม่และรหัสผ่านใหม่เนื่องจากสตริงการเชื่อมต่อแอปพลิเคชันที่ใช้SQLLogin1นั้นดูแลโดยนักพัฒนา คำถาม: มีวิธีที่จะปฏิเสธการเข้าถึงการSQLLogin1เข้าสู่ระบบ SQL แต่ถ้ามันเชื่อมต่อผ่าน SSMS หรือไม่? ในเวลาเดียวกันหากSQLLogin1เชื่อมต่อผ่าน.Net SqlClient Data Provider( program_nameในsys.dm_exec_sessions) จะต้องได้รับอนุญาตให้เข้าสู่ระบบ วิธีนี้เราไม่ต้องการให้นักพัฒนาเชื่อมต่อผ่าน SSMS โดยใช้SQLLogin1ในขณะที่แอปพลิเคชันที่ใช้อยู่SQLLogin1จะยังคงสามารถเชื่อมต่อได้

4
อะไรคือเหตุผลในการใช้ double inner join ในคำสั่ง SQL นี้
ฉันกำลังดูที่แบบสอบถาม SQL ดั้งเดิม บิตที่ฉันไม่สามารถรับได้คือสาเหตุที่มันเข้าร่วมตารางเดียวกันสองครั้งในคอลัมน์เดียวกัน ฉันกำลังพูดถึง Table1 และ Table1 เข้าร่วมกับนามแฝง "Table1Alias" SELECT DISTINCT othercolumns, Table1Alias.columna FROM maintable INNER JOIN secondarytable ON maintable.id1 = secondarytable.a_id1 INNER JOIN table1 ON secondarytable.id2 = table1.id3 INNER JOIN table1 Table1Alias ON secondarytable.id2 = Table1Alias.id3 INNER JOIN thirdtable ON table1.id4 = thirdtable.id5 INNER JOIN fourthtable ON thirdtable.id6 …
10 sql-server 

1
กฎใดที่กำหนดเมื่อ SQL Server ใช้ CTE เป็น "รั้วการปรับให้เหมาะสม"
ในขณะที่กลับมา Brent Ozar เผยแพร่โพสต์รายละเอียดบางส่วนของความแตกต่างระหว่าง SQL Server และ PostgreSQL: ความแตกต่างที่สำคัญสองประการระหว่าง SQL Server กับ PostgreSQL จุดแรก (“ CTE เป็นรั้วการเพิ่มประสิทธิภาพ”) จับตาของฉันเพราะเห็นได้ชัดว่าในตัวอย่างที่มีให้ SQL Server รวม CTE และแบบสอบถามหลักเข้าด้วยกันและปรับให้เป็นแบบสอบถามเดียว (ตรงข้ามกับพฤติกรรมตรงข้ามใน PostgreSQL) อย่างไรก็ตามพฤติกรรมนี้ดูเหมือนจะตรงกันข้ามกับตัวอย่างที่ฉันเห็นในบล็อกและคลาสฝึกอบรมอื่น ๆ ที่ SQL Server ใช้ CTE เป็นรั้วการปรับให้เหมาะสมซึ่งช่วยให้ใช้ดัชนีได้ดีขึ้นประสิทธิภาพที่ดีขึ้นเป็นต้นตัวอย่างเช่น วิธีที่ดีกว่าในการเลือกดาว ดังนั้นดูเหมือนว่า SQL Server จะ "ให้เกียรติ" CTE เป็นกรอบการเพิ่มประสิทธิภาพบางครั้ง มีทรัพยากรที่ดีใดบ้างที่บันทึกรายการเฉพาะของกรณีที่ทราบซึ่ง SQL Server จะให้เกียรติ CTE อย่างน่าเชื่อถือเป็นรั้วการเพิ่มประสิทธิภาพ (หรือพฤติกรรมที่ตรงกันข้าม)

2
ทำไมจึงเร็วกว่านี้และปลอดภัยที่จะใช้หรือไม่ (ที่ตัวอักษรตัวแรกอยู่ที่ไหนในตัวอักษร)
เรื่องย่อสั้น ๆ เรากำลังอัปเดตผู้คนกลุ่มเล็ก ๆ ด้วยค่านิยมจากกลุ่มคนที่มีขนาดใหญ่มาก ในการทดสอบล่าสุดการอัพเดทนี้ใช้เวลาประมาณ 5 นาทีในการรัน เราพบสิ่งที่ดูเหมือนว่าการปรับให้เหมาะสมที่สุดที่เป็นไปได้ซึ่งดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์แบบ! แบบสอบถามเดียวกันนี้ทำงานในเวลาน้อยกว่า 2 นาทีและสร้างผลลัพธ์เดียวกันอย่างสมบูรณ์แบบ นี่คือแบบสอบถาม บรรทัดสุดท้ายถูกเพิ่มเป็น "การเพิ่มประสิทธิภาพ" ทำไมเวลาค้นหาที่ลดลงอย่างมาก พวกเราขาดอะไรบางอย่าง? สิ่งนี้นำไปสู่ปัญหาในอนาคตได้หรือไม่? UPDATE smallTbl SET smallTbl.importantValue = largeTbl.importantValue FROM smallTableOfPeople smallTbl JOIN largeTableOfPeople largeTbl ON largeTbl.birth_date = smallTbl.birthDate AND DIFFERENCE(TRIM(smallTbl.last_name),TRIM(largeTbl.last_name)) = 4 AND DIFFERENCE(TRIM(smallTbl.first_name),TRIM(largeTbl.first_name)) = 4 WHERE smallTbl.importantValue IS NULL -- The following line …

3
เรียงลำดับการรั่วไหลไปยัง tempdb เนื่องจาก varchar (สูงสุด)
บนเซิร์ฟเวอร์ที่มี 32GB เราใช้ SQL Server 2014 SP2 ที่มีหน่วยความจำสูงสุด 25GB เรามีสองตารางที่นี่คุณจะพบโครงสร้างที่เรียบง่ายของทั้งสองตาราง: CREATE TABLE [dbo].[Settings]( [id] [int] IDENTITY(1,1) NOT NULL, [resourceId] [int] NULL, [typeID] [int] NULL, [remark] [varchar](max) NULL, CONSTRAINT [PK_Settings] PRIMARY KEY CLUSTERED ([id] ASC) ) ON [PRIMARY] GO CREATE TABLE [dbo].[Resources]( [id] [int] IDENTITY(1,1) NOT NULL, [resourceUID] [int] NULL, CONSTRAINT …

2
วิธีที่ดีที่สุดในการใส่เครื่องหมายจุลภาคเป็นจำนวนมาก
ฉันเริ่มงานใหม่แล้วและมันเกี่ยวข้องกับการดูเป็นจำนวนมาก มีวิธีง่าย ๆ ในการเพิ่มเครื่องหมายจุลภาคในintหรือdecimalเขตข้อมูลเพื่อให้สามารถอ่านได้หรือไม่ ตัวอย่างเช่น SQL Server แสดงคอลัมน์ทางด้านซ้าย แต่สำหรับสติของตัวเองฉันต้องการให้มันดูเหมือนคอลัมน์ทางด้านขวา: 2036150 -> 2,036,150 ... หรือฉันจะต้องเขียนบางอย่างชั่วร้าย left(right(vandalized_data),6),3) + ',' + right(left(vandalized_data),6),3) ฟังก์ชั่น? สิ่งที่สมบูรณ์แบบคือเครื่องหมายจุลภาคในตารางแสดงผลจากนั้นจำนวนเต็มธรรมดาในผลลัพธ์

1
อัลกอริทึมที่อยู่เบื้องหลังผู้ประกอบการยกเว้นคืออะไร?
อัลกอริทึมภายในของวิธีการที่ตัวดำเนินการยกเว้นทำงานภายใต้การครอบคลุมใน SQL Server คืออะไร ภายในใช้แฮชของแต่ละแถวและเปรียบเทียบหรือไม่ David Lozinksi ได้ทำการศึกษาSQL: วิธีที่เร็วที่สุดในการแทรกบันทึกใหม่ที่ไม่มีอยู่จริงเขาแสดงให้เห็นว่าคำสั่งนั้นเร็วที่สุดสำหรับแถวจำนวนมาก อย่างใกล้ชิดกับผลลัพธ์ของเราด้านล่าง ข้อสันนิษฐาน: ฉันคิดว่าการเข้าร่วมด้านซ้ายจะเร็วที่สุดเนื่องจากจะเปรียบเทียบเพียง 1 คอลัมน์เท่านั้นยกเว้นจะใช้เวลานานที่สุดเนื่องจากต้องเปรียบเทียบคอลัมน์ทั้งหมด ด้วยผลลัพธ์เหล่านี้ตอนนี้ความคิดของเราคือยกเว้นโดยอัตโนมัติและใช้แฮชของแต่ละแถวภายในหรือไม่ ฉันดูยกเว้นแผนการดำเนินการและใช้แฮชบางอย่าง ความเป็นมา: ทีมของเราเปรียบเทียบตารางฮีปสองโต๊ะ ตาราง A แถวที่ไม่ได้อยู่ในตาราง B ถูกแทรกเข้าไปในตาราง B ตารางฮีป (จากระบบไฟล์ข้อความดั้งเดิม) ไม่มีคีย์ / guids / identifier หลัก บางตารางมีแถวที่ซ้ำกันดังนั้นเราจึงพบแฮชของแต่ละแถวและลบรายการที่ซ้ำกันออกและสร้างตัวระบุคีย์หลัก 1) อันดับแรกเราเรียกใช้คำสั่งยกเว้นยกเว้น (คอลัมน์แฮช) select * from TableA Except Select * from TableB, 2) จากนั้นเราก็วิ่งซ้ายเข้าร่วมเปรียบเทียบระหว่างสองตารางใน HashRowId select * …

1
การทริกเกอร์การยิงแม้จะไม่ได้รับผลกระทบ
นี่เป็นคำถามทั่วไปมากกว่า แต่แรงจูงใจสำหรับคำถามนี้เป็นปัญหาที่ฉันประสบขณะใช้ SQL Server ฉันมีทริกเกอร์นี้แนบกับเหตุการณ์แทรกบนตารางที่มีตรรกะบางอย่างซึ่งเป็นผลข้างเคียงจะเพิ่มข้อผิดพลาดหากไม่มีแถวถูกแทรก เมื่อตรวจสอบเพิ่มเติมฉันพบว่ามีการยิงไกแม้จะไม่มีการแทรกแถว ภาษาที่ใช้ในMicrosoft Docs บนทริกเกอร์ DMLดูเหมือนจะขัดแย้งกับพฤติกรรมนี้: ทริกเกอร์ DML เป็นขั้นตอนการจัดเก็บชนิดพิเศษที่จะมีผลโดยอัตโนมัติเมื่อมีเหตุการณ์ DML เกิดขึ้นซึ่งมีผลต่อตารางหรือมุมมองที่กำหนดในทริกเกอร์ นี่เป็นพฤติกรรมเริ่มต้นใน DBMS หรือไม่ มีเหตุผลบางอย่างในการเริ่มต้นทริกเกอร์เมื่อไม่มีแถวที่ได้รับผลกระทบหรือไม่?

1
ทำไมการเข้าร่วมการกำจัดไม่ทำงานกับ sys.query_store_plan
ต่อไปนี้เป็นการทำให้เข้าใจง่ายของปัญหาประสิทธิภาพที่พบกับ Query Store: CREATE TABLE #tears ( plan_id bigint NOT NULL ); INSERT #tears (plan_id) VALUES (1); SELECT T.plan_id FROM #tears AS T LEFT JOIN sys.query_store_plan AS QSP ON QSP.plan_id = T.plan_id; plan_idคอลัมน์เป็นเอกสารที่เป็นคีย์หลักของsys.query_store_planแต่แผนปฏิบัติการไม่ได้ใช้เข้าร่วมการกำจัดเป็นที่คาดว่าจะ: ไม่มีการคาดการณ์คุณลักษณะจาก DMV คีย์หลัก DMV plan_idไม่สามารถซ้ำแถวจากตารางชั่วคราวได้ A LEFT JOINถูกใช้ดังนั้นจึงไม่Tสามารถลบแถวออกได้ แผนการดำเนินการ เหตุใดจึงเป็นเช่นนี้และสิ่งใดที่สามารถทำได้เพื่อรับการเข้าร่วมการกำจัดที่นี่


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