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

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

2
ฉันสามารถ refactor แบบสอบถามนี้เพื่อให้ทำงานในแบบคู่ขนานได้หรือไม่
ฉันมีแบบสอบถามที่ใช้เวลาประมาณ 3 ชั่วโมงในการทำงานบนเซิร์ฟเวอร์ของเรา - และมันไม่ได้ใช้ประโยชน์จากการประมวลผลแบบขนาน (ประมาณ 1.15 ล้านระเบียนในdbo.Deidentified300 ระเบียนในdbo.NamesMultiWord) เซิร์ฟเวอร์มีการเข้าถึง 8 คอร์ UPDATE dbo.Deidentified WITH (TABLOCK) SET IndexedXml = dbo.ReplaceMultiWord(IndexedXml), DE461 = dbo.ReplaceMultiWord(DE461), DE87 = dbo.ReplaceMultiWord(DE87), DE15 = dbo.ReplaceMultiWord(DE15) WHERE InProcess = 1; และReplaceMultiwordเป็นกระบวนการที่กำหนดเป็น: SELECT @body = REPLACE(@body,Names,Replacement) FROM dbo.NamesMultiWord ORDER BY [WordLength] DESC RETURN @body --NVARCHAR(MAX) การเรียกร้องให้ReplaceMultiwordป้องกันการก่อตัวเป็นแผนขนานหรือไม่ มีวิธีที่จะเขียนสิ่งนี้เพื่อให้มีความเท่าเทียมกันหรือไม่? ReplaceMultiword …

2
กำหนดค่าการมอบหมายที่ไม่ จำกัด สำหรับ BULK INSERT
ฉันมีโหนด Microsoft SQL Server 2016 คู่หนึ่งในกลุ่ม Always On Availability ฉันกำลังพยายามดำเนินการBULK INSERT(โดยใช้แบบสอบถาม SQL Server 2016 Management Studio) ในไฟล์ที่อยู่ในคลัสเตอร์เซิร์ฟเวอร์ล้มเหลวของ Windows Server 2016 แต่ฉันได้รับข้อผิดพลาดต่อไปนี้: เกี่ยวกับข่าวสาร 4861 ระดับ 16 สถานะ 1 ไม่สามารถโหลดจำนวนมากได้เนื่องจากไม่สามารถเปิดไฟล์ "\ nas2.my.domain \ Microsoft SQL Server 2016 Enterprise \ test.txt" รหัสข้อผิดพลาดของระบบปฏิบัติการ 5 (ปฏิเสธการเข้าถึง) สิ่งนี้จะเกิดขึ้นโดยไม่คำนึงว่าฉันใช้ชื่อโหนดที่ใช้งาน ( nas2.my.domain) หรือฟังคลัสเตอร์ล้มเหลว ( nas.my.domain) หรือไม่ หลังจากมองไปรอบ ๆ …

1
ฉันจะบังคับให้ประเมินค่าสเกลาร์ UDF เพียงครั้งเดียวในแบบสอบถามได้อย่างไร
ฉันมีข้อความค้นหาที่ต้องการกรองผลลัพธ์ของสเกลาร์ UDF ต้องส่งเคียวรีเป็นคำสั่งเดียว (ดังนั้นฉันไม่สามารถกำหนดผลลัพธ์ UDF ให้กับตัวแปรโลคอล) และฉันไม่สามารถใช้ TVF ได้ ฉันรับรู้ถึงปัญหาประสิทธิภาพที่เกิดจาก UDF แบบเกลาซึ่งรวมถึงการบังคับให้แผนทั้งหมดทำงานอย่างต่อเนื่องหน่วยความจำที่มากเกินไปปัญหาการประมาณค่าทาง cardinality และการขาด inlining สำหรับคำถามนี้โปรดสมมติว่าฉันต้องใช้สเกลาร์ UDF UDF นั้นค่อนข้างแพงในการโทร แต่ในทางทฤษฎีแล้วแบบสอบถามสามารถนำไปใช้อย่างมีเหตุผลโดยเครื่องมือเพิ่มประสิทธิภาพในลักษณะที่ฟังก์ชันจะต้องคำนวณเพียงครั้งเดียว ฉันล้อเลียนตัวอย่างที่ง่ายมากสำหรับคำถามนี้ แบบสอบถามต่อไปนี้ใช้เวลา 6152 ms ในการดำเนินการบนเครื่องของฉัน: SELECT x1.ID FROM dbo.X_100_INTEGERS x1 WHERE x1.ID >= dbo.EXPENSIVE_UDF(); ตัวดำเนินการตัวกรองในแผนแบบสอบถามชี้ให้เห็นว่าฟังก์ชันนั้นถูกประเมินหนึ่งครั้งสำหรับแต่ละแถว: DDL และการเตรียมข้อมูล: CREATE OR ALTER FUNCTION dbo.EXPENSIVE_UDF () RETURNS INT AS BEGIN DECLARE @tbl TABLE …

