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

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

1
ฟังก์ชันใดที่เสนอราคาตัวระบุใน dynamic-sql กับ SQL Server
วิธีการ SQL Server ของตัวระบุการอ้างอิงอย่างปลอดภัยสำหรับการสร้าง sql แบบไดนามิกคืออะไร MySQL มี quote_identifier PostgreSQL มี quote_ident ฉันจะมั่นใจได้อย่างไรว่าได้รับชื่อคอลัมน์ที่สร้างขึ้นแบบไดนามิกสำหรับคำสั่งที่สร้างขึ้นแบบไดนามิกว่าคอลัมน์นั้นไม่ใช่การโจมตี SQL-injection สมมติว่าฉันมีคำสั่ง SQL SELECT [$col] FROM table; ซึ่งเป็นหลักเช่นเดียวกับ 'SELECT [' + $col + '] FROM table;' จะหยุดการโจมตีฉีดอะไรที่ $col = "name] FROM sys.objects; \r\n DROP TABLE my.accounts; \r\n\ --"; ที่เกิดขึ้นใน SELECT [name] FROM sys.objects; DROP TABLE my.accounts; -- …

2
หากไม่มีแผนที่จะถอนการติดตั้งโฟลเดอร์ Log and Update Cache ในโฟลเดอร์ Setup Bootstrap จะถูกลบออกได้หรือไม่?
ฉันมี SQL Server หลายเวอร์ชันใช้สำหรับการทดสอบติดตั้งบนแล็ปท็อปของฉัน (2012, 2014, 2016 และ 2017) ฉันสังเกตเห็นเมื่อวันก่อนว่ามีโฟลเดอร์ที่มีไฟล์เวอร์ชันก่อนหน้าตลอดการอัพเดท (SPs, CUs) ในทุกรุ่นมีพื้นที่ว่างพอสมควร: (ในC: \ Program ไฟล์ (x86) \ Microsoft SQL Server \ ) 110\Setup Bootstrap\Log - 91.8 MB (818 files) 110\Setup Bootstrap\Update Cache - 608 MB (2,382 files) (โฟลเดอร์ทั้งหมดด้านล่างอยู่ภายใน: C: \ Program Files \ Microsoft SQL Server \ ) …

1
คำสั่ง bcp ไวยากรณ์ไม่ถูกต้องใกล้กับ ' ' ตัวละครเป็นจริง:“ ä”
ฉันมี mssql-serverและmssql-toolsติดตั้งบน Ubuntu (Linux) เมื่อฉันพยายามส่งออกข้อมูลด้วยคำสั่งbcpโดยใช้บรรทัดคำสั่งต่อไปนี้: bcp DBname.dbo.Täble_Name out Täble_Name -c -k -S127.0.0.1 -Usa -PpassWord -r ~ ฉันได้รับข้อผิดพลาดนี้: SQLState = 37000, NativeError = 102 Error = [Microsoft] [ODBC Driver 13 สำหรับ SQL Server] [SQL Server] ไวยากรณ์ไม่ถูกต้องใกล้ ' ' คือ�ä หากฉันล้อมรอบTäble_Nameด้วยเครื่องหมายวงเล็บ: bcp DBname.dbo.[Täble_Name] out Täble_Name -c -k -S127.0.0.1 -Usa -PpassWord -r ~ …

