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

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

2
วิธีค้นหาคิวรี่ที่ยังคงล็อคอยู่
การสืบค้นsys.dm_tran_locksDMV แสดงให้เราเห็นว่าเซสชันใด (SPIDs) กำลังล็อคทรัพยากรเช่นตารางหน้าและแถว สำหรับการล็อคแต่ละครั้งที่ได้มามีวิธีใดบ้างที่จะตัดสินว่าคำสั่ง SQL ใด (ลบ, แทรก, อัพเดตหรือเลือก) ทำให้เกิดการล็อคนั้น? ฉันรู้ว่าmost_recent_query_handleคอลัมน์ของsys.dm_exec_connectionsDMV ทำให้เรามีข้อความของการสืบค้นล่าสุดที่ดำเนินการ แต่หลายครั้งแบบสอบถามอื่น ๆ วิ่งมาก่อนภายใต้เซสชั่นเดียวกัน (SPID) และยังคงล็อค ฉันใช้sp_whoisactiveขั้นตอน (จาก Adam Machanic) แล้วและจะแสดงเฉพาะแบบสอบถามที่อยู่ในบัฟเฟอร์อินพุตในขณะนี้ (คิดว่าDBCC INPUTBUFFER @spid) ซึ่งไม่เสมอไป (และในกรณีของฉันมักจะไม่เคย) คือแบบสอบถามที่ได้รับการล็อค ตัวอย่างเช่น: เปิดธุรกรรม / เซสชัน ดำเนินการคำสั่ง (ที่ถือล็อคทรัพยากร) exec คำสั่งอื่นในเซสชั่นเดียวกัน เปิดธุรกรรม / เซสชันอื่นแล้วลองแก้ไขทรัพยากรที่ถูกล็อคในขั้นตอนที่ 2 sp_whoisactiveขั้นตอนจะชี้ให้เห็นคำสั่งในขั้นตอนที่ 3 ซึ่งไม่ได้เป็นผู้รับผิดชอบในการล็อคและจึงไม่เป็นประโยชน์ คำถามนี้มาจากการวิเคราะห์โดยใช้คุณสมบัติรายงานกระบวนการที่ถูกบล็อกเพื่อค้นหาสาเหตุของการบล็อกสถานการณ์ในการผลิต แต่ละธุรกรรมรันหลายเคียวรีและส่วนใหญ่ครั้งล่าสุด (ที่แสดงในอินพุตบัฟเฟอร์ที่ BPR) ไม่ค่อยถือล็อค ฉันมีคำถามติดตาม: …

1
ข้อความค้นหาย่อยที่มีประสิทธิภาพต่ำและมีการเปรียบเทียบวันที่
เมื่อใช้แบบสอบถามย่อยเพื่อค้นหาจำนวนรวมของระเบียนก่อนหน้าทั้งหมดที่มีเขตข้อมูลที่ตรงกันประสิทธิภาพจะแย่มากในตารางที่มีระเบียนน้อยถึง 50k โดยไม่มีแบบสอบถามย่อยแบบสอบถามดำเนินการในไม่กี่มิลลิวินาที ด้วยแบบสอบถามย่อยเวลาดำเนินการขึ้นไปหนึ่งนาที สำหรับแบบสอบถามนี้ผลลัพธ์จะต้อง: รวมเฉพาะบันทึกเหล่านั้นภายในช่วงวันที่ที่กำหนด รวมการนับของระเบียนก่อนหน้าทั้งหมดไม่รวมระเบียนปัจจุบันโดยไม่คำนึงถึงช่วงวันที่ โครงสร้างตารางพื้นฐาน Activity ====================== Id int Identifier Address varchar(25) ActionDate datetime2 Process varchar(50) -- 7 other columns ตัวอย่างข้อมูล Id Address ActionDate (Time part excluded for simplicity) =========================== 99 000 2017-05-30 98 111 2017-05-30 97 000 2017-05-29 96 000 2017-05-28 95 111 2017-05-19 94 222 …

