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

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

4
มีอะไรดีไปกว่าการเปลี่ยนแปลงตาราง: DELETE และ INSERT ทุกครั้งหรือมีการอัพเดทอยู่
ฉันกำลังทำโปรเจ็กต์ที่ต้องเปลี่ยนระเบียนประมาณ 36K ในหนึ่งตารางทุกวัน ฉันสงสัยว่าอะไรจะทำงานได้ดีกว่า: ลบแถวและแทรกแถวใหม่หรือ อัปเดตแถวที่มีอยู่แล้ว สำหรับฉันมันง่ายกว่าที่จะลบแถวทั้งหมดและแทรกแถวใหม่ แต่ถ้านี่จะแยกส่วนของตารางและดัชนีและผลกระทบต่อประสิทธิภาพการทำงานแล้วฉันอยากจะอัปเดตเมื่อเป็นไปได้และลบ / แทรกเมื่อจำเป็นเท่านั้น นี่จะเป็นการให้บริการทุกคืนและฉันไม่ต้องการปรับปรุงความเร็วของกระบวนการเอง ฉันกังวลมากขึ้นเกี่ยวกับประสิทธิภาพของการสืบค้นเทียบกับตารางนี้โดยทั่วไปซึ่งฉันมี 89 ล้านบันทึกแล้วและกระบวนการคืนนี้จะส่งผลกระทบต่อมันอย่างไร ฉันควรลบ / แทรกบันทึกหรือฉันควรปรับปรุงรายการที่มีอยู่ (หากเป็นไปได้) สำหรับกระบวนการทุกคืน?

2
เหตุใดฟังก์ชัน LEN () จึงประเมินค่าความสำคัญต่ำใน SQL Server 2014
ฉันมีตารางที่มีคอลัมน์สตริงและเพรดิเคตที่ตรวจสอบแถวที่มีความยาวแน่นอน ใน SQL Server 2014 ฉันเห็นการประมาณ 1 แถวโดยไม่คำนึงถึงความยาวที่ฉันกำลังตรวจสอบ นี่เป็นแผนที่แย่มากเพราะมีหลายพันหรือหลายล้านแถวและ SQL Server เลือกที่จะวางตารางนี้ไว้ที่ด้านนอกของลูปที่ซ้อนกัน มีคำอธิบายสำหรับการประมาณค่า cardinality ที่ 1.0003 สำหรับ SQL Server 2014 หรือไม่ในขณะที่ SQL Server 2012 ประมาณ 31,622 แถว มีวิธีแก้ปัญหาที่ดีหรือไม่? นี่คือการทำซ้ำสั้น ๆ ของปัญหา: -- Create a table with 1MM rows of dummy data CREATE TABLE #customers (cust_nbr VARCHAR(10) NOT NULL) GO INSERT …

4
บันทึกธุรกรรมสำหรับฐานข้อมูล 'database_name' เต็มเนื่องจาก 'XTP_CHECKPOINT'
XTP_CHECKPOINTฉันมีคำถามเกี่ยวกับ ฉันใช้ SQL Server 2014 ฉันมีฐานข้อมูลที่อยู่ในโหมดรูปแบบการกู้คืนที่เรียบง่าย มันยังถูกทำซ้ำ ไม่มีธุรกรรมที่เปิดอยู่ ฉันวิ่งDBCC OPENTRANแล้วมันกลับมา: "ไม่มีธุรกรรมเปิดค้างอยู่" แต่ฉันได้รับข้อความนี้ทุกครั้งที่ฉันพยายามสร้างหรือวางตารางหรือลบข้อมูล: (ฉันได้แทนที่ชื่อฐานข้อมูลจริงด้วยคำว่าdatabase_name) "บันทึกธุรกรรมสำหรับฐานข้อมูล 'database_name' เต็มเนื่องจาก 'XTP_CHECKPOINT'" ไม่มีใครรู้ว่าทำไมสิ่งนี้จึงเกิดขึ้นและที่สำคัญฉันจะทำให้มันหยุดได้อย่างไร และใช่ฐานข้อมูลอยู่ในโหมดการกู้คืนแบบง่าย ie บันทึกธุรกรรมควรตัดโดยอัตโนมัติ บังเอิญฐานข้อมูลอื่นที่ฉันมีในโหมดการกู้คืนเต็มทำสิ่งเดียวกันเริ่มกลับข้อผิดพลาดเดียวกัน: บันทึกธุรกรรมสำหรับฐานข้อมูล 'database_name' เต็มเนื่องจาก 'XTP_CHECKPOINT' ฉันพยายามเปลี่ยนการตั้งค่าการเติบโตบันทึกเป็นการเติบโตแบบไม่ จำกัด แต่จะไม่ให้ฉันกลับข้อผิดพลาดเดียวกัน ฉันสามารถทำซ้ำปัญหาโดยไม่มีสิ่ง XTP ใด ๆ เลยยกเว้นเฉพาะกลุ่มไฟล์ นี่คือวิธี: http://pastebin.com/jWSiEU9U

