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

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

5
อัพเดตแถวที่มีอยู่ด้วยหมายเลข / ถ่านหรือข้อมูลที่ไม่ซ้ำ
ฉันเพิ่มคอลัมน์ใหม่ในตาราง X คอลัมน์ "cn" นี้จะต้องไม่ซ้ำกันและจำเป็น แต่ข้อมูลเก่าไม่มีค่าใด ๆ จะอัปเดตระเบียนที่มีอยู่ด้วยข้อมูลเฉพาะที่เป็นลำดับหรือสุ่มได้อย่างไร ขอขอบคุณ.
13 sql-server 

3
เป็นไปได้หรือไม่ที่จะสร้างการเชื่อมต่อผู้ดูแลระบบเฉพาะ (DAC) โดยใช้ SSMS
เป็นไปได้หรือไม่ที่จะเชื่อมต่อกับ DAC โดยใช้ SSMS? หากฉันเข้าใจถูกต้องควรใช้คำนำหน้า "admin:" หน้าชื่อเซิร์ฟเวอร์ แต่ฉันได้รับข้อความต่อไปนี้: การเชื่อมต่อผู้ดูแลระบบเฉพาะไม่ได้รับการสนับสนุนผ่าน SSMS เนื่องจากจะสร้างการเชื่อมต่อที่หลากหลายโดยการออกแบบ (Microsoft.SqlServer.Management.SqlStudio.Explorer)

2
เหตุใด MySQL จึงสร้างตารางชั่วคราวจำนวนมากบนดิสก์
ความผิดพลาดในการตั้งค่าใด ๆ อาจนำไปสู่การสร้างตารางชั่วคราวมากเกินไปโดย mysql..mysql tuner แสดง Current max_heap_table_size = 200 M Current tmp_table_size = 200 M Of 17158 temp tables, 30% were created on disk table_open_cache = 125 tables table_definition_cache = 256 tables You have a total of 97 tables You have 125 open tables. Current table_cache hit rate is …
13 mysql  innodb  myisam  memory 

1
จะควบคุมการใช้ ram มากเกินไปโดย SQL Server ได้อย่างไร?
เซิร์ฟเวอร์ฐานข้อมูลที่ฉันใช้กำลังเรียกใช้อินสแตนซ์ของ SQL Server 6 อินสแตนซ์ที่ต่างกัน มี RAM 48 GB และหนึ่งในนั้นใช้ RAM มากกว่า 10 GB การบริโภคทั้งหมดคือ 20 GB สำหรับตอนนี้ ปริมาณการใช้ RAM เติบโตอย่างต่อเนื่อง สองสามวันก่อนที่จะใช้ RAM มากกว่า 40 GB และเซิร์ฟเวอร์ตอบสนองช้ามาก แอปพลิเคชันแสดงปัญหาการขัดข้องเมื่อบันทึกข้อมูล ดังนั้นฉันเริ่มบริการ SQL Server ใหม่ ทันทีที่เริ่มบริการใหม่การใช้งานก็ลดลงเหลือ 4 GB แต่ตอนนี้กำลังเพิ่มขึ้น และฉันกังวลว่าจะเพิ่มขึ้นถึง 40 GB ใน 4 หรือ 5 วันและทำให้เซิร์ฟเวอร์ทำงานช้า การรีสตาร์ทบริการไม่ใช่ตัวเลือกที่ดีที่ฉันเดา ฉันพบจากแหล่งต่าง ๆ ที่เราสามารถกำหนดขนาดการใช้หน่วยความจำสูงสุดสำหรับ SQL Server …
13 sql-server 

2
มีประโยชน์ใดบ้างในการเรียงลำดับคอลัมน์เมื่อกำหนดดัชนี
ตัวอย่างเช่นถ้าฉันมีสองดัชนี: CREATE INDEX IDX_1 ON MY_TABLE_1 (ITEM, DATE, LOCATION) COMPUTE STATISTICS; CREATE INDEX IDX_2 ON MY_TABLE_1 (DATE, LOCATION, ITEM) COMPUTE STATISTICS; สิ่งนี้จะทำให้IDX_2ซ้ำซ้อนหรือไม่ ถ้าไม่ฉันจะกำหนดลำดับของการประกาศคอลัมน์ได้อย่างไร ฉันควรปรับดัชนีให้เหมาะกับข้อความค้นหาทั่วไปหรือไม่
13 oracle  index 