2
การเลือกดัชนีแบบกลุ่ม - PK หรือ FK?
ฉันมีตารางSQL Server 2014ที่มีลักษณะดังต่อไปนี้: OrderId int not null IDENTITY --this is the primary key column OrderDate datetime2 not null CustomerId int not null Description nvarchar(255) null บางคนในทีมของฉันแนะนำว่าควรทำดัชนีคลัสเตอร์OrderIdแต่ฉันคิดว่าCustomerId+ OrderIdจะเป็นตัวเลือกที่ดีกว่าด้วยเหตุผลต่อไปนี้: แบบสอบถามเกือบทั้งหมดจะมองWHERE CustomerId = @paramไม่ใช่OrderId CustomerIdเป็น foreign key ไปยังCustomerตารางดังนั้นการมีดัชนีคลัสเตอร์ที่CustomerIdควรเพิ่มความเร็วในการรวม แม้ว่าCustomerIdจะไม่ซ้ำกันการมีOrderIdคอลัมน์เพิ่มเติมที่ระบุไว้ในดัชนีจะทำให้มั่นใจได้ว่าไม่ซ้ำกัน (เราสามารถใช้UNIQUEคำหลักเมื่อสร้างดัชนีคลัสเตอร์ในคอลัมน์ 2 คอลัมน์เหล่านั้นเพื่อหลีกเลี่ยงค่าใช้จ่ายที่ไม่มีเอกลักษณ์) เมื่อแทรกข้อมูลแล้วCustomerIdและOrderIdไม่เปลี่ยนแปลงดังนั้นแถวเหล่านี้จะไม่ย้ายไปหลังจากการเขียนครั้งแรก การเข้าถึงข้อมูลเกิดขึ้นผ่านทาง ORM ที่ร้องขอคอลัมน์ทั้งหมดตามค่าเริ่มต้นดังนั้นเมื่อมีการค้นหาตามCustomerIdมาดัชนีดัชนีคลัสเตอร์จะสามารถให้คอลัมน์ทั้งหมดโดยไม่ต้องทำงานเพิ่มเติมใด ๆ ที่ไม่CustomerIdและOrderIdเสียงเช่นวิธีการเลือกที่ดีที่สุดที่กำหนดข้างต้น หรือเป็นOrderIdของตัวเองดีกว่าเพราะมันเป็นคอลัมน์เดียวที่รับประกันความโดดเด่นด้วยตัวเอง? ขณะนี้ตารางมีดัชนีคลัสเตอร์บนOrderIdและดัชนีที่CustomerIdไม่ได้ทำคลัสเตอร์แต่มันไม่ครอบคลุมดังนั้นเนื่องจากเราใช้ ORM และมีการร้องขอคอลัมน์ทั้งหมดจึงเป็นงานพิเศษเพื่อดึงข้อมูลออกมา ดังนั้นเมื่อโพสต์นี้ฉันพยายามพิจารณาปรับปรุงประสิทธิภาพด้วย …

2
SQL Server บน Linux แฮงค์เมื่อเริ่มต้นครั้งแรกไม่มีข้อผิดพลาดและไม่มีไฟล์ ErrorLog ใหม่ที่อัพเดต
ฉันใช้ SQL Server 2017, Release Candidate 2 (RC2) บน Linux (Ubuntu 16.04) เมื่อเซิร์ฟเวอร์เริ่มต้นขึ้น SQL Server มักจะเริ่มต้นเช่นกัน แต่ด้วยเหตุผลบางอย่าง SQL Server จะไม่เริ่มทำงานอีกต่อไป อย่างน้อยฉันไม่สามารถเชื่อมต่อโดยใช้sqlcmd ฉันได้รับการหมดเวลา ODBC ( "Sqlcmd: ข้อผิดพลาด: Microsoft ODBC Driver 13 สำหรับ SQL Server ") ข้อผิดพลาดทุกครั้งในขณะนี้: Login timeout expired. TCP Provider: Error code 0x2749. A network-related or instance-specific error has occurred …

