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

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

2
การปรับปรุงตัวอย่าง SQL Server ของสถิติพลาด RANGE_HI_KEY สูงสุดในคอลัมน์คีย์จากน้อยไปมาก
ฉันกำลังพยายามที่จะเข้าใจว่าการสุ่มตัวอย่างสถิติทำงานอย่างไรและพฤติกรรมด้านล่างนี้เป็นสิ่งที่คาดหวังในการอัปเดตสถิติตัวอย่างหรือไม่ เรามีตารางขนาดใหญ่แบ่งพาร์ติชันตามวันที่โดยมีแถวสองพันล้านแถว วันที่พาร์ทิชันเป็นวันที่ธุรกิจก่อนหน้านี้และเป็นคีย์จากน้อยไปมาก เราโหลดข้อมูลลงในตารางนี้ในวันก่อนหน้าเท่านั้น การโหลดข้อมูลทำงานข้ามคืนดังนั้นในวันศุกร์ที่ 8 เมษายนเราโหลดข้อมูลสำหรับวันที่ 7 FULLSCANหลังจากทำงานในแต่ละเราปรับปรุงสถิติแม้จะใช้กลุ่มตัวอย่างมากกว่า บางทีฉันอาจไร้เดียงสา แต่ฉันคาดหวังว่า SQL Server จะระบุคีย์สูงสุดและคีย์ต่ำสุดในช่วงเพื่อให้แน่ใจว่ามีตัวอย่างช่วงที่ถูกต้อง ตามบทความนี้ : สำหรับที่เก็บข้อมูลแรกขอบเขตที่ต่ำกว่าคือค่าที่เล็กที่สุดของคอลัมน์ที่สร้างฮิสโตแกรม อย่างไรก็ตามมันไม่ได้พูดถึง bucket / ค่าที่มากที่สุด ด้วยการอัพเดตสถิติตัวอย่างในตอนเช้าของวันที่ 8 ตัวอย่างจะพลาดค่าสูงสุดในตาราง (อันดับที่ 7) เนื่องจากเราทำการสืบค้นข้อมูลจากวันก่อนจำนวนมากทำให้มีการประมาณค่า cardinality ที่ไม่ถูกต้องและมีจำนวนการสอบถามที่หมดเวลา SQL Server ไม่ควรระบุค่าสูงสุดสำหรับคีย์นั้นและใช้เป็นค่าสูงสุดRANGE_HI_KEYหรือไม่ หรือเป็นเพียงแค่นี้ข้อ จำกัด ของการปรับปรุงโดยไม่ต้องใช้FULLSCAN? รุ่น SQL Server 2012 SP2-CU7 ขณะนี้เราไม่สามารถอัปเกรดได้เนื่องจากมีการเปลี่ยนแปลงOPENQUERYพฤติกรรมใน SP3 ที่มีการปัดเศษตัวเลขในแบบสอบถามเซิร์ฟเวอร์ที่เชื่อมโยงระหว่าง SQL Server และ Oracle