1
ตรรกะอ่านแตกต่างกันเมื่อเข้าถึงข้อมูล LOB เดียวกัน
นี่คือการทดสอบสามแบบที่อ่านข้อมูลเดียวกัน แต่รายงานการอ่านเชิงตรรกะที่แตกต่างกันมาก: ติดตั้ง สคริปต์ต่อไปนี้สร้างตารางทดสอบที่มี 100 แถวเหมือนกันแต่ละแถวมีคอลัมน์xml ที่มีข้อมูลเพียงพอเพื่อให้แน่ใจว่าจะถูกเก็บไว้นอกแถว ในฐานข้อมูลการทดสอบของฉันความยาวของxml ที่สร้างขึ้นคือ 20,204 ไบต์สำหรับแต่ละแถว -- Conditional drop IF OBJECT_ID(N'dbo.XMLTest', N'U') IS NOT NULL DROP TABLE dbo.XMLTest; GO -- Create test table CREATE TABLE dbo.XMLTest ( ID integer IDENTITY PRIMARY KEY, X xml NULL ); GO -- Add 100 wide xml rows DECLARE @X …

6
จัดทำดัชนีประสิทธิภาพการทำงานเป็นเปิดเมื่อเทียบกับตำแหน่งที่
ฉันมีสองตาราง @T1 TABLE ( Id INT, Date DATETIME ) @T2 TABLE ( Id INT, Date DATETIME ) ตารางเหล่านี้มีดัชนีที่ไม่ทำคลัสเตอร์ (Id, Date) และฉันเข้าร่วมตารางเหล่านี้ SELECT * FROM T1 AS t1 INNER JOIN T2 AS t2 ON t1.Id = t2.Id WHERE t1.Date <= GETDATE() AND t2.Date <= GETDATE() สิ่งนี้สามารถเขียนเป็น SELECT * FROM T1 AS …

3
SQL Server แบ่ง A <> B เป็น A <B หรือ A> B โดยให้ผลลัพธ์ที่แปลกประหลาดหาก B ไม่ได้กำหนดไว้ล่วงหน้า
เราพบปัญหาที่น่าสนใจกับ SQL Server พิจารณาตัวอย่างการทำซ้ำต่อไปนี้: CREATE TABLE #test (s_guid uniqueidentifier PRIMARY KEY); INSERT INTO #test (s_guid) VALUES ('7E28EFF8-A80A-45E4-BFE0-C13989D69618'); SELECT s_guid FROM #test WHERE s_guid = '7E28EFF8-A80A-45E4-BFE0-C13989D69618' AND s_guid &lt;&gt; NEWID(); DROP TABLE #test; ซอ โปรดลืมสักครู่ว่าs_guid &lt;&gt; NEWID()สภาพดูเหมือนจะไร้ประโยชน์โดยสิ้นเชิง - นี่เป็นเพียงตัวอย่างที่ไม่สำคัญ เนื่องจากความน่าจะเป็นของการNEWID()จับคู่ค่าคงที่ที่กำหนดมีค่าน้อยมากจึงควรประเมินเป็น TRUE ทุกครั้ง แต่มันก็ไม่ได้ การเรียกใช้คิวรีนี้มักจะส่งคืน 1 แถว แต่บางครั้ง (ค่อนข้างบ่อยมากกว่า 1 ครั้งจาก 10) …

