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

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

4
เปลี่ยนแบบสอบถามเพื่อปรับปรุงการประมาณการของผู้ให้บริการ
ฉันมีข้อความค้นหาที่ทำงานในเวลาที่ยอมรับได้ แต่ฉันต้องการบีบประสิทธิภาพให้ได้มากที่สุด การดำเนินการที่ฉันพยายามปรับปรุงคือ "ดัชนีค้นหา" ที่ด้านขวาของแผนจากโหนด 17 ฉันได้เพิ่มดัชนีที่เหมาะสม แต่ค่าประมาณที่ฉันได้รับสำหรับการดำเนินการนั้นเป็นครึ่งหนึ่งของที่ควรจะเป็น ฉันค้นหาการเปลี่ยนแปลงดัชนีและเพิ่มตารางชั่วคราวและเขียนแบบสอบถามอีกครั้ง แต่ฉันไม่สามารถทำให้มันง่ายไปกว่านี้เพื่อให้ได้ค่าประมาณที่ถูกต้อง ใครบ้างมีคำแนะนำเกี่ยวกับสิ่งอื่นที่ฉันสามารถลองได้บ้าง แผนเต็มรูปแบบและรายละเอียดที่สามารถพบได้ที่นี่ แผนไม่ระบุชื่อสามารถพบได้ที่นี่ ปรับปรุง: ฉันรู้สึกว่าคำถามเริ่มต้นสร้างความสับสนอย่างมากดังนั้นฉันจะเพิ่มรหัสดั้งเดิมพร้อมคำอธิบายบางอย่าง create procedure [dbo].[someProcedure] @asType int, @customAttrValIds idlist readonly as begin set nocount on; declare @dist_ca_id int; select * into #temp from @customAttrValIds where id is not null; select @dist_ca_id = count(distinct CustomAttrID) from CustomAttributeValues c …


1
ทำไม Oracle ไม่มี nolock
ใน MS SQL Server nolockสามารถใช้งานได้ตามวัตถุประสงค์ ทำไมเราไม่สามารถใช้มันใน Oracle และ plsql ได้?

2
บีบอัดบนกอง
ต่อไปนี้เป็นย่อหน้าจากMicrosoft เอกสาร : เพจใหม่ที่จัดสรรในฮีปโดยเป็นส่วนหนึ่งของการดำเนินการ DML จะไม่ใช้การบีบอัด PAGE จนกว่าฮีปจะถูกสร้างใหม่ สร้างฮีปอีกครั้งโดยการลบและการนำการบีบอัดมาใช้ใหม่หรือโดยการสร้างและลบดัชนีคลัสเตอร์ ฉันไม่สามารถเข้าใจได้ว่าทำไมถึงเป็นเช่นนี้ หากฉันมีฮีปที่มีการตั้งค่าการบีบอัดที่ระบุเหตุใดจึงไม่ใช้กับเพจที่เป็นของตาราง ขอบคุณ

2
วิธีติดตามการบล็อกที่เกิดขึ้นน้อยกว่าหนึ่งวินาที - SQL Server
ฉันกำลังพยายามแก้ไขปัญหาการบล็อกซึ่งเกิดขึ้นน้อยกว่าหนึ่งวินาที แอปพลิเคชัน OLTP นั้นมีความละเอียดอ่อนมากและต้องมีเวลาตอบสนองน้อยกว่า 200ms สำหรับการทำธุรกรรมบางอย่างตาม SLA ที่ตกลงกันไว้ เรามีปัญหาการเพิ่มระดับการล็อคด้วยการเปิดตัวรหัสใหม่ซึ่งเราสามารถแก้ไขได้ด้วยการลดขนาดแบทช์ในการอัปเดต แม้ว่าจะมีขนาดเล็ก แต่เราสงสัยว่า sp ใหม่บล็อกแถวเดียวกันกับที่ธุรกรรม OLTP กำลังอัปเดต ฉันต้องการค้นหาเซสชันที่กำลังถูกบล็อกและทรัพยากรกำลังรออยู่ ตามความเข้าใจของฉัน "เกณฑ์กระบวนการที่ถูกบล็อก" สามารถตั้งค่าได้อย่างน้อย 1 วินาทีและดังนั้นสิ่งนี้จะไม่จับการบล็อก ฉันกำลังทดลองกับ wait_info และ wait_completed x events มีวิธีอื่นที่เราสามารถติดตามสิ่งนี้ได้หรือไม่ ขอบคุณ