3
ระบบหลายผู้เช่าที่ควรใช้ SQL Server 2016, Shard หรือแยกผู้เช่าผ่านฐานข้อมูลแยกต่างหากต่อผู้เช่าหรือไม่?
รับกรณีการใช้งาน: ข้อมูลผู้เช่าไม่ควรพูดคุยข้าม, ผู้เช่ารายหนึ่งไม่ต้องการข้อมูลของผู้เช่ารายอื่น ผู้เช่าแต่ละรายอาจมีปริมาณข้อมูลประวัติขนาดใหญ่ได้ SQL Server โฮสต์อยู่ในอินสแตนซ์ของ AWS EC2 ผู้เช่าแต่ละรายอยู่ห่างจากพื้นที่ทางภูมิศาสตร์ มีความตั้งใจที่จะใช้เครื่องมือสร้างภาพข้อมูลบุคคลที่สามเช่น PowerBI Embedded คาดว่าปริมาณข้อมูลจะเพิ่มขึ้นเมื่อเวลาผ่านไป ค่าใช้จ่ายของระบบถูก จำกัด การแก้ปัญหาจะต้องสามารถบำรุงรักษาได้โดยไม่ต้องมี DBA ผลิต 24/7 การแก้ปัญหาควรจะสามารถปรับขนาดในแนวนอน จำนวนผู้เช่าทั้งหมดน้อยกว่า 50 สิ่งที่จะเป็นสถาปัตยกรรมที่แนะนำมีการใช้งานอ้างอิงสำหรับกรณีการใช้งานนี้หรือไม่? ฉันเชื่อว่าหลายคนอาจประสบปัญหานี้แล้วสำหรับการพัฒนาซอฟต์แวร์ระดับองค์กร ผมคิดว่านี่เป็นสถานการณ์ที่แตกต่างจากการจัดการตัวเลขการเติบโตของผู้เช่าในหลายลูกสถาปัตยกรรมฐานข้อมูล กรณีการใช้ที่กล่าวถึงในคำถามนั้นเกี่ยวข้องกับผู้เช่าจำนวนมากซึ่งแตกต่างจากการมีผู้เช่ารายใหญ่น้อยมาก (50) คน สถาปัตยกรรมที่กล่าวถึงอาจเป็นวิธีแก้ปัญหาที่นี่ซึ่งเป็นสิ่งที่ฉันต้องการทราบเพิ่มเติมเกี่ยวกับ