2
ปัญหาการเพิ่มประสิทธิภาพด้วยฟังก์ชั่นที่ผู้ใช้กำหนด
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Exchange Administrators Stack Exchange อพยพ 4 ปีที่แล้ว ฉันมีปัญหาในการทำความเข้าใจว่าทำไมเซิร์ฟเวอร์ SQL ตัดสินใจที่จะเรียกใช้ฟังก์ชันที่ผู้ใช้กำหนดสำหรับทุกค่าในตารางแม้ว่าควรดึงข้อมูลได้เพียงหนึ่งแถว SQL จริงมีความซับซ้อนมากขึ้น แต่ฉันสามารถลดปัญหาลงได้ดังนี้ select S.GROUPCODE, H.ORDERCATEGORY from ORDERLINE L join ORDERHDR H on H.ORDERID = L.ORDERID join PRODUCT P on P.PRODUCT = L.PRODUCT cross apply dbo.GetGroupCode (P.FACTORY) S where L.ORDERNUMBER = 'XXX/YYY-123456' and L.RMPHASE = '0' …

4
จะใช้ CDC เพื่อติดตามประวัติเมื่อใด
SQL Server Change Data Capture เป็นคุณสมบัติที่อ่านข้อมูลประวัติจากบันทึกธุรกรรม SQL Server และเก็บไว้ในตารางพิเศษ จากการใช้ฟังก์ชั่นค่าตารางพิเศษ (TVF) จะช่วยให้ผู้ใช้สามารถสืบค้นข้อมูลนี้ทำให้สามารถรับการเปลี่ยนแปลงทั้งหมดในตารางที่ระบุหรือเฉพาะการเปลี่ยนแปลงสุทธิที่เกิดจากการเปลี่ยนแปลงภายในเวลาที่กำหนด CDC มีข้อดีบางประการ มันสามารถกำหนดค่าให้ติดตามเฉพาะตารางหรือคอลัมน์บางอย่าง มันสามารถจัดการกับการเปลี่ยนแปลงของโมเดลในระดับหนึ่งได้ ไม่ส่งผลกระทบต่อประสิทธิภาพเท่า ๆ กับทริกเกอร์เนื่องจากทำงานกับบันทึกธุรกรรม มันเปิด / ปิดการใช้งานได้ง่ายและไม่จำเป็นต้องมีคอลัมน์เพิ่มเติมในตารางที่ควรติดตาม นอกจากนี้ยังมีข้อเสีย: จำนวนข้อมูลประวัติสามารถเป็นไปอย่างรวดเร็วมาก คุณไม่สามารถติดตามผู้ที่ทำการเปลี่ยนแปลงได้ (อย่างน้อยก็ไม่ใช่สำหรับการลบ) ข้อมูลประวัติใช้เวลาพอสมควรในการติดตามเนื่องจากเป็นไปตามบันทึกธุรกรรม ขึ้นอยู่กับ บริษัท ตัวแทนของเซิร์ฟเวอร์ SQL หาก Agent ไม่ทำงานหรือล่มจะไม่มีการติดตามประวัติ ฉันได้อ่านเกี่ยวกับ CDC ค่อนข้างมากและในขณะที่ฉันรู้วิธีใช้งานฉันยังไม่แน่ใจว่ามันเป็นเครื่องมือที่เหมาะสมสำหรับฉันหรือไม่ CDC สำหรับภารกิจ / สถานการณ์ใดเป็นเครื่องมือที่เหมาะสม (เช่นอนุญาตให้ผู้ใช้กู้คืนวัตถุข้อมูลไปยังจุดที่กำหนดเวลาหรือไม่การตรวจสอบ? แสดงประวัติของข้อมูลทั้งหมด?) เมื่อใดที่คุณไม่ควรใช้ CDC แต่หันไปใช้โซลูชันทริกเกอร์ที่กำหนดเอง การใช้ CDC ในฐานข้อมูลการดำเนินงานและใช้ประโยชน์จากข้อมูล CDC …

2
วิธีการโพรไฟล์ขั้นตอนการจัดเก็บ
ฉันใช้ SQL Server 2012 และสงสัยว่าจะทำโพรซีเดอร์ที่เก็บไว้ได้อย่างไร ตัวอย่างเช่น profiler สามารถดักจับคำสั่ง SQL แต่ละคำสั่งในโพรซีเดอร์ที่เก็บไว้มันคืออะไรและใช้เวลานานแค่ไหนในการรัน etc? ฉันพยายามวินิจฉัยขั้นตอนการจำลองแบบที่เก็บไว้ผสานและต้องจับส่วนหนึ่งของการทำงานเต็มรูปแบบของ บริษัท ตัวแทนการผสาน ดูเหมือนจะเป็นไปไม่ได้ที่จะคว้าขั้นตอนการจัดเก็บที่มีปัญหาด้านประสิทธิภาพและเรียกใช้อีกครั้งเพราะ ณ จุดนั้นมันไม่ได้ช้า