1
การช่วงชิง TempDB
เรามีฐานข้อมูล OLTP 40GB ที่ใช้งานอยู่บน SQL Server 2014 SP1 พบว่าแบบสอบถามจะช้าเมื่อรอ IO_Completion ความยาวคิวดิสก์ที่เพิ่มขึ้นเป็น 900 และ SQL Server หยุดตอบสนอง สิ่งที่เราพยายาม: รีสตาร์ทอินสแตนซ์และในอีกไม่กี่นาทีมันก็จะเริ่มทำงานในลักษณะเดียวกัน หลังจากรีสตาร์ทครั้งที่สองเราเปลี่ยนขนาดเริ่มต้นของแต่ละ tempdb datafile (มีไฟล์ข้อมูล 16 ไฟล์ที่สร้างขึ้น) และเริ่มทำงานได้อย่างถูกต้อง หมายเหตุ: เรากำลังใช้ตัวแปรตารางสำหรับชุดผลลัพธ์ระดับกลาง ชุดผลลัพธ์เหล่านี้มีขนาดเล็กมาก มันเกิดขึ้นสองครั้งในหนึ่งเดือน ทุกครั้งที่ฉันเพิ่มพื้นที่ว่างเล็กน้อยลงในไฟล์ข้อมูลด้วยตนเองจากนั้นจะเริ่มทำงานตามปกติ สิ่งที่น่าสนใจกว่าก็คือการตั้งค่าเดียวกัน (ฮาร์ดแวร์เดียวกัน, โฟลเดอร์เดียวกันและการตั้งค่าไฟล์, ปริมาณงานเดียวกัน) ที่เรามีใน SQL Server 2008 R2 และ SQL Server 2012 ทำงานได้ดี กรุณาช่วยเราหาวิธีแก้ไขปัญหาอย่างถาวร ขนาดเริ่มต้นของไฟล์ข้อมูลทั้งหมดคือ 1,000MB เดียวกันปัจจุบันเป็นแต่ละไฟล์ 1500MB ทั้งหมดเหมือนกัน …

2
ความรู้สึกและประโยชน์ของการใช้ SqlCommand.Prepare () คืออะไร?
ฉันเจอรหัสนักพัฒนาซอฟต์แวร์ที่ SqlCommand.Prepare () (ดู MSDN)วิธีการใช้อย่างกว้างขวางล่วงหน้าก่อนการดำเนินการของแบบสอบถาม SQL และฉันสงสัยว่าประโยชน์ของสิ่งนี้คืออะไร? ตัวอย่าง: command.Prepare(); command.ExecuteNonQuery(); //... command.Parameters[0].Value = 20; command.ExecuteNonQuery(); ฉันได้เล่นไปรอบ ๆ เล็กน้อยและติดตาม การดำเนินการของคำสั่งหลังจากเรียกPrepare()วิธีทำให้ SQL Server ดำเนินการคำสั่งต่อไปนี้: declare @p1 int set @p1=1 exec sp_prepexec @p1 output,N'@id int,@desc text',N'INSERT INTO dbo.testtable (id) VALUES (@id)',@id=20' select @p1 หลังจากนั้นเมื่อพารามิเตอร์ได้รับมันเป็นค่าและSqlCommand.ExecuteNonQuery()ถูกเรียกต่อไปนี้ได้รับการดำเนินการใน Sql-Server: exec sp_execute 1,@id=20 สำหรับฉันแล้วดูเหมือนว่าคำสั่งจะได้รับการรวบรวมเมื่อPrepare()มีการดำเนินการในไม่ช้า ฉันสงสัยว่าประโยชน์ของสิ่งนี้คืออะไร นี่หมายความว่าใส่ลงในแคชแผนและสามารถนำกลับมาใช้ใหม่ได้ทันทีที่มีการดำเนินการคิวรีสุดท้ายด้วยค่าพารามิเตอร์ที่ต้องการ? ฉันคิดออก (และบันทึกไว้ในคำถามอื่น …

