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

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

7
ปรับช่วงตัวเลข (ช่วงเวลา) ให้เหมาะสมที่สุดใน SQL Server
คำถามนี้คล้ายกับการเพิ่มประสิทธิภาพการค้นหาช่วง IP หรือไม่ แต่อันนั้นถูก จำกัด ไว้ที่ SQL Server 2000 สมมติว่าฉันมี 10 ล้านช่วงที่จัดเก็บไว้ชั่วคราวในตารางที่มีโครงสร้างและมีประชากรดังนี้ CREATE TABLE MyTable ( Id INT IDENTITY PRIMARY KEY, RangeFrom INT NOT NULL, RangeTo INT NOT NULL, CHECK (RangeTo > RangeFrom), INDEX IX1 (RangeFrom,RangeTo), INDEX IX2 (RangeTo,RangeFrom) ); WITH RandomNumbers AS (SELECT TOP 10000000 ABS(CRYPT_GEN_RANDOM(4)%100000000) AS Num FROM …

1
วางแผนขนาดแคชและหน่วยความจำที่สงวนไว้
เมื่อรันเคียวรีรวมถึงแผนการดำเนินการตามจริงผู้ดำเนินการรูท ( SELECT) จะบอกฉันว่าขนาดแผนแคชคือ 32KB แบบสอบถามที่เข้าร่วมsys.dm_exec_cached_plansและsys.dm_os_memory_objectsมองไปที่แผนดังกล่าวกล่าวว่าค่าสำหรับpages_in_bytesและmax_pages_in_bytesคือ 32768 (32KB) ซึ่งตรงกับขนาดแผนแคช สิ่งที่ฉันไม่เข้าใจคือสิ่งที่มีค่าsys.dm_exec_cached_plans.size_in_bytesซึ่งคือ 49152 (48KB) ฉันได้อ่าน BOL ในคอลัมน์เหล่านี้ทั้งหมดและโดยเฉพาะsize_in_bytesที่บอกว่า: " จำนวนไบต์ที่ใช้โดยวัตถุแคช " ฉันไม่สามารถรับจิ๊กซอว์ชิ้นสุดท้ายได้เพื่อทำความเข้าใจความหมายของมัน ฉันรู้ว่าตัวดำเนินการทั้งหมด (ไม่ได้พูดถึงการให้สิทธิ์หน่วยความจำเพิ่มเติมที่ใช้สำหรับการเรียงลำดับและแฮช) ต้องใช้หน่วยความจำคงที่จำนวนหนึ่งเพื่อจัดเก็บสถานะทำการคำนวณ ฯลฯ ซึ่งจัดเก็บไว้ด้วยแผนเพิ่มประสิทธิภาพในแคช ดังนั้นคำถามของฉันคือ: อะไรsize_in_bytesจริงๆหมายถึง เพราะเหตุใดจึงมีมูลค่าสูงกว่า "ขนาดแผนแคช" จำนวนหน่วยความจำคงที่สำหรับตัวดำเนินการทั้งหมด / ตัวจองที่จองไว้กับ "ขนาดแผนแคช" (32Kb ในตัวอย่างของฉัน) หรือที่อื่น? ฉันรู้ว่าพวกเขาเป็น DMV ที่แตกต่างกันและมีฟังก์ชั่นต่างกัน แผนเรียบเรียง (แคช) sys.dm_exec_cached_plansรวมsys.dm_os_memory_objectsในmemory_object_addressคอลัมน์ เหตุผลที่ฉันโพสต์คำถามที่นี่คือฉันขอความช่วยเหลือในเรื่องนี้เข้าใจวิธีตีความ DMV และคอลัมน์ของพวกเขา ถ้าsize_in_bytesขนาดของแผนแคชทำไม SQL Server ถึงพูดถึงค่าอื่นในแผนการดำเนินการจริง แบบสอบถามใหม่หมายเลขใหม่: แผนจริง …

4
ทำไมการสำรองข้อมูลส่วนต่างไม่สามารถระบุฐานได้
นี่เป็นโพสต์ DBA.SE แรกของฉันดังนั้นโปรดแจ้งความผิดพลาดใด ๆ ขอบคุณ! ฉันเป็น DBA ใหม่ (ไม่ใช่มืออาชีพด้านไอทีไม่มีใครทำใน บริษัท ) ดังนั้นคำอธิบายพื้นฐานที่ดีกว่าก็ดีกว่า ฉันได้อ่านเกี่ยวกับกลยุทธ์การสำรองฐานข้อมูล (หรืออย่างที่ฉันได้เรียนรู้ที่จะเรียกพวกเขาว่า "คืนค่ากลยุทธ์") ฉันเข้าใจว่าการสำรองข้อมูล Full, Differential และ Transaction Log ทำอะไร แต่ฉันต้องการทราบว่าเหตุใดการสำรองข้อมูลส่วนต่างสามารถทำได้โดยใช้การสำรองข้อมูลเต็มรูปแบบล่าสุดเท่านั้น หากการสำรองข้อมูลส่วนต่างคือทุกสิ่งที่เปลี่ยนแปลงตั้งแต่การสำรองข้อมูลเต็มรูปแบบครั้งล่าสุดเหตุใดจึงไม่สามารถใช้การสำรองข้อมูลที่แตกต่างจากการสำรองข้อมูลใด ๆ ที่ฉันเลือกได้ เพื่อความชัดเจนมากขึ้นฉันถามเกี่ยวกับการระบุฐานเมื่อมีการสำรองข้อมูลไม่ใช่เมื่อกู้คืน ฉันสมมติว่าเมื่อกู้คืนคุณจะเลือกฐานที่ถูกต้องและส่วนต่างที่สอดคล้องกันเพื่อทำการกู้คืน (ไม่ได้ใช้ส่วนต่างจากฐาน B เพื่อกู้คืนจากฐาน A) อะไรคือสาเหตุที่ทำให้ไม่สามารถใช้งานฟังก์ชั่นนี้ได้? ฉันคิดว่าต้องมีเหตุผลฉันไม่รู้ว่ามันคืออะไร หมายเหตุ: ผมเข้าใจว่าฐานที่ไม่สามารถระบุ แต่คำถามของฉันคือทำไมไม่ ? (ฉันไม่สนใจที่จะพูดคุยเกี่ยวกับ "ทำไมต้องเป็นคุณ") การเปรียบเทียบ นี่คือการเปรียบเทียบสำหรับวิธีที่ฉันเข้าใจการสำรองข้อมูลที่แตกต่างกัน: ฉันมีไฟล์ Excel พร้อมข้อมูลบางอย่างในเซลล์ ในวันที่ 1 ฉันทำสำเนาของไฟล์นี้และเก็บไว้ที่อื่น ("การสำรองข้อมูลทั้งหมด") ในวันที่ …

2
ไม่สามารถกำหนดวันที่เป็น CURRENT_TIMESTAMP ใน MySQL 5.5 ได้
ฉันไม่สามารถตั้งCurrent_timestampเป็นค่าเริ่มต้นได้ ฉันรุ่นMysql5.5.47 ข้อความค้นหาคือ ALTER TABLE `downloads` ADD `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ; mysql V5.6.56ในขณะที่มันทำงานได้ดีบนฐานข้อมูลท้องถิ่นของฉันด้วย

2
วิธีรับ ID ของแถวที่ขัดแย้งกันใน upsert?
ฉันมีตารางที่tagมี 2 ​​คอลัมน์: id(uuid) และname(ข้อความ) ตอนนี้ฉันต้องการแทรกแท็กใหม่ลงในตาราง แต่ถ้ามีแท็กนั้นอยู่แล้วฉันต้องการเพียงรับidบันทึกที่มีอยู่ ฉันคิดว่าฉันสามารถใช้ON CONFLICT DO NOTHINGร่วมกับRETURNING "id": INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT DO NOTHING RETURNING "id"; แต่จะส่งคืนชุดผลลัพธ์ที่ว่างเปล่าหากมีแท็กชื่อ "foo" อยู่แล้ว ฉันเปลี่ยนแบบสอบถามเพื่อใช้ส่วนDO UPDATEคำสั่งnoop : INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT ("name") DO UPDATE SET "name" = 'foo' RETURNING "id"; มันใช้งานได้ตามที่ตั้งใจ …

2
เหตุใดจึงใช้เวลานานกว่าในการสร้างดัชนีหลังจากขนาดคอลัมน์เพิ่มขึ้น
ผู้ขายของเราเปลี่ยนความกว้างของคอลัมน์ในเกือบทุกคอลัมน์ในฐานข้อมูลทั้งหมด ฐานข้อมูลอยู่ที่ประมาณ 7TB, 9000+ ตาราง เรากำลังพยายามสร้างดัชนีบนตารางที่มี 5.5 พันล้านแถว ก่อนการอัพเกรดของผู้ขายเราสามารถสร้างดัชนีได้ภายใน 2 ชั่วโมง ตอนนี้ต้องใช้เวลาหลายวัน สิ่งที่พวกเขาทำคือเพิ่มขนาด varchar (xx) เป็น varchar (256) ดังนั้นคอลัมน์ส่วนใหญ่เคยเป็น varchar (18) หรือ varchar (75) เป็นต้น อย่างไรก็ตามคีย์หลักประกอบด้วย 6 คอลัมน์ที่มีความกว้างรวมกันคือ 126 ตัวอักษร หลังจากอัปเกรดแล้วคีย์หลักคือ 1283 ตัวอักษรซึ่งละเมิดข้อ จำกัด ของเซิร์ฟเวอร์ SQL 900 ตัวอักษร ความกว้างคอลัมน์ของตารางทั้งหมดเพิ่มขึ้นจากการนับรวม varchar รวม 1049 ถึงการรวม varchar รวม 4009 ไม่มีข้อมูลเพิ่มขึ้นตารางไม่ใช้พื้นที่ "เกิน" มากกว่าที่เคยทำก่อนที่ความกว้างของคอลัมน์จะเพิ่มขึ้นทั้งหมด แต่ประสิทธิภาพในการสร้างบางอย่างเรียบง่ายเช่นเดียวกับดัชนีขณะนี้ใช้เวลานานเกินไป …

2
เหตุใดตัวแปรตารางบังคับให้สแกนดัชนีในขณะที่ตาราง temp ใช้การค้นหาและคั่นหน้าการค้นหา
ฉันพยายามที่จะเข้าใจว่าทำไมการใช้ตัวแปรตารางทำให้เครื่องมือเพิ่มประสิทธิภาพไม่สามารถใช้การค้นหาดัชนีจากนั้นทำบุ๊กมาร์กการค้นหากับการสแกนดัชนี การเติมตาราง: CREATE TABLE dbo.Test ( RowKey INT NOT NULL PRIMARY KEY, SecondColumn CHAR(1) NOT NULL DEFAULT 'x', ForeignKey INT NOT NULL ) INSERT dbo.Test ( RowKey, ForeignKey ) SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY (SELECT 0)), ABS(CHECKSUM(NEWID()) % 10) FROM sys.all_objects s1 CROSS JOIN sys.all_objects s2 CREATE INDEX …

8
เหตุใดค่าคีย์หลักจึงเปลี่ยนไป
ฉันได้ค้นคว้าแนวคิดของ ROWGUID เมื่อเร็ว ๆ นี้และได้พบกับคำถามนี้ คำตอบนี้ให้ข้อมูลเชิงลึก แต่ทำให้ฉันลงหลุมกระต่ายที่แตกต่างกับการกล่าวถึงการเปลี่ยนค่าคีย์หลัก ความเข้าใจของฉันคือกุญแจหลักที่ไม่ควรเปลี่ยนและการค้นหาของฉันตั้งแต่การอ่านคำตอบนี้ได้ให้คำตอบที่สะท้อนการปฏิบัติที่ดีที่สุดเท่านั้น ค่าคีย์หลักจะต้องมีการเปลี่ยนแปลงภายใต้สถานการณ์ใดหลังจากสร้างเรคคอร์ดแล้ว

1
TVF ที่มีหลายงบและประสิทธิภาพแบบอินไลน์ TVF
การเปรียบเทียบคำตอบบางส่วนกับคำถาม Palindrome (เฉพาะผู้ใช้ 10k + เท่านั้นเนื่องจากฉันได้ลบคำตอบแล้ว) ฉันจึงได้ผลลัพธ์ที่สับสน ฉันเสนอTVFซึ่งมีหลายสคีมาซึ่งฉันคิดว่าน่าจะเร็วกว่าการใช้งานฟังก์ชั่นมาตรฐานซึ่งเป็น ฉันยังอยู่ภายใต้ความประทับใจที่ TVF หลายงบจะ "อินไลน์" แม้ว่าฉันจะผิดในการนับที่คุณจะเห็นด้านล่าง คำถามนี้เกี่ยวกับความแตกต่างด้านประสิทธิภาพของ TVF ทั้งสองรูปแบบ ก่อนอื่นคุณจะต้องเห็นรหัส นี่คือ TVF หลายงบ: IF OBJECT_ID('dbo.IsPalindrome') IS NOT NULL DROP FUNCTION dbo.IsPalindrome; GO CREATE FUNCTION dbo.IsPalindrome ( @Word NVARCHAR(500) ) RETURNS @t TABLE ( IsPalindrome BIT NOT NULL ) WITH SCHEMABINDING AS BEGIN DECLARE …

3
จะอัพเกรด PostgreSQL จากเวอร์ชั่น 8.4 เป็น 9.4 ได้อย่างไร
ฉันต้องการที่จะอัพเกรด PostgreSQL ของฉันจากเวอร์ชัน8.4ไป9.4 เอกสารไม่ได้เป็นอย่างชัดเจนกับผม ฉันจะสูญเสียฐานข้อมูลเก่าของฉันหรือไม่ถ้าฉันทำการอัพเกรด ฉันจะสำรองฐานข้อมูลเก่าของฉันได้อย่างไรหากฉันสูญเสียฐานข้อมูลหลังจากการอัปเกรด ฉันจะอัพเกรด psql ของฉันได้อย่างไร PostgreSQL ของฉันกำลังทำงานบนเซิร์ฟเวอร์CentOS 6.6

4
สำหรับ XML ไม่สามารถทำให้ข้อมูลเป็นอนุกรมเนื่องจากมีอักขระ (0x0000)
ฉันมีคำถามใหญ่ (ถ้าจำเป็นฉันจะโพสต์ไว้ที่นี่) และฉันได้รับข้อผิดพลาดนี้: ข่าวสารเกี่ยวกับ 6841, ระดับ 16, สถานะ 1, บรรทัดที่ 1 สำหรับ XML ไม่สามารถทำให้เป็นอนุกรมข้อมูลสำหรับโหนด 'NoName' เนื่องจากมีอักขระ (0x0000) ซึ่งไม่ได้รับอนุญาตใน XML ในการดึงข้อมูลนี้โดยใช้ FOR XML ให้แปลงเป็นประเภทข้อมูลไบนารี, varbinary หรือรูปภาพและใช้คำสั่ง BINARY BASE64 ส่วนเดียวที่ฉันใช้FOR XMLอยู่ที่นี่: WHERE (CodFuncionario = Results.CodFuncionario) FOR XML PATH(''), TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '') AS [Experiencia] แต่อะไรนะnode noname? และฉันจะมองหาค่านี้ได้อย่างไร:(0x0000) นี่เป็นหนึ่งในแบบสอบถามย่อย (ส่วนเดียวที่ฉันมีสำหรับ XML): SELECT …

1
อธิบายการวิเคราะห์ไม่แสดงรายละเอียดของการสืบค้นภายในฟังก์ชั่น plpgsql
ฉันใช้ฟังก์ชั่น PL / pgSQL ใน PostgreSQL 9.3 พร้อมกับคำสั่งที่ซับซ้อนหลายอย่างภายใน create function f1() returns integer as $$ declare event tablename%ROWTYPE; .... .... begin FOR event IN SELECT * FROM tablename WHERE condition LOOP EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return; END LOOP; ... INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN …

5
mysqldump Error 2013
ฉันมีฐานข้อมูลติดตั้งไว้แล้วและฉันต้องการสำรองข้อมูลใน mysql ปัญหาmysqldumpล้มเหลวในการส่งออกตาราง 'maia_mail' # mysqldump -u root -p maia > maia.sql mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table `maia_mail` at row: 15 มันทำงานน้อยกว่า 30 วินาทีและได้รับข้อผิดพลาดตามข้างต้น ขนาดรวมของฐานข้อมูลคือ 1.3GB โดยมีตาราง maia_mail เป็น 1.0GB ในmy.cnfชุดนี้มี: [mysqld] max_allowed_packet = 1300M [mysqldump] max_allowed_packet = 1300M โปรดแนะนำหรือให้คำแนะนำเกี่ยวกับวิธีการถ่ายโอนฐานข้อมูลหรือไม่

12
ใช้อักษรตัวแรกของแต่ละคำของแต่ละประโยคใน SQL Server
ฉันต้องการใช้อักษรตัวแรกของแต่ละคำของแต่ละประโยคในคอลัมน์ SQL ตัวอย่างเช่นถ้าประโยคคือ: 'ฉันชอบภาพยนตร์' แล้วฉันต้องการผลลัพธ์: 'ฉันชอบหนัง' ค้นหา: declare @a varchar(15) set @a = 'qWeRtY kEyBoArD' select @a as [Normal text], upper(@a) as [Uppercase text], lower(@a) as [Lowercase text], upper(left(@a,1)) + lower(substring(@a,2,len(@a))) as [Capitalize first letter only] ที่นี่ฉันเขียนอักษรตัวแรกตัวบนล่างและพิมพ์ใหญ่ในคอลัมน์ของฉันเท่านั้น (ที่นี่ฉันใส่คำแบบสุ่ม) นี่คือผลลัพธ์ของฉัน: มีความเป็นไปได้ที่จะทำเช่นนั้น? ความเป็นไปได้ใด ๆ ที่จะได้ผลลัพธ์โดยไม่ต้องใช้ฟังก์ชั่นที่ผู้ใช้กำหนด? ฉันต้องการผลลัพธ์ Qwerty Keyboard

2
วิธีวัดหรือค้นหาค่าใช้จ่ายในการสร้างแผนแบบสอบถาม
ฉันมีกรณีทั่วไปที่การดมพารามิเตอร์ทำให้แผนการดำเนินการ "ไม่ดี" ลงจอดในแคชแผนทำให้การดำเนินการที่ตามมาของโพรซีเดอร์ที่เก็บไว้ของฉันช้ามาก ฉันสามารถ "แก้" ปัญหานี้กับตัวแปรท้องถิ่นและOPTIMIZE FOR ... UNKNOWN OPTION(RECOMPILE)อย่างไรก็ตามฉันสามารถดำน้ำในแบบสอบถามและพยายามปรับให้เหมาะสม ฉันพยายามที่จะตรวจสอบว่าฉันควร : กำหนดเวลาที่ จำกัด ในการแก้ไขปัญหาที่ฉันต้องการทราบค่าใช้จ่ายของการไม่ทำมัน ตามที่เห็นถ้าฉันเพิ่งติดกับOPTION(RECOMPILE)ผลกระทบสุทธิคือแผนแบบสอบถามจะถูกสร้างขึ้นใหม่ทุกครั้งที่มีการเรียกใช้แบบสอบถาม ดังนั้นฉันคิดว่าฉันต้องรู้: จะทราบได้อย่างไรว่าต้นทุนการสร้างแผนแบบสอบถามเป็นอย่างไร เพื่อตอบคำถามของฉันฉันได้ Googled (เช่นกับการค้นหานี้ ) และฉันได้อ่านเอกสารของคอลัมน์สำหรับ dm_exec_query_statsDMVแล้ว ฉันได้ตรวจสอบหน้าต่างผลลัพธ์ใน SSMS สำหรับ "Actual Query Plan" เพื่อค้นหาข้อมูลนี้ สุดท้ายผมได้DBA.SE สืบค้น ไม่มีคำตอบใดที่นำไปสู่ มีใครบอกฉันได้บ้าง เป็นไปได้หรือไม่ที่จะค้นหาหรือวัดเวลาที่จำเป็นสำหรับการสร้างแผน

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