2
วิธีการเขียนแบบสอบถามที่ค้นหาการอ้างอิงแบบวงกลมทั้งหมดเมื่อตารางอ้างอิงตัวเอง?
ฉันมีสคีมาต่อไปนี้ (เปลี่ยนชื่อ) ซึ่งฉันไม่สามารถเปลี่ยนแปลงได้: CREATE TABLE MyTable ( Id INT NOT NULL PRIMARY KEY, ParentId INT NOT NULL ); ALTER TABLE MyTable ADD FOREIGN KEY (ParentId) REFERENCES MyTable(Id); นั่นคือแต่ละระเบียนเป็นลูกของบันทึกอื่น หากเร็กคอร์ดของParentIdเท่ากับIdเร็กคอร์ดนั้นจะถือว่าเป็นโหนดรูท ฉันต้องการเรียกใช้แบบสอบถามซึ่งจะค้นหาการอ้างอิงแบบวงกลมทั้งหมด ตัวอย่างเช่นกับข้อมูล INSERT INTO MyTable (Id, ParentId) VALUES (0, 0), (1, 0), (2, 4), (3, 2), (4, 3); แบบสอบถามควรกลับมา Id | …

6
ขนาดฐานข้อมูล SQL Server ไม่ลดลงหลังจากลบแถวจำนวนมาก
คำถามนี้ถูกโยกย้ายจาก Super User เพราะสามารถตอบได้ใน Exchange Administrators Stack Exchange อพยพ 7 ปีที่ผ่านมา ฉันไม่เก่งเรื่อง SQL แต่มีฐานข้อมูลที่จะดูแล แทบจะไม่มีที่เหลือเลยดังนั้นฉันจึงตัดสินใจลบข้อมูลทั้งหมดสำหรับปี 2008 หลังจากดำเนินการลบแบบสอบถาม (มีการทำความสะอาดประมาณ 10,000,000 แถว) และการทำความสะอาดบันทึกธุรกรรมฉันพบว่าฉัน การกระทำไม่มีผลกับขนาดฐานข้อมูล มีอะไรอีกบ้างที่ฉันต้องทำ?

3
เป็นไปได้หรือไม่ที่จะกู้คืน sql-server bak และลดขนาดไฟล์ล็อกในเวลาเดียวกัน?
เรามีไฟล์บั๊กจากลูกค้าที่เราถ่ายโอนไปยังสำนักงานนักพัฒนาของเราเพื่อตรวจสอบปัญหา ขณะนี้การสำรองข้อมูลปัจจุบันมีขนาด 25GB และฐานข้อมูลที่เรียกคืนมีขนาดใกล้เคียงกัน แต่จะต้องมีการกู้คืน 100GB ฉันเชื่อว่าเป็นเช่นนี้เพราะมีการตั้งค่าฐานข้อมูลให้มีขนาดบันทึกธุรกรรม 75GB หลังจากกู้คืนฐานข้อมูลเราสามารถลดขนาดไฟล์บันทึกได้ แต่มีวิธีการในการกู้คืนหรือไม่?

2
จะค้นหาคำสั่ง SQL ที่ทำให้ tempdb เติบโตได้อย่างไร?
tempdb ของเซิร์ฟเวอร์ (SQL Server 2008) เพิ่มขึ้นเป็น 500GB + หลายครั้งทุกเดือน เป็นไปได้ไหมที่จะทราบว่าคำสั่ง SQL ใดที่ทำให้เกิดปัญหานี้? ปัญหานี้มักจะไม่ได้เกิดจากcreate table #temp...; insert into #temp...หรือเกิดจากการselect ... into #temp...รวมที่ซับซ้อน ขนาดเริ่มต้นของบางส่วนของ tempdb แฟ้มยังมีการตั้งค่าโดยอัตโนมัติเพื่อให้ค่าที่ยิ่งใหญ่กว่าทุกครั้ง จะป้องกันได้อย่างไร? บางครั้งแผนแคชป้องกันการปรับขนาด / ลดขนาดไฟล์ วิธีการค้นหาที่หนึ่งถือ tempdb หรือไม่