1
การดำเนินการแพคเกจ SSIS จากขั้นตอนการจัดเก็บที่มีสิทธิ์ของผู้ใช้ที่แตกต่างกัน
ฉันมีปัญหากับการอนุญาตให้ผู้ใช้ของฉันเรียกใช้งาน SSIS Packages ในลักษณะที่เหมาะสมเนื่องจากต้องการระดับสิทธิ์ที่แตกต่างกัน สถานการณ์จำลอง : เราได้สร้างคลังข้อมูลด้วยแพคเกจ SSIS ที่แตกต่างกันสองชุดที่รับผิดชอบในการโหลดด้วยข้อมูลหนึ่งชุดจะถูกเรียกใช้โดยอัตโนมัติ (ผ่านงานตัวแทนของ SQL และทำงานได้ดี) และอื่น ๆ ที่ต้องทำงานบน - ความต้องการของผู้ใช้เมื่อข้อมูลขั้นต้นได้รับการสรุปและทำความสะอาดแล้ว แพคเกจนี้ดำเนินการพิเศษที่มีสิทธิพิเศษรวมถึงการสำรองฐานข้อมูลในช่วงเริ่มต้นของการรัน (เพื่อให้แน่ใจว่าแน่ใจ) ปล่อยและสร้างตารางจากการคำนวณเป็นต้น ฉันได้เขียนขั้นตอนการจัดเก็บไว้เพื่อใช้งานนี้ผ่าน [SSISDB] [แคตตาล็อก] [create_execution] และ [SSISDB] [แคตาล็อก] [ขั้นตอนการเริ่มต้น / จัดเก็บ] [วิธีการจัดเก็บเริ่มต้น ... (ฉันเป็นผู้ดูแลระบบ) กระบวนงานที่เก็บไว้ล้มเหลวเมื่อเรียกใช้โดยผู้ใช้ปกติเนื่องจากสิทธิ์ระดับสูงที่จำเป็นใน SSISDB และ MSDB เพื่อจัดคิวการดำเนินการและแพคเกจเองล้มเหลวเนื่องจากกำลังทำงานภายใต้บริบทความปลอดภัย (ต่ำ) สิ่งที่ฉันได้ลอง : ฉันพยายามแก้ไขปัญหาโดยใช้ 'ดำเนินการเป็น' ในขั้นตอนการจัดเก็บอย่างไรก็ตามสิ่งนี้ล้มเหลวเนื่องจากปัญหาการโยงข้ามฐานข้อมูลการตั้งค่าสถานะที่น่าเชื่อถือเป็นต้น ฉันยังพยายามแก้ไขปัญหาด้วยการให้ตัวแทนงานเรียกใช้แพคเกจและเพียงแค่เรียกใช้งานตัวแทนจากขั้นตอนการจัดเก็บ แต่ฉันเข้าสู่โลกแห่งความเจ็บปวดที่เกี่ยวข้องอย่างรวดเร็ว: ไม่สามารถตั้งค่าการอนุญาตให้ใช้งานได้สำหรับแต่ละงาน ความหวังในการกำหนดค่าการเข้าถึงนี้ผ่าน Server บทบาทกลางเพื่อรองรับการเปลี่ยนแปลงพนักงานเมื่อเวลาผ่านไปและงานสามารถมีผู้ใช้เพียงคนเดียวในฐานะเจ้าของ …

3
จะโหลดเซิร์ฟเวอร์ที่เชื่อมโยงใหม่ได้อย่างไร
ฉันใช้ Microsoft SQL Server 2014 Enterprise Edition ปัญหาเกิดขึ้นกับเซิร์ฟเวอร์ที่เชื่อมโยงซึ่งจำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์หรือเพื่อหยุดMSSQLSERVERบริการ เมื่อเซิร์ฟเวอร์ทำงานอีกครั้งเซิร์ฟเวอร์ที่เชื่อมโยง (กับ DB2) จะทำงานไม่ถูกต้องและ SQL Server แสดงข้อผิดพลาดนี้: ข่าวสารเกี่ยวกับ 7302 ระดับ 16 สถานะ 1 บรรทัด 10 ไม่สามารถสร้างอินสแตนซ์ของผู้ให้บริการ OLE DB "DB2OLEDB" สำหรับเซิร์ฟเวอร์ที่เชื่อมโยง "Airspe" หลังจากรีสตาร์ทเซิร์ฟเวอร์หลายครั้งเซิร์ฟเวอร์ที่เชื่อมโยงจะเริ่มทำงาน เหตุใดจึงจำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์หลาย ๆ ครั้งเพื่อติดตั้งเซิร์ฟเวอร์ที่เชื่อมโยง มีวิธีแก้ไขปัญหาอื่น ๆ อีกไหม? นี่คือสคริปต์เพื่อสร้างหนึ่งในเซิร์ฟเวอร์ที่เชื่อมโยง: EXEC master.dbo.sp_addlinkedserver @server = N'AIRS', @srvproduct=N'Microsoft OLE DB Provider for DB2', @provider=N'DB2OLEDB', @datasrc=N'###.###.###.##',@provstr=N'Provider=DB2OLEDB; …

2
INSERTs ขนาดใหญ่ปิดกั้นการเลือก
ฉันมีปัญหากับ INSERT จำนวนมากที่บล็อกการดำเนินการ SELECT ของฉัน schema ฉันมีโต๊ะแบบนี้: CREATE TABLE [InverterData]( [InverterID] [bigint] NOT NULL, [TimeStamp] [datetime] NOT NULL, [ValueA] [decimal](18, 2) NULL, [ValueB] [decimal](18, 2) NULL CONSTRAINT [PrimaryKey_e149e28f-5754-4229-be01-65fafeebce16] PRIMARY KEY CLUSTERED ( [TimeStamp] DESC, [InverterID] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = …

2
ดัชนีคอลัมน์ที่คำนวณแล้วไม่ได้ใช้
ฉันต้องการค้นหาแบบเร็วโดยดูจากว่ามีสองคอลัมน์เท่ากัน ฉันพยายามใช้คอลัมน์ที่คำนวณด้วยดัชนี แต่ SQL Server ดูเหมือนจะไม่ใช้มัน ถ้าฉันใช้คอลัมน์บิตที่มีค่าคงที่กับดัชนีฉันจะได้ดัชนีที่ต้องการ ดูเหมือนว่ามีคำถามอื่น ๆ เช่นนี้อยู่ที่นั่น แต่ไม่มีใครสนใจว่าทำไมดัชนีจะไม่ถูกใช้ ตารางทดสอบ: CREATE TABLE dbo.Diffs ( Id int NOT NULL IDENTITY (1, 1), DataA int NULL, DataB int NULL, DiffPersisted AS isnull(convert(bit, case when [DataA] is null and [DataB] is not null then 1 when [DataA] <> [DataB] then 1 …

1
เหตุใด COUNT หลายรายการจึงเร็วกว่าหนึ่ง SUM ด้วย CASE
ฉันอยากรู้ว่าวิธีใดในสองวิธีต่อไปนี้เร็วกว่า: 1) สามCOUNT: SELECT Approved = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Approved'), Valid = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Valid'), Reject = (SELECT COUNT(*) FROM dbo.Claims d WHERE d.Status = 'Reject') 2) SUMด้วยFROM--clause: SELECT Approved = SUM(CASE WHEN Status = 'Approved' THEN 1 ELSE …

5
ขนาดคุณสมบัติไม่พร้อมใช้งานสำหรับฐานข้อมูล
ฉันเพิ่งกู้คืนฐานข้อมูลเป็นอินสแตนซ์เดียวกันกับที่สำรองไว้ (SQL Server 2008 R2 Enterprise) และพบว่าฉันไม่สามารถเข้าถึงคุณสมบัติฐานข้อมูลได้ ฉันทำสิ่งต่อไปนี้แล้ว: sp_helpdbการตรวจสอบการใช้ฐานข้อมูลถูกตั้งอย่างถูกต้องโดยใช้ saการเปลี่ยนแปลงการใช้ฐานข้อมูลเพื่อ ไม่ใช่การแก้ไข เปลี่ยนเจ้าของฐานข้อมูลกลับเป็นsysadminผู้ใช้ของฉัน ไม่ใช่การแก้ไข ออกให้DBCC updateusageกับฐานข้อมูลที่ได้รับผลกระทบ ไม่ใช่การแก้ไข รันDBCC CheckDBบนสำเนาที่กู้คืนไปยังอินสแตนซ์อื่น ไม่พบความเสียหาย สำเนาที่กู้คืน (จากไฟล์สำรองเดียวกัน) ไม่ทิ้งข้อผิดพลาดใด ๆ เมื่อเข้าถึงหน้าต่างคุณสมบัติฐานข้อมูล ใครช่วยได้บ้าง ข้อความแสดงข้อผิดพลาดที่ฉันได้รับเมื่อพยายามดูคุณสมบัติคือ: ไม่สามารถแสดงกล่องโต้ตอบที่ร้องขอ (SqlMgmt) ขนาดคุณสมบัติไม่พร้อมใช้งานสำหรับฐานข้อมูล '[DBNAME]' คุณสมบัตินี้อาจไม่มีอยู่สำหรับวัตถุนี้หรืออาจไม่สามารถเรียกคืนได้เนื่องจากสิทธิ์การเข้าถึงไม่เพียงพอ (Microsoft.SqlServer.Smo) ฉันเป็นแบบsysadminนี้ อัปเดต: ตามที่แนะนำฉันได้สร้างผู้ใช้ใหม่ทำให้เป็นดูแลระบบและเปลี่ยนเจ้าของฐานข้อมูลเป็น ไม่แก้ไขอย่างน่าเสียดาย ฉันจะดูว่าการติดตามของ profiler ทำให้เกิดประโยชน์หรือไม่ อัปเดต: แอรอน - ฐานข้อมูลดั้งเดิมถูกเปลี่ยนชื่อและออฟไลน์ แต่ยังอยู่ในอินสแตนซ์นั้น การสำรองข้อมูลของฐานข้อมูลนั้นจะถูกกู้คืนโดยใช้ชื่อเดิม ชื่อไฟล์ของไฟล์ฐานข้อมูลใหม่นั้นแตกต่างจากของจริงเพราะอยู่ในโฟลเดอร์เดียวกับไฟล์ mdf / ldf ต้นฉบับ …

2
ไม่สามารถคืนค่าฐานข้อมูลเซิร์ฟเวอร์ SQL จากการสำรองข้อมูลเต็มรูปแบบการประมวลผลบันทึกล้มเหลวฐานข้อมูลในสถานะ 'กู้คืน'
ฉันกำลังพยายามตั้งค่าฐานข้อมูลเพื่อวัตถุประสงค์ในการพัฒนาบน SQL Server Developer Edition ในเครื่องของฉัน 12.0.2000.8 ฉันได้รับการสำรองฐานข้อมูลเต็มรูปแบบและมีไฟล์สำรองข้อมูลการเข้าสู่ระบบธุรกรรมเท่านั้นซึ่งถูกส่งมาให้ฉันผ่านเครือข่าย เมื่อพยายามกู้คืนจากการสำรองข้อมูลเต็มรูปแบบหลังจากผ่านไประยะหนึ่ง (อาจจะประมาณ 1 ชั่วโมงฐานข้อมูลจะมีขนาดประมาณ 270 GB) ฉันได้รับข้อผิดพลาด: System.Data.SqlClient.SqlError: เกิดข้อผิดพลาดขณะประมวลผลบันทึกสำหรับฐานข้อมูล 'ชื่อฐานข้อมูล' หากเป็นไปได้ให้เรียกคืนจากการสำรองข้อมูล หากการสำรองข้อมูลไม่พร้อมใช้งานคุณอาจจำเป็นต้องสร้างบันทึกใหม่ (Microsoft.SqlServer.SmoExtended) หลังจากนี้ db อยู่ในสถานะ 'กำลังกู้คืน .. ' ฉันต้องการเรียกใช้บางอย่าง (ได้จากคำถามนี้ ) ALTER DATABASE recovery_test_2 SET EMERGENCY; ALTER DATABASE recovery_test_2 SET SINGLE_USER; DBCC CHECKDB (recovery_test_2, REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS; แต่โดยธรรมชาติแล้วฉันไม่สามารถทำได้เนื่องจากฐานข้อมูลอยู่ในสถานะ 'การเรียกคืน .. …

4
SQL Server Developer Edition 2012 หรือ 2014 - ดาวน์โหลด
ฉันได้ยินมาแล้ว (ฉันค่อนข้างแน่ใจ) Developer Edition นั้นฟรีและสำหรับการดาวน์โหลดมันไม่จำเป็นต้องลงทะเบียน แต่เมื่อฉันเริ่มมองหามันในวันนี้ฉันไม่สามารถหาได้จากที่ใด ความเข้าใจของฉันผิดหรือถูกต้อง? ขออภัยฉันไม่พบคำถามที่คล้ายกันที่นี่ ความคิดใด ๆ
14 sql-server 

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