1
เหตุใดจึงต้องทำการเชื่อมโยงภายในข้อความค้นหาย่อยส่งกลับค่า NULL
รับสคีมานี้: CREATE TABLE #TEST_COALESCE ( Id int NOT NULL, DateTest datetime NOT NULL, PRIMARY KEY (Id, DateTest) ); INSERT INTO #TEST_COALESCE VALUES (1, '20170201'), (1, '20170202'), (1, '20170203'), (2, '20170204'), (2, '20170205'), (2, '20170206'); ถ้าฉันใช้ COALESCE ภายในแบบสอบถามย่อยมันจะส่งคืน NULL SELECT t1.Id, t1.DateTest, (SELECT TOP 1 COALESCE(t2.DateTest, t1.DateTest) FROM #TEST_COALESCE t2 WHERE …
15 sql-server 

6
สอบถามรายละเอียดความแตกต่างระหว่างแถวสำหรับข้อมูลจำนวนมาก
ฉันมีตารางขนาดใหญ่จำนวนมากแต่ละอันมีคอลัมน์> 300 แอปพลิเคชันที่ฉันใช้สร้าง "ที่เก็บถาวร" ของแถวที่เปลี่ยนแปลงโดยการทำสำเนาแถวปัจจุบันในตารางที่สอง ลองพิจารณาตัวอย่างเล็ก ๆ น้อย ๆ : CREATE TABLE dbo.bigtable ( UpdateDate datetime, PK varchar(12) PRIMARY KEY, col1 varchar(100), col2 int, col3 varchar(20), . . . colN datetime ); ตารางเก็บถาวร: CREATE TABLE dbo.bigtable_archive ( UpdateDate datetime, PK varchar(12) NOT NULL, col1 varchar(100), col2 int, col3 varchar(20), . …

1
การเพิ่มโหนดใหม่ลงในคลัสเตอร์ Cassandra ในขณะที่การซ่อมแซมทำงานอยู่ปลอดภัยหรือไม่
ฉันพร้อมที่จะขยายคลัสเตอร์ Cassandra ที่มีอยู่ ฉันมีกำหนดการซ่อมแซมเพื่อให้ทำงานได้ตามปกติ ฉันต้องปิดการใช้งานการซ่อมแซมหรือไม่เมื่อเพิ่มโหนดใหม่ในคลัสเตอร์หรือฉันสามารถบูตโหนดใหม่ขณะที่การซ่อมแซมทำงานที่อื่นในคลัสเตอร์ได้หรือไม่

3
เส้นทางไบนารีในการกำหนดค่า pgAdmin
ฉันติดตั้ง PostgreSQL เพราะฉันต้องการกู้คืน.backupไฟล์ขนาดใหญ่ที่ฉันได้รับจากการอัปโหลดไปยังแพลตฟอร์มอื่น (38 ล้านแถวซึ่งดูเหมือนว่าใหญ่เกินไปสำหรับบุคคลที่จะส่งออกด้วยวิธีอื่น) เมื่อฉันพยายาม "กู้คืน" ใน pgAdmin 4 ฉันได้รับข้อความ: โปรดกำหนดค่าเส้นทางไบนารีของ PostgreSQL ในกล่องโต้ตอบการตั้งค่า นี่เป็นเพียงเส้นทางไปยังโฟลเดอร์ PostgreSQL หรือไม่ ฉันไม่พบเอกสารเกี่ยวกับสิ่งนี้ในไซต์ PostgreSQL ทั้งหมดที่ฉันสามารถหาได้คือ: ใช้ฟิลด์ในโหนด Binary Path เพื่อระบุพา ธ ไปยังยูทิลิตี้ไบนารี PostgreSQL และ EnterpriseDB Postgres Advanced Server ยูทิลิตี้ไบนารี มีวิธีที่ง่ายกว่าในการกู้คืนฐานข้อมูลอื่นที่ไม่ใช่ผ่าน pgAdmin หรือไม่?

2
เข้าร่วมการสืบค้นใช้เวลา 11 นาทีเพื่อเรียกใช้บนตาราง 300,000 แถว
แบบสอบถามด้านล่างใช้เวลาในการดำเนินการมากกว่า 11 นาที SELECT `c`.*, `e`.`name` AS `employee_name`, `e`.`emp_no`, `d`.`code` AS `department_code`, IF(ew.code IS NOT NULL, ew.code, egw.code) AS shift_code, IF(ew.code IS NOT NULL, ew.time_in_from, egw.time_in_from) AS time_in_from, IF(ew.code IS NOT NULL, ew.time_out_to, egw.time_out_to) AS time_out_to, IF(ew.code IS NOT NULL, ew.next_day, egw.next_day) AS next_day FROM `tms_emp_badge_card` AS `c` LEFT JOIN …

4
การวางคอลัมน์ PostgreSQL 9.6 และผลข้างเคียงต่อฟังก์ชัน SQL ด้วย CTE
ถ้าฉันมีตารางที่มี 3 คอลัมน์ - พูด A, B และ D - และฉันต้องแนะนำใหม่ - พูด C เพื่อแทนที่ตำแหน่งปัจจุบันของ D ฉันจะใช้วิธีการต่อไปนี้: แนะนำ 2 คอลัมน์ใหม่เป็น C และ D2 คัดลอกเนื้อหาของ D ถึง D2 ลบ D. เปลี่ยนชื่อ D2 เป็น D คำสั่งซื้อใหม่จะเป็น A, B, C และ D ฉันคิดว่านี่เป็นวิธีปฏิบัติที่ถูกต้องตามกฎหมายเพราะจนถึงตอนนี้มันก็ไม่มีปัญหา อย่างไรก็ตามวันนี้ฉันเจอปัญหาเมื่อฟังก์ชั่นที่ดำเนินการคำสั่งบนตารางเดียวกันส่งคืนข้อผิดพลาดต่อไปนี้: table row type and query-specified row type do not …


2
วิธีตรวจสอบตัวละครที่ไม่ใช่แอสตี้
วิธีที่ดีที่สุดในการตรวจสอบว่าเขตข้อมูล VARCHAR มีอักขระที่ไม่ใช่แบบ ASCII คืออะไร CHAR(1)ผ่านCHAR(31)และผ่านCHAR(127)CHAR(255) ฉันลองใช้PATINDEXและพบปัญหาต่อไปนี้ ตรวจสอบช่วงล่างทำงานอย่างถูกต้อง SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0 ข้อมูลของฉันมีสามระเบียนด้วย 0x1E และทั้งสามรายการที่ส่งคืน แต่เมื่อฉันตรวจสอบเฉพาะช่วงบน: SELECT * FROM mbrnotes WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0 มันส่งกลับใกล้กับระเบียนทั้งหมดในตาราง (จำนวนตาราง 170737 และส่งกลับจำนวน 170735) และเนื่องจากข้อมูลของฉันไม่ได้มีค่าใด ๆ ในช่วงนี้ฉันจะคิดว่ามันไม่ควรกลับไม่มีระเบียน

2
SQL Delete สามารถใช้คำสั่งย่อยได้อย่างไร
รหัสต่อไปนี้ถูกเพิ่มโดยหนึ่งในนักพัฒนาของเราเพื่อลบระเบียนที่ซ้ำกันออกจากตาราง: DELETE SubQuery FROM ( SELECT ID ,FK1 ,FK2 ,CreatedDateTime ,ROW_NUMBER() OVER(PARTITION BY FK1, FK2 ORDER BY CreatedDateTime) AS RowNumber FROM Table ) AS SubQuery WHERE RowNumber > 1 เมื่อตรวจสอบรหัสฉันคิดว่ามันจะไม่ทำงานอย่างไรก็ตามการทดสอบในสภาพแวดล้อมการทดสอบของเรา (SQL 2014) แสดงให้เห็นว่ามันเป็นเช่นนั้น! SQL ทราบได้อย่างไรว่าสามารถแก้ไขคิวรีย่อยและลบระเบียนได้tableอย่างไร

1
แผนการดำเนินการที่มีดัชนีหายไปหลายรายการ
หากคุณเรียกใช้แบบสอบถามด้วย 'รวมแผนการดำเนินการตามจริง' แผนจะแนะนำดัชนีที่ขาดหายไปด้วย รายละเอียดดัชนีอยู่ภายในMissingIndexesแท็กใน XML มีสถานการณ์หรือไม่เมื่อแผนมีข้อเสนอแนะหลายดัชนี? ฉันลองใช้คำสั่ง sql ที่แตกต่างกัน แต่ไม่สามารถหาข้อสงสัยใด ๆ ที่สร้างดัชนีที่ขาดหายไปสองรายการขึ้นไป

2
ตารางระบบ SQL Server สามารถจัดระเบียบได้หรือไม่?
เรามีฐานข้อมูลหลายแห่งที่สร้างและวางตารางจำนวนมาก จากสิ่งที่เราสามารถบอกได้ SQL Server จะไม่ทำการบำรุงรักษาภายในใด ๆ บนตารางฐานของระบบซึ่งหมายความว่าพวกเขาสามารถแยกส่วนกันมากในช่วงเวลาและขนาด bloated สิ่งนี้ทำให้เกิดความกดดันที่ไม่จำเป็นในบัฟเฟอร์พูลและยังส่งผลเสียต่อประสิทธิภาพการทำงานเช่นการคำนวณขนาดของตารางทั้งหมดในฐานข้อมูล ไม่มีใครมีคำแนะนำสำหรับการลดการกระจายตัวของบนตารางหลักภายในเหล่านี้หรือไม่ วิธีแก้ปัญหาที่ชัดเจนวิธีหนึ่งสามารถหลีกเลี่ยงการสร้างตารางจำนวนมาก (หรือสร้างตารางชั่วคราวทั้งหมดใน tempdb) แต่สำหรับจุดประสงค์ของคำถามนี้สมมติว่าแอปพลิเคชันไม่มีความยืดหยุ่นนั้น แก้ไข: การวิจัยเพิ่มเติมแสดงคำถามที่ยังไม่ได้ตอบซึ่งมีความเกี่ยวข้องอย่างใกล้ชิดและระบุว่าการบำรุงรักษาด้วยตนเองบางรูปแบบผ่านทางALTER INDEX...REORGANIZEอาจเป็นตัวเลือก การวิจัยเบื้องต้น ข้อมูลเมตาเกี่ยวกับตารางเหล่านี้สามารถดูได้ในsys.dm_db_partition_stats: -- The system base table that contains one row for every column in the system SELECT row_count, (reserved_page_count * 8 * 1024.0) / row_count AS bytes_per_row, reserved_page_count/128. AS space_mb FROM sys.dm_db_partition_stats …

2
SQL Server รุ่นใหม่มีเสถียรภาพน้อยลงหรือไม่
สถาปนิกฐานข้อมูลของเราบอกกับลูกค้าของเราว่า SQL Server 2014 เป็นตัวเลือกที่ไม่ดีในปี 2555 เพราะขาดประสิทธิภาพและความได้เปรียบด้านเสถียรภาพที่ 2012 มี ทุกสิ่งที่ฉันได้อ่านขัดแย้งนี้ Aaron Bertrand กล่าวว่าสิ่งที่ตรงกันข้ามและเอกสารสีขาวทั้งหมดที่ฉันได้อ่านจาก MS เห็นด้วยเช่นกัน 2014 ได้รับการปรับปรุงและแก้ไขปัญหา AG บางอย่างที่ผู้คนเคยมีในปี 2012 มีข้อเสียที่สำคัญในการเลือก 2014 ในปี 2012 ที่ฉันขาดหายไปหรือไม่?

3
เหตุใดข้อความค้นหา EXISTS ของฉันจึงทำการสแกนดัชนีแทนที่จะค้นหาดัชนี
ฉันกำลังปรับปรุงการค้นหาให้ดีที่สุด สำหรับแบบสอบถามด้านล่าง SET STATISTICS IO ON; DECLARE @OrderStartDate DATETIME2 = '27 feb 2016'; DECLARE @OrderEndDate DATETIME2 = '28 feb 2016'; SELECT o.strBxOrderNo , o.sintOrderStatusID , o.sintOrderChannelID , o.sintOrderTypeID , o.sdtmOrdCreated , o.sintMarketID , o.strOrderKey , o.strOfferCode , o.strCurrencyCode , o.decBCShipFullPrice , o.decBCShipFinal , o.decBCShipTax , o.decBCTotalAmount , o.decWrittenTotalAmount , o.decBCWrittenTotalAmount …

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