คำถามติดแท็ก sql-server

Microsoft SQL Server ทุกรุ่น (ไม่ใช่ MySQL) โปรดเพิ่มแท็กเฉพาะเวอร์ชันเช่น sql-server-2016 เนื่องจากมักเกี่ยวข้องกับคำถาม


1
วิธีการบังคับให้วางฐานข้อมูลใน SQL Server 2008
ฉันพยายามบังคับให้วางฐานข้อมูล แต่หลังจากวางฐานข้อมูลเมื่อฉันพยายามสร้างฐานข้อมูลขึ้นใหม่ฉันได้รับข้อผิดพลาด ไม่สามารถสร้างไฟล์ C: \ Program ไฟล์ ..... [databasename] .mdf เนื่องจากมีอยู่แล้ว นี่คือแบบสอบถามของฉันเพื่อบังคับให้วางฐานข้อมูล Use master; ALTER database [databasename] set offline with ROLLBACK IMMEDIATE; DROP database [databasename]; ฉันเข้าใจว่าข้อความค้นหาด้านบนกำลังวางฐานข้อมูล แต่ไม่ได้ลบ.ldfและ.mdfไฟล์ วิธีการลบฐานข้อมูลอย่างละเอียด? แบบสอบถามปกติ Drop database [databasename] ; //deletes the database completely, including the ldf and mdf's. จะบังคับให้วางฐานข้อมูลซึ่งลบ.mdfและ.ldfไฟล์ได้อย่างไร?

4
แนวปฏิบัติที่เหมาะสมระหว่างการใช้ LEFT JOIN หรือ EXISTS
มีวิธีปฏิบัติที่ดีที่สุดระหว่างการใช้ LEFT JOIN หรือรูปแบบ NOT EXISTS หรือไม่? ประโยชน์ที่จะได้รับจากการใช้อย่างใดอย่างหนึ่งคืออะไร? ถ้าไม่มีควรเลือกแบบไหนดี? SELECT * FROM tableA A LEFT JOIN tableB B ON A.idx = B.idx WHERE B.idx IS NULL SELECT * FROM tableA A WHERE NOT EXISTS (SELECT idx FROM tableB B WHERE B.idx = A.idx) ฉันใช้คิวรีภายใน Access กับฐานข้อมูล SQL Server