2
SQL Server ไม่ได้ใช้หน่วยความจำทั้งหมด
ฉันมี SQL Server 2014 โดยมีหน่วยความจำสูงสุดตั้งไว้ที่ 6GB (หน่วยความจำกายภาพคือ 8GB) เซิร์ฟเวอร์เป้าหมายหน่วยความจำบางครั้ง 6GB แล้วลดลงกลับไปรวมเซิร์ฟเวอร์หน่วยความจำ (ประมาณ 5.3GB ไม่เคยถึง 6GB) ผมใช้committed_kbในsys.dm_os_sys_infoเพื่อตรวจสอบหน่วยความจำที่ใช้โดย SQL Server เมื่อฉันตรวจสอบsys.dm_os_buffer_descriptorsฉันเห็นว่าหน้าเว็บหลุดจากแคช - แต่ยังมีหน่วยความจำเหลืออยู่ 700MB หากไม่มีสิ่งใดต้องการหน่วยความจำคุณจะอธิบายข้อเท็จจริงที่ว่าหน้าถูกลบออกจากแคชได้อย่างไร ฉันคาดหวังว่า SQL Server จะลบหน้าเมื่อต้องการหน่วยความจำเท่านั้น ตาราง temp ที่จัดสรรคืนไม่มีปัญหาบนเซิร์ฟเวอร์นี้ My PLE คือ 3632 แคชโพรซีเดอร์คือ 2182 MB ฉันคาดว่าหน้าเว็บจะลดลงเมื่อไม่มีหน่วยความจำเหลือ แต่ฉันมี 700MB ฟรีหรือฉันเข้าใจผิด ใครช่วยกรุณาลองอธิบายพฤติกรรมนี้ได้ไหม SQL Server กำลังอ่านจากดิสก์ด้วยดังนั้นฉันคิดว่าฉันอาจสรุปได้ว่าไม่ใช่ทุกหน้าที่ต้องการอยู่ในหน่วยความจำ ฉันทำการค้นคว้าเพิ่มเติมและฉันอ่านหน้าจำนวนมากจากดิสก์ลงในหน่วยความจำและสังเกตเห็นบางสิ่งใน taskmanager ระหว่างการอ่าน: หน่วยความจำที่ใช้ไปเพิ่มขึ้นจาก 7.0GB …

1
ประสิทธิภาพของตารางในหน่วยความจำแย่กว่าตารางแบบดิสก์
ฉันมีตารางใน SQL Server 2014 ที่มีลักษณะดังต่อไปนี้: CREATE TABLE dbo.MyTable ( [id1] [bigint] NOT NULL, [id2] [bigint] NOT NULL, [col1] [int] NOT NULL default(0), [col2] [int] NOT NULL default(0) ) ด้วย (id1, id2) เป็น PK โดยพื้นฐานแล้ว id1 เป็นตัวระบุเพื่อจัดกลุ่มชุดผลลัพธ์ (id2, col1, col2) ซึ่ง pk คือ id2 ฉันพยายามใช้ตารางในหน่วยความจำเพื่อกำจัดตารางดิสก์ที่มีอยู่ซึ่งเป็นคอขวดของฉัน ข้อมูลในตารางถูกเขียน -> อ่าน -> ลบหนึ่งครั้ง ค่า …

1
ผลรวมช่วงเวลาของวันที่ภายในคอลัมน์เดียวกัน
คุณจะหาผลรวมของความแตกต่างของช่วงวันที่ในคอลัมน์เดียวกันระหว่างแถวแทรกได้อย่างไร ฉันมีคอลัมน์ Datetime และต้องการคำนวณความแตกต่างระหว่างแถว ฉันต้องการความแตกต่างในวินาที คำถามนี้ไม่ได้เกี่ยวกับวิธีสร้างความแตกต่างระหว่างการประทับเวลา 2 ครั้ง แต่จะเน้นไปที่วิธีการคำนวณที่มีประสิทธิภาพมากที่สุดระหว่างแถวในตารางเดียวกัน ในกรณีของฉันแต่ละแถวมีประเภทกิจกรรมวันที่ที่เชื่อมโยงกัน 2 แถวด้วยกันอย่างมีเหตุผล รายละเอียดที่เกี่ยวข้องกับวิธีการจัดกลุ่มประเภทเหตุการณ์ของการเริ่มต้นและสิ้นสุด (คำถามของ Andriy M) การเริ่มต้นและสิ้นสุด "ควร" ติดต่อกัน หากการเริ่มต้นไม่มีจุดสิ้นสุดที่ตามมาควรจะถูกปล่อยออกจากผลรวม การย้ายไปยังจุดเริ่มต้นถัดไปเพื่อดูว่ามีจุดจบหรือไม่ ควรเพิ่มจุดเริ่มต้น - คู่ที่ต่อเนื่องกันเท่านั้นในผลรวมของวินาทีทั้งหมด ทำงานใน postgresql 9.x ... ตัวอย่างข้อมูลในตาราง eventtype, eventdate START, 2015-01-01 14:00 END, 2015-01-01 14:25 START, 2015-01-01 14:30 END, 2015-01-01 14:43 START, 2015-01-01 14:45 END, 2015-01-01 14:49 START, …