2
คุณจะลบการกระจายตัวของข้อมูลจากตาราง InnoDB ได้อย่างไร
ฉันมีฐานข้อมูลที่มีจำนวนตาราง ฉันต้องการลบบางระเบียนออกจากตารางว่าไม่มีระเบียนมากกว่า 20K หรือ 50K ตารางทั้งหมดเป็น InnoDB และfile_per_tableเป็นปิด เมื่อฉันจะลบระเบียนจากตารางจำนวนหนึ่งจะมีการกระจายตัวในตาราง มีวิธีใดที่จะกำจัดการแตกแฟรกเมนต์ อัพเดทเมื่อวันที่ 17 เมษายน mysql> select TABLE_NAME, TABLE_SCHEMA, Data_free from information_schema.TABLES where TABLE_SCHEMA NOT IN ('information_schema', 'mysql') and Data_Free >0; +-----------------+--------------+-----------+ | TABLE_NAME | TABLE_SCHEMA | Data_free | +-----------------+--------------+-----------+ | City | world_innodb | 5242880 | | City_Copy | world_innodb | …

4
Mysql int vs varchar เป็นคีย์หลัก (InnoDB Storage Engine?
ฉันสร้างเว็บแอปพลิเคชัน (ระบบการจัดการโครงการ) และฉันสงสัยเกี่ยวกับสิ่งนี้เมื่อพูดถึงประสิทธิภาพ ฉันมีตารางปัญหาอยู่ข้างในนั้นมี 12 ปุ่มต่างประเทศที่เชื่อมโยงกับตารางอื่น ๆ ในบรรดา 8 คนนั้นฉันต้องเข้าร่วมเพื่อรับฟิลด์ชื่อเรื่องจากตารางอื่น ๆ เพื่อให้ระเบียนมีเหตุผลในแอปพลิเคชันเว็บ 1 ฟิลด์สำหรับการรวมแต่ละรายการ ตอนนี้ฉันยังได้รับคำสั่งให้ใช้คีย์หลักที่เพิ่มขึ้นอัตโนมัติ (ยกเว้นการใช้เศษเป็นข้อกังวลในกรณีที่ฉันควรใช้ GUID) สำหรับเหตุผลด้านความคงทน แต่มันแย่ขนาดไหนในการใช้ varchar (ความยาวสูงสุด 32) ฉันหมายถึงส่วนใหญ่ของตารางเหล่านี้อาจไม่ได้มีการบันทึกจำนวนมาก (ส่วนใหญ่ควรต่ำกว่า 20) นอกจากนี้ถ้าฉันใช้ชื่อเป็นคีย์หลักฉันจะไม่ต้องรวม 95% ของเวลาดังนั้นสำหรับ 95% ของ sql ฉันจะเกิดผลการทำงานที่ยอดเยี่ยม (ฉันคิดว่า) ข้อเสียอย่างเดียวที่ฉันคิดได้ก็คือฉันมีคือฉันจะมีการใช้พื้นที่ดิสก์ที่สูงขึ้น เหตุผลที่ฉันใช้ตารางการค้นหาสำหรับสิ่งนี้มากมายแทนที่จะเป็น enums ก็เพราะฉันต้องการค่าทั้งหมดเหล่านี้เพื่อกำหนดค่าโดยผู้ใช้ผ่านแอปพลิเคชันเอง อะไรคือข้อเสียของการใช้ varchar เป็นคีย์หลักสำหรับตารางที่ไม่ได้ยกเว้นที่จะมีหลายระเบียน? อัพเดท - การทดสอบบางอย่าง ดังนั้นฉันจึงตัดสินใจทำการทดสอบเบื้องต้นเกี่ยวกับสิ่งนี้ ฉันมีบันทึก 100,000 รายการและนี่คือการสืบค้นพื้นฐาน: แบบสอบถาม VARCHAR FK …

1
Array ของช่องและขนาดหน้าทั้งหมด
ฉันอ่านต่อในฟอรัมจำนวนมากและในหลาย ๆ บล็อกที่หน้าประกอบด้วยดังต่อไปนี้: ขนาดหน้า: 16 x 512B = 8192B ส่วนหัวของหน้า: = 96B แถว In_Row สูงสุด: = 8060B ใบนี้ (8192 - 96 - 8060) B = 36B ตกลงนี่เป็นตรรกะและถูกต้อง คำถามที่ฉันมีคือ: ทำไมผู้คนมากมายพูดว่า 36B ที่เหลือถูกสงวนไว้สำหรับอาร์เรย์สล็อต? เห็นได้ชัดว่าอาร์เรย์สล็อตให้ 2B ต่อแถวในหน้า; ดังนั้นอาจเล็กเพียง 2B และใหญ่ถึง 1472B: 2B: 1 แถว * 2B = 2B 1472B: 8096B = n * …

4
การล็อกแถว InnoDB - วิธีการนำไปใช้
ตอนนี้ฉันได้ดูรอบ ๆ แล้วอ่านไซต์ mysql และฉันก็ยังไม่เห็นว่ามันทำงานอย่างไร ฉันต้องการเลือกและล็อกแถวผลลัพธ์สำหรับการเขียนเขียนการเปลี่ยนแปลงและปลดล็อค เปิดใช้งาน audocommit โครงการ id (int) name (varchar50) status (enum 'pending', 'working', 'complete') created (datetime) updated (datetime) เลือกรายการที่มีสถานะรอดำเนินการและอัปเดตให้ใช้งานได้ ใช้การเขียนแบบเอกสิทธิ์เฉพาะบุคคลเพื่อให้แน่ใจว่ารายการเดียวกันไม่ได้รับสองครั้ง ดังนั้น; "SELECT id FROM `items` WHERE `status`='pending' LIMIT 1 FOR WRITE" รับ ID จากผลลัพธ์ "UPDATE `items` SET `status`='working', `updated`=NOW() WHERE `id`=<selected id> ฉันต้องทำอะไรเพื่อปลดล็อคและทำงานเหมือนที่ฉันเคยทำด้านบนหรือไม่?
13 mysql  innodb  locking 

1
DBCC CHECKDB ยิงทุก 20 - 60 วินาที
ฉันมีสภาพแวดล้อมแบบ dev ที่กำลังนำไปใช้งานอย่างรวดเร็วในการผลิตและสังเกตเห็นในบันทึกที่ประมาณทุกๆ 20 วินาทีที่ฉันเห็นข้อความ: Starting up database 'dbname' CHECKDB for database 'dbname' finished without errors ฉันสังเกตเห็นสิ่งนี้เพราะผู้ใช้ปลายทางที่ทำการทดสอบนี้มีปัญหาซึ่งฉันแยกเป็นข้อผิดพลาดที่ฉันสังเกตเห็นในบันทึกเหตุการณ์ Windows (แอปพลิเคชันบันทึก): The log for database 'dbname' is not available. Check event log for related messages. บังเอิญฉันไม่พบข้อความที่เกี่ยวข้อง แต่แก้ไขด้วยรอบออฟไลน์ / ออนไลน์ สิ่งเดียวที่ฉันคิดได้ก็คือแอปพลิเคชันนี้รวบรวมข้อมูลทุก ๆ 1 มิลลิวินาที แต่ข้อมูลทั้งหมดนี้ไม่ได้ถูกแทรกลงในฐานข้อมูล เป็นเซิร์ฟเวอร์ dev มันถูกกำหนดค่าเพื่อให้บันทึกและข้อมูลอยู่ในไดรฟ์เดียวกัน ด้วยข้อมูลสองส่วนนี้ฉันจึงเชื่อว่านี่เป็นปัญหา IO และเซิร์ฟเวอร์พยายามกู้คืนจากการขาดการเชื่อมต่อกับที่เก็บข้อมูล (SAN) แต่ถึงอย่างนี้ก็ไม่สมเหตุสมผลสำหรับฉันเพราะมันไม่ได้สูญเสีย …

1
ผลกระทบไฟล์ดิสก์ของการลบและสูญญากาศ
ฉันมีตารางที่อัปเดตบ่อยมากที่มี 240 ล้านแถว (และเพิ่มขึ้น) ทุกๆสามชั่วโมง 1.5 ล้านแถวจะถูกแทรกและ 1.5 ล้านแถวจะถูกลบ เมื่อฉันย้ายคลัสเตอร์ไปยัง SSD เวลาแทรกจำนวนมาก (โดยใช้การคัดลอก) นี้ถูกตัดจาก 22 นาทีเป็น 2.3 นาที เวลาลบก็ดีขึ้นเช่นกัน ฉันวางแผนที่จะทำการอัปเดตจำนวนมากนี้ทุกสองชั่วโมงหรือทุกชั่วโมง แม้ว่าประสิทธิภาพในตอนนี้ (หลังจาก SSD) เข้ากันได้กับการอัปเดตบ่อยครั้งมากขึ้นฉันได้อ่านเรื่องราวสยองขวัญเกี่ยวกับการตายของ SSD เนื่องจากความอดทนของ NAND จำกัด รวมกับการขยายการเขียน เนื่องจาก SSD มีราคาแพงฉันจึงต้องการผลักดันความตายไปสู่อนาคตเท่าที่จะทำได้ ดังนั้นคำถามของฉัน: เกิดอะไรขึ้นกับไฟล์ดิสก์ในการลบและสูญญากาศที่ตามมา? ฉันเดาว่ามีการเขียนดิสก์สองรายการหนึ่งรายการเพื่อทำเครื่องหมายแถวว่าถูกลบและอีกรายการหนึ่งเมื่อดูดฝุ่นเพื่อทำเครื่องหมายว่าพร้อมใช้งานเพื่อเขียนทับ หากแทนที่การลบและการดูดฉันจะแบ่งพาร์ติชันตารางที่สร้างและวางตารางที่แต่ละส่วนแทรก / ลบจำนวนมากฉันจะลดการสึกหรอของ SSD หรือไม่

3
มันจะถือว่าเป็นแนวปฏิบัติที่ไม่ดีที่จะมี FK แบบ nullable หลายรายการบนตารางใน SQL Server หรือไม่
ในโครงสร้างฐานข้อมูลของฉันใน SQL Server ฉันมีผลิตภัณฑ์ 3 ประเภทที่ต้องการข้อมูลที่แตกต่างกันเกี่ยวกับการสั่งซื้อ ดังนั้นฉันสร้างหนึ่งของตารางและสามตารางการสั่งซื้อที่แตกต่างกัน:Customers , , ตารางคำสั่งซื้อทั้งหมดมีความสัมพันธ์แบบหนึ่งต่อหลายบนโต๊ะOrdersForProductAsOrdersForProductBsOrdersForProductCsCustomers ฉันยังมีตารางอื่นที่Paymentsจะเก็บรายละเอียดการชำระเงินไว้ข้างใน แต่ฉันมีข้อสงสัยเกี่ยวกับวิธีการจัดโครงสร้างที่นี่ เนื่องจากฉันมีผลิตภัณฑ์หลายประเภทและลูกค้าอาจมีคำสั่งซื้อหลายผลิตภัณฑ์ในเวลาเดียวกันฉันจึงต้องเชื่อมโยงตารางคำสั่งซื้อทั้งสามนั้นเข้ากับPaymentsตาราง ปัญหาอื่นคือลูกค้าอาจมีคำสั่งซื้อผลิตภัณฑ์เพียงประเภทเดียว ดังนั้นคอลัมน์ FK ในตารางจะต้องมีการPaymentsnullable คำถามของฉันคือว่าnullableคอลัมน์ FK เหล่านั้นจะปวดหัวสำหรับฉันในระยะยาวหรือไม่? โดยทั่วไปแล้วจะถือว่าเป็นการปฏิบัติที่ไม่ดีที่จะมีคอลัมน์ FK ที่ไม่มีค่าว่างบนตารางหรือไม่

2
โอกาสในการออกแบบฐานข้อมูลใหม่: การออกแบบตารางใดที่จะใช้สำหรับการรวบรวมข้อมูลเซ็นเซอร์นี้
พื้นหลัง ฉันมีเครือข่ายเซ็นเซอร์ประมาณ 2,000 ตัวซึ่งแต่ละตัวมีจุดข้อมูลประมาณ 100 จุดที่เรารวบรวมในช่วงเวลา 10 นาที จุดข้อมูลเหล่านี้มักจะเป็นค่า int แต่บางจุดเป็นสตริงและลอย ข้อมูลนี้ควรเก็บไว้ 90 วันหากเป็นไปได้และยังมีประสิทธิภาพ การออกแบบฐานข้อมูล เมื่อมอบหมายงานครั้งแรกกับโครงการนี้ฉันเขียนแอป C # ที่เขียนไฟล์ที่คั่นด้วยเครื่องหมายจุลภาคสำหรับเซ็นเซอร์แต่ละตัว ในเวลาที่มีไม่มากเมื่อมีคนต้องการดูแนวโน้มเราจะเปิด csv ใน Excel และสร้างกราฟตามต้องการ สิ่งต่าง ๆ ขยายตัวและเราเปลี่ยนเป็นฐานข้อมูล MySQL ฉันสร้างตารางสำหรับเซ็นเซอร์แต่ละตัว (ใช่ฉันรู้จำนวนมากของตาราง!); มันใช้งานได้ดี แต่ก็มีข้อ จำกัด อยู่บ้าง ด้วยตารางจำนวนมากจึงเป็นไปไม่ได้ที่จะเขียนแบบสอบถามที่จะค้นหาข้อมูลในเซ็นเซอร์ทั้งหมดเมื่อค้นหาค่าเฉพาะ สำหรับรุ่นถัดไปฉันเปลี่ยนเป็น Microsoft SQL Server Express และวางข้อมูลเซ็นเซอร์ทั้งหมดลงในตารางขนาดใหญ่หนึ่งตาราง นอกจากนี้ยังใช้งานได้และช่วยให้เราสามารถสอบถามเพื่อค้นหาค่าในเซ็นเซอร์ทั้งหมดที่น่าสนใจ อย่างไรก็ตามฉันวิ่งเข้าไปในขีด จำกัด 10GB สำหรับเวอร์ชัน Express และตัดสินใจที่จะเปลี่ยนกลับเป็น MySQL แทนที่จะลงทุนใน …

3
แทรกถ้าไม่มีอยู่พร้อมกัน
ฉันกำลังมีปัญหาการใช้งานพร้อมกันกับส่วนแทรกในขั้นตอนการจัดเก็บ ส่วนที่เกี่ยวข้องของขั้นตอนนี้คือ: select @_id = Id from table1 where othervalue = @_othervalue IF( @_id IS NULL) BEGIN insert into table1 (othervalue) values (@_othervalue) select @_id = Id from table1 where othervalue = @_othervalue END เมื่อเรารัน proc ที่เก็บไว้ 3 หรือ 4 ของพร้อมกันนี้เราได้รับการแทรกหลายครั้ง ฉันกำลังวางแผนในการแก้ไขเช่นนี้: insert into table1 (othervalue) select TOP(1) @_othervalue as …

4
เป็นความคิดที่ดีหรือไม่ที่จะใช้คำพ้องความหมายเพื่อหลีกเลี่ยงการสร้างตารางที่ซ้ำกัน
เรามี 3 ฐานข้อมูลเดียวกันที่แน่นอน ฐานข้อมูล 3 ทั้งหมดมีUsersตารางและผู้ใช้จะมีอยู่เสมอในฐานข้อมูล 3 ทั้งหมดด้วยการตั้งค่าเดียวกันแน่นอน เมื่อใดก็ตามที่เราต้องการเพิ่มหรือแก้ไขผู้ใช้เราต้องอัปเดตฐานข้อมูล 3 แห่ง จะเป็นการดีกว่าหรือไม่ที่จะลบUsersตารางออกจากฐานข้อมูล 2 และ 3 และแทนที่ด้วยSynonymจุดนั้นไปยังฐานข้อมูล 1 นี่คือข้อดีข้อเสียที่ฉันคิดได้: ข้อดี บำรุงรักษาง่ายขึ้น สามารถอัปเดตผู้ใช้ในที่เดียวแทนที่จะเป็น 3 รหัสผู้ใช้จะจับคู่ระหว่างฐานข้อมูล (สำคัญเนื่องจากแอปเสริมจำนวนมากอิงตามรหัสผู้ใช้) จุดด้อย อย่าคิดว่านี่เป็นขั้นตอนมาตรฐานดังนั้นอาจทำให้สับสน ผู้ใช้จะต้องมีการตั้งค่าที่เหมือนกันระหว่างฐานข้อมูล (จากคำตอบของ gbnด้านล่าง) หากฐานข้อมูล 1 ดับลงฐานข้อมูล 2 และ 3 จะไม่สามารถใช้งานได้ นอกจากนี้ยังมีปัญหาที่อาจเกิดขึ้นของข้อมูลที่ไม่สอดคล้องกันในกรณีที่มีการกู้คืน นี่เป็นตัวเลือกที่ฉันกำลังพิจารณาสำหรับตารางที่แตกต่างกันสองสามอย่างที่มีการตั้งค่าที่เหมือนกันระหว่างฐานข้อมูลไม่ใช่เฉพาะUsersตาราง ฉันใช้ผู้ใช้ในตัวอย่างเนื่องจากง่ายต่อการเข้าใจ

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