4
ไดรฟ์ vs. Mount Points
Senior DBA ก่อนหน้านี้ตั้งค่าจุดเชื่อมต่อสำหรับไดรฟ์ทั้งหมดของเราทั่วทุกเซิร์ฟเวอร์ SQL ทั่วทั้ง บริษัท Senior DBA ใหม่นั้นน่ากลัวมากเพราะคะแนนของเขาต้องการเปลี่ยนมาตรฐานของเรา (ส่วนใหญ่ฉันคิดว่าเพราะเขาไม่มีประสบการณ์กับพวกเขา) จากผลลัพธ์ของการค้นหาทางอินเทอร์เน็ตจำนวนมากฉันไม่พบเหตุผลใด ๆ (post-SQL Server 2000) ที่ไม่ใช้จุดเชื่อมต่อ มีใครทราบถึงข้อ จำกัด ของระบบปฏิบัติการ Windows ที่เกี่ยวข้องกับหัวข้อนี้หรือไม่? ฉันเคยได้ยินคำกล่าวอ้างว่า "ระบบปฏิบัติการไม่รู้จักจุดเชื่อมต่อ" มากเมื่อเร็ว ๆ นี้ (ไม่จริงขึ้นอยู่กับการวิจัยของฉันเป็นรุ่นของ Windows Server ที่เราใช้) มีเหตุผลหรือหลักฐานจากประสบการณ์ที่จะไม่ใช้จุดเชื่อมต่อกับ SQL Server หรือไม่? สมมติว่าตัวอักษรไดรฟ์หมดไม่มีปัญหาสำหรับเรา ฉันเข้าใจว่าจุดยึดนั้นมีประโยชน์อย่างมากสำหรับการแยกเวิร์กโหลด ทุกคนสามารถยืนยันหรือปฏิเสธความเข้าใจของฉันว่าจุดเชื่อมต่อนั้นแยก / แยกปริมาณงานของข้อมูลและไฟล์บันทึกประเภทต่างๆ (ไฟล์ฐานข้อมูลระบบไฟล์ฐานข้อมูลผู้ใช้ tempDB) มีประสิทธิภาพมากกว่าไดรฟ์หนึ่งตัวสำหรับไฟล์ข้อมูลล็อกไฟล์และ tempdb ?

3
ตรวจสอบว่าการตรวจสอบโหมดผสมถูกเปิดใช้งานโดยไม่ต้องเข้าสู่ระบบหรือไม่
เป็นไปได้ใน SQL Server เพื่อตรวจสอบว่ามีการเปิดใช้งานการรับรองความถูกต้องของโหมดผสมโดยไม่ต้องเข้าสู่ระบบ SQL Server หรือไม่

3
ใช้ฟังก์ชั่น“ LEN” ในข้อ“ WHERE” ใน“ CREATE UNIQUE INDEX”
ฉันมีตารางนี้: CREATE TABLE Table01 (column01 nvarchar(100)); และฉันต้องการสร้างดัชนีที่ไม่ซ้ำในคอลัมน์ 01ด้วยเงื่อนไขนี้LEN (คอลัมน์ 01)> = 5 ฉันเหนื่อย: CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE LEN(column01) >= 5; ฉันได้: ส่วนคำสั่ง WHERE ของดัชนีที่กรองไม่ถูกต้อง 'UIX_01' บนโต๊ะ 'Table01' และ: ALTER TABLE Table01 ADD column01_length AS (LEN(column01)); CREATE UNIQUE INDEX UIX_01 ON Table01(column01) WHERE column01_length >= 5; ผลิต: ไม่สามารถสร้างดัชนีที่กรอง …

2
MERGE กับ OUTPUT ดีกว่า INSERT และ SELECT แบบมีเงื่อนไขหรือไม่?
เรามักจะพบกับสถานการณ์ "หากไม่มีอยู่แทรก" บล็อกของ Dan Guzmanมีการตรวจสอบที่ยอดเยี่ยมเกี่ยวกับวิธีทำให้เธรดกระบวนการนี้ปลอดภัย SEQUENCEผมมีตารางพื้นฐานที่เพียงแคตตาล็อกสตริงจำนวนเต็มจากที่ ในกระบวนงานที่เก็บไว้ฉันต้องได้รับคีย์จำนวนเต็มสำหรับค่าหากมีอยู่หรือINSERTจากนั้นรับค่าผลลัพธ์ มีข้อ จำกัด ที่ไม่ซ้ำกันในdbo.NameLookup.ItemNameคอลัมน์ดังนั้นความถูกต้องของข้อมูลจึงไม่มีความเสี่ยง แต่ฉันไม่ต้องการพบข้อยกเว้น มันไม่ใช่IDENTITYดังนั้นฉันไม่สามารถรับSCOPE_IDENTITYและคุณค่าอาจเป็นNULLในบางกรณี ในสถานการณ์ของฉันฉันต้องจัดการกับINSERTความปลอดภัยบนโต๊ะเท่านั้นดังนั้นฉันจึงพยายามตัดสินใจว่าควรใช้MERGEแบบนี้ดีกว่า: SET NOCOUNT, XACT_ABORT ON; DECLARE @vValueId INT DECLARE @inserted AS TABLE (Id INT NOT NULL) MERGE dbo.NameLookup WITH (HOLDLOCK) AS f USING (SELECT @vName AS val WHERE @vName IS NOT NULL AND LEN(@vName) > 0) AS new_item …