6
ตัดช่องว่าง (ช่องว่างแท็บบรรทัดใหม่)
ฉันใช้ SQL Server 2014 และฉันต้องล้างช่องว่างจากจุดเริ่มต้นและจุดสิ้นสุดของเนื้อหาคอลัมน์ซึ่งช่องว่างอาจเป็นช่องว่างแบบง่ายแท็บหรือการขึ้นบรรทัดใหม่ (ทั้ง\nและ\r\n) เช่น ' this content ' should become 'this content' ' \r\n \t\t\t this \r\n content \t \r\n ' should become 'this \r\n content' และอื่น ๆ ฉันสามารถทำได้เฉพาะกรณีแรกด้วย UPDATE table t SET t.column = LTRIM(RTRIM(t.column)) แต่สำหรับกรณีอื่น ๆ มันไม่ทำงาน

2
การมองเห็นแถวถูกกำหนดอย่างไร?
ในกรณีที่ง่ายที่สุดเมื่อเราแทรกแถวใหม่ลงในตาราง (และการทำธุรกรรม) มันจะปรากฏให้เห็นในการทำธุรกรรมที่ตามมาทั้งหมด ดูxmaxเป็น 0 ในตัวอย่างนี้: CREATE TABLE vis ( id serial, is_active boolean ); INSERT INTO vis (is_active) VALUES (FALSE); SELECT ctid, xmin, xmax, * FROM vis; ctid │xmin │ xmax │ id │ is_active ───────┼─────┼──────┼────┼─────────── (0,1) │2699 │ 0 │ 1 │ f เมื่อเราอัปเดต (เนื่องจากการตั้งค่าสถานะถูกกำหนดFALSEโดยไม่ได้ตั้งใจ) จะมีการเปลี่ยนแปลงเล็กน้อย: UPDATE vis …