2
การจัดการจำนวนผู้เช่าที่เพิ่มขึ้นในสถาปัตยกรรมฐานข้อมูลผู้เช่าหลายคน
การจัดการกับจำนวนลูกค้า (ผู้เช่า) ในเซิร์ฟเวอร์ทั่วไปที่มีฐานข้อมูลแยกกันสำหรับอินสแตนซ์ของผู้เช่าแต่ละรายของแอปพลิเคชันนั้นค่อนข้างตรงไปตรงมาและโดยปกติแล้วเป็นวิธีที่ถูกต้องในการทำเช่นนี้ ขณะนี้ฉันกำลังดูสถาปัตยกรรมสำหรับแอปพลิเคชันที่ผู้เช่าแต่ละรายมีอินสแตนซ์ฐานข้อมูลของตนเอง อย่างไรก็ตามปัญหาคือแอปพลิเคชันนี้จะมีผู้เช่าจำนวนมาก (5,000-10,000) ที่มีผู้ใช้จำนวนมากอาจจะ 2,000 สำหรับผู้เช่ารายเดียว เราจะต้องสนับสนุนการเติบโตของระบบโดยผู้เช่าหลายรายทุกสัปดาห์ นอกจากนี้ผู้เช่าทั้งหมดและผู้ใช้ของพวกเขาจะถูกนำเสนอด้วยกระบวนการเข้าสู่ระบบทั่วไป (เช่นผู้เช่าแต่ละคนไม่สามารถมี URL ของตัวเอง) ในการทำสิ่งนี้ฉันต้องการกระบวนการล็อกอินแบบรวมศูนย์และวิธีการในการเพิ่มฐานข้อมูลลงในระบบและลงทะเบียนผู้ใช้แบบไดนามิก กระบวนการลงทะเบียนและการสร้างฐานข้อมูลจะเป็นไปโดยอัตโนมัติอย่างมีประสิทธิภาพได้อย่างไร กระบวนการของการสร้างและการลงทะเบียนฐานข้อมูลผู้เช่าในระบบน่าจะทำให้เกิดปัญหาประสิทธิภาพหรือล็อค หากคุณคิดว่านี่อาจเป็นปัญหาใคร ๆ สามารถแนะนำวิธีบรรเทาได้บ้าง ฉันจะจัดการการพิสูจน์ตัวตนจากส่วนกลางในวิธีที่ข้อมูลรับรองผู้ใช้จะเชื่อมโยงกับฐานข้อมูลของผู้เช่าโดยเฉพาะได้อย่างไร แต่ผู้ใช้สามารถเข้าสู่ระบบผ่านหน้าทั่วไปได้ (เช่นทั้งหมดผ่าน URL การเข้าสู่ระบบเดียวกัน ) ผู้เช่าจะต้องสามารถเข้าสู่ระบบและการอนุญาตของตัวเอง แต่ระบบการเข้าสู่ระบบกลางจะต้องตระหนักถึงสิ่งเหล่านี้ ใครสามารถแนะนำวิธีการทำเช่นนี้? หากฉันต้องการ 'ลดขนาด' ด้วยการเพิ่มเซิร์ฟเวอร์ฐานข้อมูลหลาย ๆ คนใครสามารถแนะนำปัญหาที่ฉันอาจต้องจัดการกับการจัดการข้อมูลประจำตัวผู้ใช้ข้ามเซิร์ฟเวอร์ (การรับบทบาท ฯลฯ ) และวิธีการบางอย่างเพื่อบรรเทาปัญหาเหล่านั้น

3
ระดับการแยก "Chaos" คืออะไรและควรใช้เมื่อใด
เอกสาร ADO.NET แสดงความเป็นไปได้ของการตั้งค่าระดับธุรกรรมสำหรับธุรกรรม SQL เป็น Chaos ฟังดูไม่เป็นที่พอใจ แต่ถ้ามีอยู่ในนั้นน่าจะมีการใช้งานที่ถูกกฎหมาย SET แยกธุรกรรมระดับคำสั่งใน BOL (ah! เห็นฉันสามารถใช้ google และ BOL) ไม่มีอะไรน่าจะมีชื่อว่า "ความวุ่นวาย" และ ADO.NET จะมี 5 โหมดที่ตรงกับขึ้นอย่างให้อยู่ในระดับการบันทึกไว้ในนอกจาก "ความวุ่นวาย" ระดับความโกลาหลนี้เป็นอย่างไรหรือใคร (และทำไมถึงมีชื่อที่ไม่เป็นมิตร) อ้างอิง: ADO.NET enum

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