1
ROW_NUMBER () OVER (พาร์ทิชันโดย B, A ORDER BY C) ไม่ได้ใช้ดัชนีใน (A, B, C)
พิจารณาทั้งสองฟังก์ชั่น: ROW_NUMBER() OVER (PARTITION BY A,B ORDER BY C) ROW_NUMBER() OVER (PARTITION BY B,A ORDER BY C) เท่าที่ฉันเข้าใจพวกเขาให้ผลลัพธ์ที่เหมือนกันทุกประการ ในคำอื่น ๆ ลำดับที่คุณแสดงรายการคอลัมน์ในPARTITION BYข้อไม่สำคัญ หากมีดัชนีอยู่(A,B,C)ฉันคาดว่าเครื่องมือเพิ่มประสิทธิภาพจะใช้ดัชนีนี้ในทั้งสองรุ่น แต่น่าประหลาดใจที่ผู้เพิ่มประสิทธิภาพตัดสินใจทำการจัดเรียงที่ชัดเจนเป็นพิเศษในชุดที่สอง ฉันเคยเห็นมันใน SQL Server 2008 Standard และ SQL Server 2014 Express นี่เป็นสคริปต์เต็มรูปแบบที่ฉันใช้ในการทำซ้ำ พยายามใน Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 20 กุมภาพันธ์ 2014 20:04:26 ลิขสิทธิ์ (c) Microsoft …

1
PVSCSI หลายตัวพร้อม SQL Server
เกี่ยวกับ SQL Server virtualization, การพยายามที่จะหาข้อมูลถ้ามีผลกระทบต่อประสิทธิภาพในเชิงบวกต่อการแยกอุปกรณ์ข้อมูลจากอุปกรณ์ที่แตกต่างกันเข้าสู่ Paravirtual SCSI (PVSCSI) อะแดปเตอร์คล้ายกับสิ่งที่จะทำที่นี่ มีสถานการณ์จำลองในไคลเอนต์ที่เพิ่ม PVSCSI เพิ่มเติมและอุปกรณ์บันทึกถูกแยกออกจาก PVSCSI ใหม่ซึ่งแสดงประสิทธิภาพที่เพิ่มขึ้นอย่างมาก กระนั้นข้อสงสัยยังคงอยู่หากเกิดจากการแยกนี้หรือเพียงเพราะข้อเท็จจริงที่ว่า PVSCSI เพิ่มเติมนั้นมีอยู่ในปัจจุบัน ตามที่ทราบกันแล้วโดยทั่วไปแล้วดิสก์บันทึกจะเขียนตามลำดับในขณะที่ดิสก์ข้อมูลตามรูปแบบการสุ่มใน r / w ของพวกเขาและมีประโยชน์ด้านประสิทธิภาพในการวางไฟล์ทั้งสองชนิดนี้ไว้ในดิสก์แยกกัน แต่ตัวควบคุมล่ะ? มีประโยชน์ในการรักษารูปแบบที่แตกต่างเหล่านี้ในตัวควบคุม PVSCSI แยกกันหรือไม่ ใครมีความเข้าใจในเรื่องนี้บ้าง? ขอบคุณล่วงหน้า