1
การเชื่อมต่อกับเซิร์ฟเวอร์ MS SQL ภายในจากไคลเอนต์ GUI
ฉันยังใหม่กับ SQL และเซิร์ฟเวอร์ฐานข้อมูล ฉันเพิ่งใช้ SQL Server Express และเข้าถึงฐานข้อมูลของฉันโดยใช้ SQL Server Management Studio บน Windows ตอนนี้ฉันกำลังพยายามตั้งค่าที่คล้ายกันบนเครื่อง Linux ฉันต้องการสร้างอินสแตนซ์ SQL Server ในเครื่องของฉันแล้วใช้SQLectronเป็นไคลเอนต์ GUI สำหรับสอบถามฐานข้อมูลของฉัน ฉันใช้ Manjaro Linux และติดตั้งแพ็คเกจของฉันจาก AUR จนถึงขณะนี้ผมได้ติดตั้งmssql-server, และmssql-tools sqlectron-guiฉันได้รันsudo /opt/mssql/bin/mssql-conf setupคำสั่งเพื่อ (ฉันเชื่อว่า) ตั้งค่าเซิร์ฟเวอร์ภายใน หลังจากทำเช่นนั้นการรันคำสั่งsystemctl status mssql-serverจะส่งคืนสิ่งนี้: [kev @ XPS-Manjaro ~] สถานะ $ systemctl mssql-server ● mssql-server.service - โปรแกรมฐานข้อมูล Microsoft …

1
ข้อ จำกัด ของพาร์ติชันที่ไม่ได้ใช้สำหรับการรวมที่เกี่ยวข้องกับตารางที่แบ่งพาร์ติชันโดยการประทับเวลา
ฉันมีโครงสร้างตารางที่แบ่งพาร์ติชันเช่น: CREATE TABLE measurements ( sensor_id bigint, tx timestamp, measurement int ); CREATE TABLE measurements_201201( CHECK (tx >= '2012-01-01 00:00:00'::timestamp without time zone AND tx < ('2012-01-01 00:00:00'::timestamp without time zone + '1 mon'::interval)) )INHERITS (measurements); CREATE INDEX ON measurements_201201(sensor_id); CREATE INDEX ON measurements_201201(tx); CREATE INDEX ON measurements_201201(sensor_id, tx); .... …

4
เหตุใดการผสมการเรียงคอลัมน์ในฐานข้อมูลเดียวจึงถือว่าไม่ดี
มีสองเหตุผลที่ทำให้ฉันถามคำถามนี้: tSQLt เฟรมเวิร์กการทดสอบ T-SQL tSQLt พิจารณาว่าเป็นปัญหาของ"High Severity"เมื่อมีคอลัมน์ที่มีการจัดเรียงที่ไม่ใช่ค่าเริ่มต้น ผู้เขียนการทดสอบระบุสิ่งต่อไปนี้: ฉันไม่แนะนำให้ทุกคอลัมน์สตริงควรมีการเปรียบเทียบที่ตรงกับการเปรียบเทียบเริ่มต้นสำหรับฐานข้อมูล ฉันขอแนะนำว่าเมื่อมันแตกต่างกันควรมีเหตุผลที่ดี กระนั้นความรุนแรงของการทดสอบที่ล้มเหลวก็ถือว่าสูง การปรับใช้ Octopus ในขณะที่กำหนดค่าเซิร์ฟเวอร์การปรับใช้ Octopus การตั้งค่าล้มเหลวด้วยข้อผิดพลาด FATAL ในระหว่างการเริ่มต้นของ OctopusServer-instance บทความที่เกี่ยวข้องกับข้อผิดพลาดข้อความไม่ได้อธิบายว่าทำไมนี้เป็นความต้องการ แต่เพียงระบุว่ามันจะเป็นความจำเป็นสำหรับการใช้งานในอนาคตจากการรวมทั้งปลาหมึกรุ่น 3.8 ในฐานะที่เป็นกล่องด้านข้างแพคเกจ CI-tool ของ RedGate นั้นเป็นชุดDLM Automation Suiteรองรับการปรับใช้ที่มีการเปรียบเทียบที่หลากหลายโดยไม่มีการร้องเรียน คำแนะนำในการคงการเรียงคอลัมน์ทั้งหมดไว้เป็นค่าเริ่มต้นของฐานข้อมูลดูเหมือนจะเป็นแนวทางหรือแนวทางปฏิบัติที่ดีที่สุดสำหรับฉัน เหตุใดจึงถือว่าข้อผิดพลาดร้ายแรงบางรายการ