4
MySQL - mysql_upgrade - เกิดข้อผิดพลาด: ไม่สามารถตั้งค่าตัวแปรเซิร์ฟเวอร์
ฉันเรียกใช้ MySQL 5.7.11 ภายในภาพนักเทียบท่าอย่างเป็นทางการ เมื่อฉันต้องการอัพเกรดฉันได้รับข้อผิดพลาดต่อไปนี้: mysql_upgrade -uroot -p password: Error occurred: Cannot setup server variables. ฉันค้นหาไปรอบ ๆ ไม่พบคำใบ้ใด ๆ ฉันพยายามวิ่งด้วย--verboseแต่ไม่มีโชค สำหรับการอ้างอิงที่นี่เป็นบันทึกเมื่อฉันเริ่ม db: db_1 | 2016-02-17T11:23:10.453190Z 0 [ERROR] Incorrect definition of table performance_schema.events_waits_current: expected column 'NESTING_EVENT_TYPE' at position 15 to have type enum('TRANSACTION','STATEMENT','STAGE','WAIT', found type enum('STATEMENT','STAGE','WAIT'). db_1 | 2016-02-17T11:23:10.453233Z 0 [ERROR] …
10 mysql  upgrade 

1
ทำไม suser_name () ไม่แสดงการเปลี่ยนแปลงชื่อบัญชีโฆษณา?
ชื่อผู้ใช้ของเรามีการเปลี่ยนแปลงอย่างถูกต้องตามกฎหมายดังนั้นเราจึงเปลี่ยนชื่อผู้ใช้ Active Directory ให้ตรงกัน - จาก domain \ oldname เป็น domain \ newname อย่างไรก็ตามเมื่อ suser_sname () ถูกเรียกโดยผู้ใช้รายนี้ในขั้นตอนการจัดเก็บมันจะส่งคืนชื่อเก่าไม่ใช่ชื่อใหม่ Googling ทำให้ฉันไปที่KB 946358ซึ่งแนะนำว่าชื่อของพวกเขาถูกแคชบนเซิร์ฟเวอร์และไม่ได้อัปเดตน่าจะเป็นเพราะ suser_name () กำลังเรียก LsaLookupSids อย่างไรก็ตามการแก้ปัญหาในบทความนั้นเกี่ยวข้องกับการรีสตาร์ทเซิร์ฟเวอร์และแม้ว่าฉันจะยังคงต้องการที่จะเข้าใจปัญหา หากฉันเปลี่ยนบริบทเป็นชื่อที่ถูกต้องจะกลับมา: EXECUTE AS LOGIN = 'domain\newname' GO SELECT suser_name() --returns 'domain\newname' ... ฉันจะสันนิษฐานว่าสิ่งนี้จะเรียก LsaLookupSids และจะส่งคืนชื่อที่ไม่ถูกต้อง ดูเหมือนว่าฉันจะไม่เข้าใจกลไกการทำงานที่นี่จริงๆ ข้อสังเกตบางอย่างที่อาจสำคัญ: ผู้ใช้รายนี้ไม่มีการเข้าสู่ระบบที่ชัดเจนบนเซิร์ฟเวอร์ แต่พวกเขาเป็นสมาชิกของกลุ่มโฆษณาที่ทำ ชื่อที่เปลี่ยนแปลง (โดเมน \ newname) จะปรากฏในชุดผลลัพธ์สำหรับexec xp_logininfo …

4
วิธีการแปลงอินสแตนซ์เริ่มต้นเป็นอินสแตนซ์ที่มีชื่อใน SQL Server 2012
วิธีการแปลงอินสแตนซ์เริ่มต้นเป็นอินสแตนซ์ที่มีชื่อใน SQL Server 2012 โดยไม่ได้ตั้งใจฉันเลือกตัวเลือกอินสแตนซ์เริ่มต้นและติดตั้งแล้ว ตอนนี้ฉันต้องเปลี่ยนเป็นอินสแตนซ์ที่มีชื่อ วิธีการเปลี่ยน
10 sql-server 

2
วิธีระบุพารามิเตอร์เริ่มต้นของ SQL ในการติดตั้งแบบไม่โต้ตอบผ่านบรรทัดคำสั่ง
ฉันต้องการแก้ไขข้อบกพร่องช่องว่างของตัวตนใน SQL Server 2012 ผ่าน-T272พารามิเตอร์เริ่มต้น ฉันจะทำให้สิ่งนี้เป็นอัตโนมัติหลังจากการติดตั้งได้อย่างไร ฉันไม่พบพารามิเตอร์การติดตั้งสำหรับพารามิเตอร์เริ่มต้น

3
แทนที่อักขระพิเศษในคอลัมน์ด้วยช่องว่าง
ฉันกำลังพยายามเขียนคิวรีที่แทนที่อักขระพิเศษด้วยช่องว่าง โค้ดด้านล่างช่วยในการระบุแถว (อักขระตัวเลขและตัวอักษรจุลภาคและช่องว่างใช้ได้): SELECT columnA FROM tableA WHERE columnA like '%[^a-Z0-9, ]%' ฉันจะรวมฟังก์ชั่นแทนที่ในคำสั่ง select ได้อย่างไรเพื่อให้อักขระทั้งหมดที่ไม่ใช่ตัวอักษรและตัวเลขจุลภาคและช่องว่างในชุดผลลัพธ์ถูกแทนที่ด้วย '' (ช่องว่าง) อันนี้จะไม่ทำงาน: SELECT replace(columnA,'%[^a-Z0-9, ]%',' ') FROM tableA WHERE columnA like '%[^a-Z0-9, ]%'


1
ฐานข้อมูล SQL Server AlwaysOn ติดอยู่ในโหมดไม่ซิงโครไนซ์ / กำลังกู้คืนหลังจากอัปเกรด ข้อผิดพลาด: ไม่สามารถเปิดฐานข้อมูล '…' รุ่น 782
ขณะทดสอบการอัปเกรดจาก SQL Server 2014 SP1 (12.0.4422.0) เป็น SQL Server 2016 CTP 3.2 (13.0.900.73) ฉันทำตามกระบวนการอัปเดตที่แนะนำและพบปัญหาที่ฐานข้อมูลจะไม่เริ่มทำงานบนหลักเก่าหลังจากล้มเหลว ไปยังการปรับปรุงรอง การตั้งค่าของเราเป็นแบบจำลองหลักและแบบจำลองรองเดียวและขั้นตอนที่ฉันทำคือ: ลบ failover อัตโนมัติในแบบจำลองรองกระทำการซิงโครนัส อัพเกรดอินสแตนซ์ของเซิร์ฟเวอร์รองเป็นเวอร์ชันใหม่ ล้มเหลวด้วยตนเองไปยังแบบจำลองรอง ตรวจสอบว่าฐานข้อมูลออนไลน์แบบจำลองหลักใหม่ อัปเกรดเรพพลิกาหลักก่อนหน้าเป็นเวอร์ชันใหม่ การอัพเกรดของรองและ failover เพื่อให้มันทำงานหลักตรงตามที่คาดไว้ แต่หลังจากการอัพเกรดแบบจำลองก่อนหน้านี้หลักที่ผมสังเกตเห็นว่าฐานข้อมูลที่มันถูกระบุไว้ใน SSMS เป็นไม่ตรงกัน / ในการกู้คืน การพยายามเข้าถึงพวกมันจะสร้างข้อความแสดงข้อผิดพลาด: ฐานข้อมูล ... ไม่สามารถเข้าถึงได้ (ObjectExplorer) กำลังตรวจสอบถึงบันทึกของเซิร์ฟเวอร์ SQL ที่ฉันเห็น ไม่สามารถเปิดฐานข้อมูล '... ' เวอร์ชัน 782 อัปเกรดฐานข้อมูลเป็นเวอร์ชันล่าสุด การสอบถามตาราง master..sysdatabases แสดงให้เห็นว่ามันเป็นรุ่นที่เก่ากว่าและไม่ได้รับการอัพเดตในระหว่างการอัพเกรด: น่าเสียดายที่ล็อกไม่ได้ระบุว่าทำไมมันจึงไม่อัปเดตและแดชบอร์ดกลุ่มความพร้อมใช้งานให้เฉพาะคำเตือนทั่วไปที่ระบุสถานะการซิงโครไนซ์ข้อมูลของฐานข้อมูลความพร้อมใช้งานบางอย่างไม่แข็งแรงโดยไม่มีเหตุผล ฉันพยายามใช้ …

1
วิธีการทำซ้ำ“ ไม่สามารถสแกนด้วย NOLOCK ต่อเนื่องจากการเคลื่อนไหวของข้อมูล”
ฉันได้รับบางครั้ง "ไม่สามารถสแกนต่อNOLOCKเนื่องจากการเคลื่อนไหวของข้อมูล" กับงานขนาดใหญ่บางงานซึ่งมีWITH (NOLOCK)ในแบบสอบถามแบบใช้เลือกข้อมูล ฉันเข้าใจว่าสิ่งนี้เกี่ยวข้องกับการพยายามเลือกข้อมูลเมื่อมีการแบ่งหน้าซึ่งทำให้ข้อมูลไม่ได้อยู่ในที่ที่ควรจะเป็นอีกต่อไป - ฉันคิดว่าเป็นสิ่งที่เกิดขึ้นในสภาพแวดล้อมของฉัน ฉันจะทำสิ่งนี้ซ้ำได้อย่างไร ฉันพยายามหาวิธีแก้ปัญหาระยะสั้นเพื่อตรวจจับข้อผิดพลาดและลองใหม่เมื่อเกิดเหตุการณ์นี้ แต่ฉันไม่สามารถทดสอบได้หากฉันไม่สามารถทำซ้ำได้ มีวิธีที่เชื่อถือได้สมเหตุสมผลในการทำให้เกิดสิ่งนี้หรือไม่? เมื่อมันเกิดขึ้นการดำเนินการค้นหาผลลัพธ์อีกครั้งสำเร็จ - ดังนั้นฉันไม่มีข้อกังวลใด ๆ เกี่ยวกับข้อมูลจริงหรือฐานข้อมูลที่เสียหายอย่างถาวร บางตารางในแบบสอบถาม (พร้อมกับดัชนี) ลดลงสร้างใหม่และ repopulated บ่อยครั้งดังนั้นฉันคิดว่ามันเป็นสิ่งที่เกี่ยวข้อง การลบออกNOLOCKเป็นปัญหาระยะยาวของฉันที่จะจัดการกับ เหตุผลที่NOLOCKใส่ไว้ในตอนแรกก็คือการสืบค้นนั้นแย่มากจนพวกมันหยุดชะงักกับการทำธุรกรรมแบบวันต่อวันดังนั้นพวกเขาจึงNOLOCKช่วยกันหยุดการหยุดชะงัก (ซึ่งใช้ได้ผล) ดังนั้นฉันจึงต้องการความช่วยเหลือจากวงดนตรีในการช่วยเหลือแบบวงดนตรีจนกว่าเราจะสามารถแก้ปัญหาได้อย่างถาวร ถ้าฉันสามารถสร้างมันขึ้นมาใหม่ได้ด้วย Hello World ฉันจะวางแผนว่าจะตบวงช่วยเหลือเข้ากับงานในเวลาไม่ถึงหนึ่งชั่วโมง ไม่สามารถทำการลบ - ค้นหา - และ - แทนที่NOLOCKเพราะฉันเริ่มได้รับการหยุดชะงักของแอพอีกครั้งซึ่งแย่กว่าสำหรับฉันมากกว่างานที่ล้มเหลวเป็นครั้งคราว การใช้การแยกสแนปชอตแบบอ่านข้อมูลมุ่งมั่นเป็นไปได้ที่ดี - ฉันจะต้องทำงานกับทีมฐานข้อมูลของเราเพื่อรับรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งนั้น ปัญหาส่วนหนึ่งของเราคือเราไม่มีผู้เชี่ยวชาญ SQL Server ที่จะจัดการกับสิ่งนั้นและฉันไม่เข้าใจระดับการแยกได้ดีพอที่จะทำการเปลี่ยนแปลงในตอนนี้

2
สามารถกำหนดค่า / ใช้ sp_executesql เป็นค่าเริ่มต้นได้หรือไม่
ฉันกำลังดูแอปพลิเคชันที่ใช้การสืบค้น SQL แบบไดนามิกสูงกับ SQL Server ดูคำถามที่สร้างขึ้นด้วยวิธีที่แปลกและซับซ้อนมาก แต่นั่นเป็นเรื่องที่แตกต่างฉันบอกให้เหตุผลที่ดีสำหรับฉันที่ไม่สามารถ (โง่เกินไป) เพื่อค้นหาสิ่งต่าง ๆ ด้วยตัวเอง ... ฉันมองไม่เห็น รหัสใด ๆ sp_executesqlที่คำสั่งจะถูกห่อด้วย sp_executesqlแต่เมื่อผมติดตามฉันสามารถดูจำนวนมากของคำสั่งที่มาในห่อด้วย โซลูชันแอปพลิเคชันทั้งหมดไม่มีแม้แต่คำสั่งsp_executesqlเลย ดังนั้นฉันสงสัยว่ามีการกำหนดค่าชนิดใดที่ฉันยังไม่รู้ซึ่งบังคับให้ซอฟต์แวร์ตัดคำสั่งด้วย sp_executesql โดยค่าเริ่มต้นหรือไม่ สิ่งที่อาจทำให้เกิดพฤติกรรมนี้

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