5
วิธีการซ่อน / ปิดการใช้งานตารางโดยไม่ต้องวางเพื่อตรวจสอบความซ้ำซ้อน?
ฉันต้องรักษาและขยายระบบเดิมซึ่งมีวิธีการบริการเว็บและตารางฐานข้อมูลที่ไม่ได้ใช้อีกต่อไป เนื่องจากฉันไม่แน่ใจว่าตารางซ้ำซ้อนจริง ๆ ฉันกลัวที่จะทิ้งมัน มีวิธีอื่นที่จะทำให้ได้ผลที่เหมือนกัน (ไม่สามารถใช้ตารางได้อีกต่อไป) โดยไม่ทิ้งมันไว้? ความคิดของฉันคือการถ่ายโอนไปยังคีมาที่แตกต่างกัน (เช่นDeleted) dboจากค่าเริ่มต้นปัจจุบัน IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted') BEGIN EXEC('CREATE SCHEMA Deleted') END ALTER SCHEMA Deleted TRANSFER dbo.TableName; มีตัวเลือกอื่น ๆ หรือมีข้อเสียเปรียบกับวิธี schema?

4
การสำรองข้อมูลบางส่วนให้เล็กเมื่อใช้ SQL Server FILESTREAM
ฉันมีฐานข้อมูลที่มีข้อมูลเกือบ 1TB FILESTREAMที่ฉันไม่ต้องการสำรองข้อมูล (หากข้อมูลถูกลบมันจะถูกสร้างขึ้นใหม่โดยอัตโนมัติภายในสองสามชั่วโมงดังนั้นมันจึงไม่สำคัญ) ข้อมูลส่วนใหญ่มีการเปลี่ยนแปลงทุกสองสามวันดังนั้นการสำรองข้อมูลส่วนต่างจะไม่ช่วยลดขนาดลง ฉันได้ทำการสำรองข้อมูลตามที่ฉันต้องการโดยการตั้งค่าโหมดการกู้คืนเป็นFullสร้างแยกต่างหากFILEGROUPสำหรับFILESTREAMการสำรองข้อมูลจาก "หลัก" FILEGROUPเท่านั้น ปัญหานี้เกิดจากการที่ล็อกไฟล์ (ซึ่งได้รับการสำรอง) ตอนนี้มีขนาดใหญ่โดยไม่จำเป็นเพราะมันรวมถึงFILESTREAMข้อมูล SIMPLEโหมดการกู้คืนทำให้ความสามารถในการสำรองข้อมูลเฉพาะFILEGROUPของฉันลดลงดังนั้นฉันจึงไม่คิดว่าจะเป็นตัวเลือก ความคิดของฉันคือการย้ายFILESTREAMข้อมูลไปยังฐานข้อมูลแยกจากกัน แต่ตอนนี้ฉันสูญเสียความสมบูรณ์ของการอ้างอิงและแน่นอนว่าได้รับมรดกจากปัญหาอื่น ๆ เช่นกัน มีวิธีใดในการสร้างการสำรองข้อมูลบางส่วนในSimpleโหมดการกู้คืน (โดยไม่ต้องตั้งค่าFILESTREAMตารางให้อ่านอย่างเดียว)? ถ้าไม่มีวิธีแก้ไขปัญหาอื่นที่มีเหตุผลสำหรับปัญหาของฉันหรือไม่