8
อัลกอริทึมการตั้งค่า MAXDOP สำหรับ SQL Server
เมื่อตั้งค่า SQL Server ใหม่ฉันใช้รหัสต่อไปนี้เพื่อกำหนดจุดเริ่มต้นที่ดีสำหรับการMAXDOPตั้งค่า: /* This will recommend a MAXDOP setting appropriate for your machine's NUMA memory configuration. You will need to evaluate this setting in a non-production environment before moving it to production. MAXDOP can be configured using: EXEC sp_configure 'max degree of parallelism',X; RECONFIGURE If this instance is …

4
วิธีการระบุแบบสอบถามที่เติมบันทึกธุรกรรม tempdb?
ฉันต้องการทราบวิธีการระบุแบบสอบถามที่ถูกต้องหรือเก็บ proc ซึ่งจริง ๆ แล้วกรอกบันทึกการทำธุรกรรมของฐานข้อมูล TEMPDB

4
ดัชนีค้นหา vs สแกนดัชนี
ดูที่แผนการดำเนินการของคิวรีที่รันช้าและฉันสังเกตว่าบางโหนดเป็นดรรชนีและบางอันก็สแกนดรรชนี ความแตกต่างระหว่างกับการค้นหาดัชนีและการสแกนดัชนีคืออะไร? แบบไหนดีกว่ากัน? SQL จะเลือกอย่างใดอย่างหนึ่งได้อย่างไร ฉันรู้ว่านี่คือคำถาม 3 ข้อ แต่ฉันคิดว่าการตอบคำถามแรกจะอธิบายคำถามอื่น ๆ

3
ตรวจสอบข้อ จำกัด เพียงหนึ่งในสามคอลัมน์ที่ไม่ใช่ค่าว่าง
ฉันมีตาราง (SQL Server) ที่มีผลลัพธ์ 3 ประเภท: FLOAT, NVARCHAR (30) หรือ DATETIME (3 คอลัมน์แยกกัน) ฉันต้องการตรวจสอบให้แน่ใจว่าสำหรับแถวใดก็ตามมีเพียงหนึ่งคอลัมน์เท่านั้นที่มีผลลัพธ์และคอลัมน์อื่น ๆ เป็น NULL ข้อ จำกัด การตรวจสอบที่ง่ายที่สุดในการบรรลุสิ่งนี้คืออะไร? บริบทสำหรับสิ่งนี้กำลังพยายามเพิ่มความสามารถในการจับผลลัพธ์ที่ไม่ใช่ตัวเลขลงในระบบที่มีอยู่ การเพิ่มคอลัมน์ใหม่สองคอลัมน์ลงในตารางด้วยข้อ จำกัด เพื่อป้องกันผลลัพธ์มากกว่าหนึ่งรายการต่อแถวเป็นวิธีที่ประหยัดที่สุดไม่จำเป็นต้องเป็นคอลัมน์ที่ถูกต้อง อัปเดต: ขออภัยประเภทข้อมูล snafu น่าเศร้าที่ฉันไม่ได้ตั้งใจชนิดของผลลัพธ์ที่บ่งบอกว่าถูกตีความว่าเป็นประเภทข้อมูล SQL Server เพียงแค่คำศัพท์ทั่วไปได้รับการแก้ไขแล้ว

1
ข้อมูลเหตุการณ์ใดที่ฉันจะได้รับจากค่าเริ่มต้นจาก SQL Server
ฉันมักจะเห็นคำถามที่ผู้คนต้องการทราบว่ามีบางสิ่งเกิดขึ้นหรือเมื่อมันเกิดขึ้นหรือใครเป็นผู้ดำเนินการ ในหลายกรณี SQL Server ไม่ได้ติดตามข้อมูลนี้ด้วยตัวเอง ตัวอย่างเช่น: ใครดำเนินการที่ผ่านขั้นตอนการเก็บdbo.MyProcedure? ใครเป็นผู้ปรับปรุงsalaryคอลัมน์ในdbo.Employeesตาราง ใครสอบถามdbo.Ordersตารางล่าสุดจาก Management Studio บ้าง แต่มีเหตุการณ์อื่น ๆ หลายอย่างที่ SQL Server ที่ไม่ติดตามชั่วคราวโดยค่าเริ่มต้นและกำเนิดสามารถตอบคำถามเกี่ยวกับเช่น: ครั้งสุดท้ายที่การเติบโตอัตโนมัติเกิดขึ้นในฐานข้อมูล AdventureWorks และใช้เวลานานเท่าใด ใครลบdbo.EmployeeAuditDataตารางและเวลา วันนี้มีข้อผิดพลาดเกี่ยวกับหน่วยความจำกี่ข้อ? ฉันจะรับข้อมูลนี้ได้อย่างไรและจะมีอยู่นานเท่าใด

5
เขียนความแตกต่างระหว่าง varchar และ nvarchar
ขณะนี้อยู่ในฐานข้อมูลของเรา SQL Server 2012, เรากำลังใช้และเราต้องการที่จะเปลี่ยนที่varchar nvarcharฉันสร้างสคริปต์ขึ้นมาแล้ว คำถามของฉันมีความแตกต่างในวิธี SQL Server เขียนไปยังvarcharคอลัมน์กับnvarcharคอลัมน์? เรามีขั้นตอนการแบ็กเอนด์ที่ฉันกังวล แก้ไข: ไม่แน่ใจว่าสิ่งนี้ช่วยได้หรือไม่ แต่คอลัมน์ไม่มีดัชนี, f / k หรือข้อ จำกัด

7
การเขียนโครงสร้างธนาคารอย่างง่าย: ฉันจะรักษายอดคงเหลือของฉันให้สอดคล้องกับประวัติการทำธุรกรรมได้อย่างไร
ฉันกำลังเขียนคีสำหรับฐานข้อมูลธนาคารที่เรียบง่าย นี่คือคุณสมบัติพื้นฐาน: ฐานข้อมูลจะเก็บธุรกรรมกับผู้ใช้และสกุลเงิน ผู้ใช้ทุกคนมียอดดุลหนึ่งรายการต่อหนึ่งสกุลเงินดังนั้นแต่ละยอดดุลเป็นเพียงผลรวมของธุรกรรมทั้งหมดต่อผู้ใช้และสกุลเงิน ยอดคงเหลือต้องไม่ติดลบ แอปพลิเคชันธนาคารจะสื่อสารกับฐานข้อมูลผ่านขั้นตอนการจัดเก็บ ฉันคาดหวังว่าฐานข้อมูลนี้จะยอมรับการทำธุรกรรมใหม่หลายแสนรายการต่อวันรวมทั้งคำสั่งยอดคงเหลือในลำดับความสำคัญที่สูงขึ้น ในการให้บริการยอดคงเหลืออย่างรวดเร็วฉันต้องรวมไว้ล่วงหน้า ในเวลาเดียวกันฉันต้องรับประกันว่ายอดเงินจะไม่ขัดแย้งกับประวัติการทำธุรกรรม ตัวเลือกของฉันคือ: มีbalancesตารางแยกต่างหากและทำสิ่งใดสิ่งหนึ่งต่อไปนี้: ใช้ธุรกรรมกับทั้งtransactionsและbalancesตาราง ใช้TRANSACTIONตรรกะในเลเยอร์ของโพรซีเดอร์ที่เก็บไว้เพื่อให้แน่ใจว่ายอดคงเหลือและการทำธุรกรรมมีการซิงค์อยู่เสมอ (รองรับโดยแจ็ค ) ใช้ธุรกรรมกับtransactionsตารางและมีทริกเกอร์ที่อัปเดตbalancesตารางให้ฉันด้วยจำนวนธุรกรรม ใช้ธุรกรรมกับbalancesตารางและมีทริกเกอร์ที่เพิ่มรายการใหม่ในtransactionsตารางให้ฉันด้วยจำนวนธุรกรรม ฉันต้องพึ่งพาวิธีการรักษาความปลอดภัยเพื่อให้แน่ใจว่าไม่มีการเปลี่ยนแปลงใด ๆ นอกกระบวนการที่เก็บไว้ มิฉะนั้นตัวอย่างเช่นกระบวนการบางอย่างสามารถแทรกธุรกรรมลงในtransactionsตารางโดยตรงและภายใต้โครงการ1.3ยอดคงเหลือที่เกี่ยวข้องจะไม่ซิงค์กัน มีbalancesมุมมองที่จัดทำดัชนีที่รวมการทำธุรกรรมอย่างเหมาะสม เครื่องมือเก็บข้อมูลรับประกันยอดคงเหลือเพื่อให้สอดคล้องกับการทำธุรกรรมของพวกเขาดังนั้นฉันไม่จำเป็นต้องพึ่งพาวิธีการรักษาความปลอดภัยเพื่อรับประกันสิ่งนี้ ในทางกลับกันฉันไม่สามารถบังคับยอดคงเหลือให้เป็นค่าที่ไม่เป็นลบได้อีกต่อไปนับตั้งแต่การดู - แม้แต่การดูที่มีการจัดทำดัชนี - ไม่สามารถมีCHECKข้อ จำกัด ได้ (สนับสนุนโดยDenny ) มีเพียงtransactionsตารางแต่มีคอลัมน์เพิ่มเติมเพื่อจัดเก็บยอดคงเหลือที่มีประสิทธิภาพหลังจากทำรายการนั้นแล้ว ดังนั้นบันทึกธุรกรรมล่าสุดสำหรับผู้ใช้และสกุลเงินจึงมียอดดุลปัจจุบัน (แนะนำโดยAndrewด้านล่าง; ตัวแปรที่เสนอโดยgarik ) ครั้งแรกที่ผมจัดการปัญหานี้ผมอ่านเหล่านี้ สอง2การอภิปรายและการตัดสินใจในตัวเลือก สำหรับการอ้างอิงคุณสามารถดูการดำเนินงานที่เปลือยกระดูกของมันนี่ คุณออกแบบหรือจัดการฐานข้อมูลเช่นนี้ด้วยโปรไฟล์การโหลดสูงหรือไม่ คุณมีวิธีแก้ไขปัญหานี้อย่างไร คุณคิดว่าฉันได้เลือกการออกแบบที่ถูกต้องหรือไม่? มีอะไรบ้างที่ฉันควรจำไว้? ตัวอย่างเช่นฉันรู้ว่าการเปลี่ยนสคีมาในtransactionsตารางจะต้องมีการสร้างbalancesมุมมองใหม่ แม้ว่าฉันจะเก็บถาวรธุรกรรมเพื่อทำให้ฐานข้อมูลมีขนาดเล็ก (เช่นย้ายไปที่อื่นและแทนที่ด้วยธุรกรรมสรุป) การสร้างมุมมองใหม่จากการทำธุรกรรมหลายสิบล้านครั้งด้วยการปรับปรุง schema ทุกครั้งอาจหมายถึงการหยุดทำงานต่อการปรับใช้ …


8
อะไรคือความแตกต่างระหว่าง "บันทึก" และ "แถว" ใน SQL Server
มีคำถามที่ค่อนข้างอันตรายเกี่ยวกับการเพิ่มวันที่และเวลาใน SQL Serverที่ตั้งปิดการอภิปรายอนุกรมวิธานค่อนข้างน่าสนใจ ดังนั้นเราจะแยกความแตกต่างระหว่างคำที่เกี่ยวข้องเหล่านี้และวิธีการใช้งานอย่างถูกต้องได้อย่างไร แถว บันทึก

5
เหตุใดการเปลี่ยนแปลงคอลัมน์ไม่เป็นศูนย์ทำให้เกิดการเติบโตของไฟล์บันทึกขนาดใหญ่
ฉันมีตารางที่มีแถว 64 ม. ที่ใช้ดิสก์ 4.3 GB สำหรับข้อมูล แต่ละแถวมีประมาณ 30 ไบต์ของคอลัมน์จำนวนเต็มบวกNVARCHAR(255)คอลัมน์ตัวแปรสำหรับข้อความ ฉันเพิ่ม AA คอลัมน์ nullable Datetimeoffset(0)กับข้อมูลประเภท จากนั้นฉันก็อัพเดทคอลัมน์นี้สำหรับทุกแถวและตรวจสอบให้แน่ใจว่าเม็ดมีดใหม่ทั้งหมดวางค่าในคอลัมน์นี้ เมื่อไม่มีรายการ NULL ฉันก็วิ่งคำสั่งนี้เพื่อให้ฟิลด์ใหม่ของฉันได้รับคำสั่ง: ALTER TABLE tblCheckResult ALTER COLUMN [dtoDateTime] [datetimeoffset](0) NOT NULL ผลที่ได้คือการเติบโตอย่างมากในขนาดของบันทึกการทำธุรกรรม - จาก 6GB เป็นมากกว่า 36GB จนกว่าจะหมดพื้นที่! ไม่มีใครมีความคิดอะไรในโลก SQL Server 2008 R2 ที่กำลังทำอยู่สำหรับคำสั่งง่ายๆนี้เพื่อให้เกิดการเติบโตอย่างมาก

6
ผลรวมสะสมช่วงวันที่โดยใช้ฟังก์ชั่นหน้าต่าง
ฉันต้องคำนวณผลรวมสะสมในช่วงวันที่ เพื่อแสดงให้เห็นถึงการใช้ฐานข้อมูลตัวอย่าง AdventureWorksไวยากรณ์สมมุติฐานต่อไปนี้จะทำสิ่งที่ฉันต้องการ: SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = SUM(TH.ActualCost) OVER ( PARTITION BY TH.ProductID ORDER BY TH.TransactionDate RANGE BETWEEN INTERVAL 45 DAY PRECEDING AND CURRENT ROW) FROM Production.TransactionHistory AS TH ORDER BY TH.ProductID, TH.TransactionDate, TH.ReferenceOrderID; น่าเศร้าที่RANGEขนาดของกรอบหน้าต่างไม่อนุญาตให้มีช่วงเวลาใน SQL Server ฉันรู้ว่าฉันสามารถเขียนวิธีการใช้แบบสอบถามย่อยและการรวมปกติ (ไม่ใช่หน้าต่าง): SELECT TH.ProductID, TH.TransactionDate, TH.ActualCost, RollingSum45 = ( SELECT SUM(TH2.ActualCost) …

6
อะไรคือสาเหตุหลักของการหยุดชะงักและสามารถป้องกันได้?
เมื่อเร็ว ๆ นี้หนึ่งในแอปพลิเคชัน ASP.NET ของเราแสดงข้อผิดพลาดการหยุดชะงักของฐานข้อมูลและฉันถูกขอให้ตรวจสอบและแก้ไขข้อผิดพลาด ฉันจัดการเพื่อค้นหาสาเหตุของการหยุดชะงักเป็นขั้นตอนการจัดเก็บที่ปรับปรุงตารางภายในเคอร์เซอร์อย่างจริงจัง นี่เป็นครั้งแรกที่ฉันเห็นข้อผิดพลาดนี้และไม่รู้วิธีการติดตามและแก้ไขอย่างมีประสิทธิภาพ ฉันลองทุกวิธีที่เป็นไปได้ที่ฉันรู้และในที่สุดก็พบว่าตารางที่กำลังอัปเดตไม่มีคีย์หลัก! โชคดีที่มันเป็นคอลัมน์ตัวตน ฉันภายหลังพบนักพัฒนาที่เขียนสคริปต์ฐานข้อมูลสำหรับการปรับใช้ที่สับสน ฉันเพิ่มคีย์หลักและปัญหาได้รับการแก้ไข ฉันรู้สึกมีความสุขและกลับมาที่โครงการของฉันและทำการวิจัยเพื่อค้นหาสาเหตุของการหยุดชะงัก ... เห็นได้ชัดว่ามันเป็นเงื่อนไขการรอแบบวงกลมที่ทำให้เกิดการหยุดชะงัก การอัพเดตใช้เวลานานกว่าโดยไม่มีคีย์หลักมากกว่ากับคีย์หลัก ฉันรู้ว่ามันไม่ใช่ข้อสรุปที่ชัดเจนนั่นคือเหตุผลที่ฉันโพสต์ที่นี่ ... คีย์หลักที่หายไปเป็นปัญหาหรือไม่ มีเงื่อนไขอื่นใดที่ทำให้เกิดการหยุดชะงักอื่นนอกเหนือจาก (การกีดกันซึ่งกันและกันถือและรอไม่มีการจองล่วงหน้าและการรอแบบวงกลม)? ฉันจะป้องกันและติดตามการหยุดชะงักได้อย่างไร

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