1
SQLServer Upgrade Advisor 2014 หยุดทำงาน
ฉันพยายามเรียกใช้ SQL Server Upgrade Advisor 2014 กับเซิร์ฟเวอร์ SQL Server 2008 ทุกอย่างดูดีเมื่อเชื่อมต่อกับเซิร์ฟเวอร์ 2008 และฉันสามารถเลือกฐานข้อมูลที่ฉันต้องการวิเคราะห์ แต่เมื่อเปิดตัวมันจะทำงานตลอดไปโดยไม่ทำอะไรเลย (อยู่ที่ขั้นตอนการวิเคราะห์กฎ: 0/112 ) เกิดอะไรขึ้นและฉันจะแก้ไขได้อย่างไร ทั้ง SQL Server 2008 และ 2014 เป็นรุ่น Express และติดตั้งบนแล็ปท็อปของฉัน น่าเสียดายนี่เป็นวิธีเดียวที่ฉันพบว่าเรียกใช้ Upgrade Advisor (มีข้อ จำกัด มากเกินไปที่จะเรียกใช้บนฐานข้อมูล prod / dev จริง) อินสแตนซ์ SQL 2008 อยู่กับ SP3 เป็นสิ่งจำเป็น Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 …

3
ปัญหาประสิทธิภาพการทำงานที่สำคัญใน SQL Server ที่ผลิตของเราฉันจะแก้ไขปัญหานี้ได้อย่างไร
คำถามนี้เป็นคำถามที่ตามมาสำหรับคำถามนี้: ปัญหาประสิทธิภาพการทำงานที่แปลกกับ SQL Server 2016 ตอนนี้เรามีประสิทธิภาพด้วยระบบนี้ แม้ว่าฐานข้อมูลแอปพลิเคชันอื่นจะถูกเพิ่มไปยัง SQL Server นี้ตั้งแต่โพสต์ล่าสุดของฉัน นี่คือสถิติของระบบ: 128 GB RAM (หน่วยความจำสูงสุด 110GB สำหรับ SQL Server) 4 คอร์ที่ 2.6 GHz การเชื่อมต่อเครือข่าย 10 GBit ที่เก็บข้อมูลทั้งหมดใช้ SSD ไฟล์โปรแกรมไฟล์บันทึกไฟล์ฐานข้อมูลและ tempdb อยู่บนพาร์ติชันแยกต่างหากของเซิร์ฟเวอร์ Windows Server 2012 R2 VMware เวอร์ชัน HPE-ESXi-6.0.0-Update3-iso-600.9.7.0.17 เครื่องมือ VMware รุ่น 10.0.9 สร้าง 3917699 Microsoft SQL Server 2016 (SP1) (KB3182545) …