1
SQL Server เก็บค่าความเป็นตัวตนของตารางไว้ที่ใด
ฉันหวังว่าบางคนสามารถชี้ฉันไปในทิศทางที่ถูกต้องในอันนี้ นี่คือผลงานของฉันจนถึงตอนนี้ SELECT * FROM sys.identity_columnsคือมุมมองระบบที่ให้ "last_value" แต่คำจำกัดความสำหรับมุมมองนั้นใช้ฟังก์ชันภายในIdentityProperty(colName, 'LastValue')- นั่นคือจุดสิ้นสุด (ไม่ดึงออกจากตารางระบบที่นั่น) ทุกที่ (ฉันดู) บนอินเทอร์เน็ตแนะนำให้ใช้DBCC IDENT_...คำสั่งเพื่อเปิดเผยค่า แต่ก็ยังทำให้ฉันอยู่ในที่มืดราวกับว่ามันถูกเก็บไว้ที่ไหน ดังนั้นฉันมาถึงการค้นหาหน้าเว็บแต่ละหน้าพร้อมDBCC PAGE(TestDB,1,1325,3)กับชุดทดสอบฐานข้อมูลของฉันและการใช้RESEEDคำสั่งเพื่อดำเนินการระหว่างค่า 10 และ 12 ในการนี้ผมสังเกตเห็นค่าฐานสิบหกบนIAM: Header, IAM: Single Page AllocationsและIAM: Extent Alloc Status Slot 1การเปลี่ยนแปลงทั้งหมด (และตระหนักว่าพวกเขามีการเปลี่ยนแปลงเป็นระยะอยู่แล้วพร้อมกับค่าbUse1ซึ่งการเปลี่ยนแปลงที่เพิ่มขึ้นด้วยตัวเองเช่นกัน) ดังนั้นจุดจบอื่นและฉันหมดความคิด ฉันสามารถค้นหาได้ที่ไหน ฉันใช้ SQL Server 2014 ฉันมีความกระหายที่ไม่รู้จักพอสำหรับความรู้ภายในและยังไม่เจออะไรที่เข้าใจยากเช่นนี้ มันดึงดูดความสนใจของฉันได้เพราะในทางทฤษฎีแล้วมัน (ค่าสัมบูรณ์) ถูกเก็บไว้ที่ไหนสักแห่งและควรระบุตำแหน่ง (เนื้อหา) ในการสืบเสาะหาที่ตั้งของข้อมูล / เมตาดาต้าที่เก็บไว้ภายในค่านี้จะทำให้ฉันเข้าใจยากเป็นพิเศษ ฉันคาดเดา / หวังว่าจะมีใครบางคนเข้ามาและบอกฉันคุณสามารถเอามันไปด้วยDBCC …

1
ฉันสามารถปรับปรุงประสิทธิภาพบนตารางระบบ Bloated ได้หรือไม่
ความเป็นมา: ฉันมีฐานข้อมูลจำนวนมากที่มี VIEW จำนวนมากและ SYNONYM จำนวนมาก ตัวอย่างเช่นหนึ่งฐานข้อมูลมีมากกว่า 10k VIEW และ 2+ ล้าน SYNONYM ปัญหาทั่วไป: ข้อความค้นหาที่เกี่ยวข้องsys.objects(และตารางระบบโดยทั่วไป) มีแนวโน้มที่จะช้า ข้อความค้นหาที่เกี่ยวข้องsys.synonymsเป็นน้ำแข็ง ฉันสงสัยว่าฉันจะทำอย่างไรเพื่อปรับปรุงประสิทธิภาพ ตัวอย่างที่เฉพาะเจาะจง คำสั่งนี้ดำเนินการโดยเครื่องมือของบุคคลที่สาม มันช้าทั้งในแอพและใน SSMS: exec sp_tables_rowset;2 NULL,NULL คำถามของฉัน : ฉันจะทำให้การทำงานนี้เร็วขึ้นได้อย่างไร สิ่งที่ฉันได้ลอง : ถ้าSET STATISTICS IO ONฉันได้รับสิ่งนี้: (2201538 แถวที่ได้รับผลกระทบ) ตาราง 'sysobjrdb' จำนวนการสแกน 1, การอ่านเชิงตรรกะ 28, การอ่านทางกายภาพ 0, การอ่านล่วงหน้าอ่าน 0, การอ่านตรรกะล่วงหน้า lob 0, lob …

1
CREATE TABLE SomeSchema # TempTableName มีข้อบกพร่องหรือไม่
ทดสอบเตียงง่าย ๆ : USE tempdb; GO /* This DROP TABLE should not be necessary, since the DROP SCHEMA should drop the table if it is contained within the schema, as I'd expect it to be. */ IF COALESCE(OBJECT_ID('tempdb..#MyTempTable'), 0) <> 0 DROP TABLE #MyTempTable; IF EXISTS (SELECT 1 FROM sys.schemas …

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