1
SQL Spec ต้องการ GROUP BY ใน EXISTS () หรือไม่
Microsoft อนุญาตให้ใช้ไวยากรณ์นี้ในขณะนี้ SELECT * FROM ( VALUES (1) ) AS g(x) WHERE EXISTS ( SELECT * FROM ( VALUES (1),(1) ) AS t(x) WHERE g.x = t.x HAVING count(*) > 1 ); ขอให้สังเกตว่าไม่มีGROUP BYในEXISTSข้อเป็น ANSI SQL ที่ถูกต้อง หรือเป็นเพียงการเปิดเผยรายละเอียดการปฏิบัติ สำหรับการอ้างอิงไวยากรณ์เดียวกันนี้ไม่ได้รับอนุญาตใน PostgreSQL ข้อผิดพลาด: คอลัมน์ "tx" จะต้องปรากฏในกลุ่มตามข้อหรือจะใช้ในฟังก์ชั่นรวม แต่ไวยากรณ์นี้ได้รับอนุญาต .. SELECT * FROM ( …

1
วิธีการใส่บันทึกด้วยกุญแจไปยังต้นไม้ B + ที่ว่างเปล่าในตอนแรก?
แสดงผลลัพธ์ของการป้อนระเบียนด้วยคีย์ตามลำดับ (1, 2, 3, 4, 5) ไปยัง B + ที่ว่างเปล่าเริ่มต้นของลำดับ m = 3 ในกรณีที่มีการล้นให้แบ่งโหนดและไม่กระจายอีกครั้ง กุญแจสู่เพื่อนบ้าน เป็นไปได้หรือไม่ที่จะป้อนระเบียนด้วยคีย์ต่าง ๆ เพื่อให้มีต้นไม้ที่มีความสูงน้อยกว่า จากภายใน DBMS เชิงสัมพันธ์บทที่ 5: โครงสร้างต้นไม้แบบไดนามิกหน้า 50 ฉันไม่เก่งในเรื่องนี้ แต่ฉันพยายามทำ≤ทางซ้ายและ> ทางขวา: จนกระทั่งการแทรก 1,2: จากนั้นเท่าที่เราต้องแบ่งโหนดและไม่แจกจ่ายคีย์ให้เพื่อนบ้าน (ฉันเข้าใจว่าเป็นโหนดลูก) ฉันแทรกเฉพาะที่ด้านขวาของเซลล์ด้วย 2: และฉันก็ทำแบบเดียวกันกับตอนที่แทรก 5: แต่นี่มันค่อนข้างแปลกฉันไม่เคยเห็นโหนดว่างเปล่าแบบนี้ ... และฉันไม่รู้ว่ามันเคารพคุณสมบัติของต้นบีพื้นฐานหรือไม่: แต่ละโหนดมีคีย์มากที่สุด(m-1)และอย่างน้อย(⌈ (m / 2) ⌉-1)คีย์เว้นแต่ว่าคีย์จะว่างเปล่าและฉันจะเข้าใจคีย์เป็น "ตัวชี้" ความพยายามครั้งแรก: ข้อผิดพลาดในการสั่งซื้อเผยให้เห็นต้นไม้ที่ไม่ชัดเจน ในตอนแรกฉันเข้าใจผิดว่า "คำสั่งซื้อ" คืออะไร (จำนวนสูงสุดของลูกต่อโหนด) …
11 btree 

1
SQL Server Query Plan XML: ความยาว QueryPlanHash
UPDATE:นี่เป็นข้อผิดพลาดอย่างแน่นอน สำหรับรายละเอียดทั้งหมดดูรายการเชื่อมต่อนี้ ในขณะที่ทดสอบการเปลี่ยนแปลงบางอย่างกับsp_BlitzCache (การเปิดเผยอย่างสมบูรณ์ฉันเป็นหนึ่งในผู้แต่ง) ฉันเจอสิ่งที่ฉันคิดว่าเป็นข้อบกพร่องในรหัสของเรา ณ จุดหนึ่งเรากำลังจับคู่แฮชแผนแบบสอบถามเพื่อรับค่าใช้จ่ายแบบสอบถาม เราทำเช่นนั้นเกี่ยวกับเช่น: statement.value('sum(/p:StmtSimple[xs:hexBinary(substring(@QueryHash, 3)) = xs:hexBinary(sql:column("b.QueryHash"))]/@StatementSubTreeCost)', 'float') สิ่งนี้ได้ผลเท่าที่ฉันเคยเห็น อย่างไรก็ตามในกรณีที่แปลกหนึ่งสตริงย่อยใน XML กำลังส่งNULLค่าและแผนแสดงค่า 0 แม้ว่ามันจะค่อนข้างสูง เมื่อขุดเข้าไปในแผนปฏิบัติการ (การเปิดเผยอย่างเต็มรูปแบบฉันทำงานให้กับ บริษัท ที่เป็นเจ้าภาพวางแผน) ฉันสังเกตเห็นว่าแฮชแผนแบบสอบถามสำหรับแฮชปัญหาเดียวมีแฮช 17 ตัวในขณะที่ที่เหลือคือ 18 นี่คือตัวอย่าง: QueryPlanHash = "0x4410B0CA640CDA89" QueryPlanHash = "0x2262FEA4CE645569" QueryPlanHash = "0xED4F225CC0E97E5" - ปัญหา! QueryPlanHash = "0xBF878EEE6DB955EA" QueryPlanHash = "0x263B53BC8C14A452" QueryPlanHash = "0x89F5F146CF4B476F" QueryPlanHash = …

2
ฐานข้อมูลสำหรับการค้นหารวมช่วงที่มีประสิทธิภาพ?
เป็นตัวอย่างแบบง่ายสมมติว่าฉันมีตารางเช่นนี้ seq | value ----+------ 102 | 11954 211 | 43292 278 | 19222 499 | 3843 ตารางอาจมีหลายร้อยล้านระเบียนและฉันต้องทำแบบสอบถามบ่อยเช่นนี้: SELECT sum(value) WHERE seq > $a and seq < $b แม้ว่าseqจะมีการจัดทำดัชนีการใช้ฐานข้อมูลทั่วไปจะวนซ้ำแต่ละแถวเพื่อคำนวณผลรวมในกรณีที่ดีที่สุดO(n)โดยที่nขนาดของช่วงนั้นอยู่ที่ใด มีฐานข้อมูลใดบ้างที่สามารถทำได้อย่างมีประสิทธิภาพเช่นเดียวกับในO(log(n))แบบสอบถามต่อ? ฉันได้เจอโครงสร้างข้อมูลที่เรียกว่า Segment ต้นไม้ตามที่อธิบายไว้ที่นี่ บางครั้งก็เรียกว่าช่วงต้นไม้หรือช่วงต้นไม้แม้ว่าชื่อเหล่านี้มักจะอธิบายว่าเป็นรูปแบบที่แตกต่างกันเล็กน้อยของโครงสร้างข้อมูล อย่างไรก็ตามฉันยังไม่เจอฐานข้อมูลใด ๆ ที่ใช้โครงสร้างข้อมูลดังกล่าว การนำไปใช้ตั้งแต่เริ่มต้นนั้นเป็นเรื่องง่ายสำหรับโครงสร้างในหน่วยความจำ แต่จะยุ่งยากหากต้องคงไว้หรือมีขนาดใหญ่เกินไปที่จะใส่ลงในหน่วยความจำ หากมีรูปแบบที่มีประสิทธิภาพสำหรับการนำไปใช้งานด้านบนของฐานข้อมูลที่มีอยู่นั่นอาจช่วยได้เช่นกัน หมายเหตุด้านข้าง: นี่ไม่ใช่ตารางต่อท้ายเท่านั้นดังนั้นโซลูชันเช่นการรักษายอดรวมสะสมจะไม่ทำงานในกรณีนี้

2
มีฟังก์ชัน SQL มาตรฐานที่มีผลข้างเคียงหรือไม่?
มาตรฐาน SQL กำหนดฟังก์ชันที่มีผลข้างเคียงหรือไม่? ตัวอย่างเช่นพวกเขามีฟังก์ชั่นสำหรับการเขียนลงในไฟล์ * หรือเพื่อปรับปรุงค่าในคอลัมน์บางคอลัมน์ของตารางเมื่อคุณทำสิ่งที่ชอบ SELECT myfunction(params...); ฉันเคยเห็นสิ่งเหล่านี้บางครั้ง แต่ฉันแค่อยากรู้ว่ามาตรฐาน SQL ทำเช่นเดียวกัน * นี่ไม่ใช่คำถามเกี่ยวกับ PostgreSQL โดยเฉพาะ ฉันใช้ตัวอย่างผลข้างเคียงที่ฉันเห็นใน PostgreSQL เท่านั้น

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