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

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

3
จำกัด ผู้ใช้ให้คัดลอกเฉพาะการสำรองข้อมูล
ฉันต้องการปรับใช้การจัดส่งบันทึกในสภาพแวดล้อมการผลิตของฉัน นี่จะหมายความว่าฉันจะต้องจัดการกลุ่มการสำรองข้อมูลซึ่งอาจถูกรบกวนโดยผู้ที่สำรองข้อมูลเพื่อฟื้นฟูสภาพแวดล้อมการพัฒนา หากฉันมีความล้มเหลวและต้องการใช้การสำรองข้อมูลบันทึกเพื่อคืนค่าสู่จุดในเวลาที่ฉันจะต้องสำรองข้อมูลโดยนักพัฒนา สิ่งนี้จะไม่เกิดขึ้นหากนักพัฒนาซอฟต์แวร์ใช้เฉพาะการสำรองข้อมูล COPY เท่านั้น ดังนั้นคำถามของฉันคือมีวิธี จำกัด ผู้ใช้ให้สามารถสำรองข้อมูล COPY เท่านั้นหรือไม่

5
ตรวจจับการเปลี่ยนแปลงในตาราง SQL Server
ในแอปพลิเคชันของฉันด้วยฐานข้อมูลที่รันบน SQL Server 2012 ฉันมีงาน (ภารกิจตามกำหนดเวลา) ที่ดำเนินการแบบสอบถามที่มีราคาแพงเป็นระยะและเขียนผลลัพธ์ลงในตารางที่แอปพลิเคชันสามารถสอบถามได้ในภายหลัง โดยหลักการแล้วฉันต้องการเรียกใช้คิวรีที่มีราคาแพงเฉพาะเมื่อมีบางสิ่งเปลี่ยนแปลงเนื่องจากเคียวรีถูกเรียกใช้งานครั้งล่าสุด เนื่องจากตารางต้นฉบับมีขนาดใหญ่มากฉันจึงไม่สามารถเลือกการตรวจสอบกับคอลัมน์ผู้สมัครทั้งหมดหรืออะไรทำนองนั้น ฉันมีความคิดต่อไปนี้: เขียนการประทับเวลาที่มีการเปลี่ยนแปลงครั้งล่าสุดอย่างชัดเจนการตั้งค่าสถานะ "ต้องเป็นข้อความค้นหา" หรือสิ่งนี้ในตารางติดตามทุกครั้งที่ฉันเปลี่ยนบางสิ่งในตารางต้นฉบับ ใช้ทริกเกอร์ในการทำเช่นเดียวกัน อย่างไรก็ตามฉันอยากจะรู้ว่ามีวิธีที่มีน้ำหนักเบาในการตรวจสอบการเปลี่ยนแปลงในตารางโดยที่ฉันไม่ได้ติดตามการเขียนอย่างชัดเจนหรือไม่ ยกตัวอย่างเช่นฉันจะได้รับ "ปัจจุบัน" ROWVERSIONของตารางหรืออะไรแบบนั้น?

3
CXPACKET สูงและ LATCH_EX กำลังรอ
ฉันมีปัญหาด้านประสิทธิภาพกับระบบประมวลผลข้อมูลที่ฉันกำลังทำงานอยู่ ฉันได้รวบรวมสถิติการรอจากเวลาหนึ่งชั่วโมงที่แสดง CXPACKET และ LATCH_EX รอเหตุการณ์จำนวนมาก ระบบประกอบด้วยการประมวลผล SQL เซิร์ฟเวอร์ 3 เครื่องซึ่งมีจำนวนการกระทืบและการคำนวณจำนวนมากจากนั้นป้อนข้อมูลลงในเซิร์ฟเวอร์คลัสเตอร์กลาง เซิร์ฟเวอร์ประมวลผลสามารถมีงานได้ถึง 6 งานในแต่ละครั้ง สถิติการรอเหล่านี้มีไว้สำหรับคลัสเตอร์กลางซึ่งฉันคิดว่าเป็นสาเหตุของปัญหาคอขวด เซิร์ฟเวอร์คลัสเตอร์ส่วนกลางมี 16 คอร์และ 64GB RAM MAXDOP ถูกตั้งค่าเป็น 0 ฉันเดาว่า CXPACKET นั้นมาจากการสืบค้นหลายขนานที่ทำงานอยู่ แต่ฉันไม่แน่ใจว่าสิ่งที่ LATCH_EX รอเหตุการณ์ระบุไว้ จากสิ่งที่ฉันได้อ่านนี้อาจเป็นการรอแบบไม่บัฟเฟอร์? ทุกคนสามารถแนะนำสาเหตุของการรอคอยสถิติเหล่านี้ได้อย่างไรและฉันควรดำเนินการอย่างไรเพื่อตรวจสอบสาเหตุที่แท้จริงของปัญหาประสิทธิภาพการทำงานนี้ ผลลัพธ์ข้อความค้นหายอดนิยมคือสถิติการรอคอยทั้งหมดและผลลัพธ์ข้อความค้นหาด้านล่างคือสถิติในช่วงเวลา 1 ชั่วโมง

1
คอลัมน์ sys.partition.rows มีความแม่นยำเพียงใด
มุมมองระบบsys.partitionsมีคอลัมน์ "แถว" ที่เป็นจำนวนแถวทั้งหมดในพาร์ติชันที่กำหนด สำหรับตารางที่ไม่ได้แบ่งพาร์ติชัน (หรือมีพาร์ติชันเดียวขึ้นอยู่กับวิธีที่คุณดู) คอลัมน์นี้ให้จำนวนแถวในตาราง SELECT COUNT(1) FROM TableNameฉันอยากรู้วิธีที่ถูกต้องคือคอลัมน์นี้และถ้าผมสามารถใช้มันแทน ฉันได้ทำการทดลองที่สร้างตารางและเพิ่มสองสามพันแถวลบสองสามร้อยเพิ่มอีกสองสามพัน ฯลฯ และจำนวนนั้นตายเสมอ อย่างไรก็ตามฉันมีตารางหนึ่งตารางที่มีประมาณ 700 ล้านแถวและดัชนีหลายรายการ แถวในsys.partitionsสำหรับดัชนีคลัสเตอร์นั้นตายไปแล้วอีกครั้งอย่างไรก็ตามดัชนีอื่น ๆ แสดงความแตกต่างเล็กน้อย (+ -20k) ไม่มีใครรู้วิธีคำนวณแถวนี้และถ้ามันถูกต้องตามที่ปรากฏ?

3
SQL Server ตัดค่า varchar โดยอัตโนมัติในการเปรียบเทียบเท่ากัน แต่ไม่เหมือนกับการเปรียบเทียบ
ฉันเจอพฤติกรรมที่น่าสนใจใน SQL Server (สังเกตในปี 2005 และ 2012) วันนี้ที่ฉันหวังว่าจะมีคนอธิบาย เคียวรีที่ทำการเปรียบเทียบโดยใช้=ในเขตข้อมูล NVARCHAR จะละเว้นพื้นที่ต่อท้ายในสตริง (หรือตัดค่าอัตโนมัติก่อนการเปรียบเทียบ) แต่แบบสอบถามเดียวกันโดยใช้ตัวlikeดำเนินการไม่ได้เพิกเฉยพื้นที่ การจัดเรียงที่ใช้คือ Latin1_General_CI_AS ในปี 2012 พิจารณาซอ Fiddle นี้: http://sqlfiddle.com/#!6/72262/4 โปรดสังเกตว่าตัวlikeดำเนินการไม่ส่งคืนผลลัพธ์สำหรับสตริงช่องว่างต่อท้าย แต่ตัว=ดำเนินการทำ ทำไมนี้ คะแนนโบนัส: ฉันไม่สามารถทำซ้ำสิ่งนี้ในเขตข้อมูล VARCHAR ฉันคิดว่าพื้นที่จะได้รับการจัดการในลักษณะเดียวกันในทั้งสองประเภทข้อมูล - จริงหรือไม่

1
ใช้มาตรฐาน SQL Server 2012 ด้วย Bitlocker
เรากำลังพยายามใช้ Bitlocker เพื่อรักษาความปลอดภัยฐานข้อมูล SQL Server 2012 เราไม่มีปัญหาใด ๆ ในการทำให้ bitlocker ทำงาน ... ปัญหาที่เรามีคือเมื่อไดรฟ์ถูกล็อค SQL Server จะไม่สามารถอ่านข้อมูลได้อีกต่อไป เรายินดีที่จะใช้ TDE อย่างชัดเจน แต่เนื่องจาก จำกัด รุ่น Enterprise จึงไม่ต้องไป เราเปิดใช้งาน TPM บนเซิร์ฟเวอร์แล้ว นี่เป็นโดเมน Windows และเราใช้การรับรองความถูกต้องของ Windows ... แต่เมื่อไดรฟ์ได้รับการเข้ารหัสเราจะไม่สามารถเข้าถึงฐานข้อมูลด้วยอะไรก็ได้ ฉันหายไปนี่อะไร

3
ฉันสามารถสร้างประเภทตารางที่ผู้ใช้กำหนดและใช้ในธุรกรรมเดียวกันได้หรือไม่?
เมื่อฉันดำเนินการต่อไปนี้ (ในสตูดิโอการจัดการ GO จะแยกคำสั่งออกเป็นแบทช์) use tempdb begin tran go CREATE TYPE dbo.IntIntSet AS TABLE( Value0 Int NOT NULL, Value1 Int NOT NULL ) go declare @myPK dbo.IntIntSet; go rollback ฉันได้รับข้อความแจ้งข้อผิดพลาดการหยุดชะงัก กระบวนการของฉันหยุดชะงักด้วยตัวเอง ฉันเคยเห็นพฤติกรรมนี้ในปี 2008, 2008R2 และ 2012 มีวิธีใช้ประเภทที่สร้างขึ้นใหม่ของฉันภายในธุรกรรมเดียวกันกับที่สร้างขึ้นหรือไม่

2
sp_executesql รีเฟรชแผนแบบสอบถามเมื่อใด
คุณจะต้องให้อภัยความไร้เดียงสาของฉันเพราะฉันไม่ใช่ DBA แต่ความเข้าใจของฉันคือเมื่อเวลาผ่านไปสถิติของการเปลี่ยนแปลงฐานข้อมูลและกระบวนการจัดเก็บจะต้องถูกคอมไพล์ใหม่เพื่อให้แผนแบบสอบถามเป็นปัจจุบันด้วยสถิติล่าสุด สมมติว่าฉันมีโพรซีเดอร์ที่เก็บไว้ในฐานข้อมูลของฉันซึ่งถูกคอมไพล์กับสถิติล่าสุดในบางช่วงเวลาปกติความหมายของอินไลน์ซับโพรซีเดอร์ที่เก็บในโค้ดและล้อมรอบในsp_executesqlคำสั่งคืออะไร? ฉันจะสูญเสียการรีเฟรชแผนแบบสอบถามที่เคยเกิดขึ้นเป็นส่วนหนึ่งของการคอมไพล์ใหม่ของขั้นตอนหรือไม่ หากมีสิ่งอื่นใด (นอกเหนือจากสิทธิ์) ที่ฉันต้องพิจารณาก่อนที่จะทำการเปลี่ยนแปลงนี้แล้วฉันขอขอบคุณข้อมูลเชิงลึกของคุณ ฉันอ่านสิ่งนี้ใน MSDN: ความสามารถของเครื่องมือเพิ่มประสิทธิภาพการสืบค้น SQL Server เพื่อจับคู่สตริง Transact-SQL ใหม่กับแผนการดำเนินการที่มีอยู่ถูกขัดขวางโดยค่าพารามิเตอร์ที่เปลี่ยนแปลงตลอดเวลาในข้อความของสตริงโดยเฉพาะอย่างยิ่งในงบ Transact-SQL ที่ซับซ้อน ดังนั้นสมมติว่ากระบวนการที่เก็บไว้ฉันพยายาม in-line และ wrap ในsp_executesqlนั้นมีพารามิเตอร์บางอย่างแน่นอนนี่คือการบอกว่าแม้ว่าแผนการดำเนินการของฉันจะถูกแคชฉันทำให้ SQL Server สามารถค้นหาและนำกลับมาใช้ใหม่ได้ยากขึ้นหรือไม่

4
ไม่สามารถจัดสรรหน้าใหม่สำหรับฐานข้อมูลเนื่องจากมีพื้นที่ดิสก์ไม่เพียงพอ
การใช้ตัวช่วยสร้างการนำเข้าและส่งออกเซิร์ฟเวอร์ SQL ฉันได้รับข้อผิดพลาดนี้: ข้อผิดพลาด 0xc0202009: งานการไหลของข้อมูล 1: รหัสข้อผิดพลาด SSIS DTS_E_OLEDBERROR มีข้อผิดพลาด OLE DB เกิดขึ้น รหัสข้อผิดพลาด: 0x80004005 ไม่สามารถจัดสรรหน้าใหม่สำหรับฐานข้อมูล 'ฐานข้อมูล' เนื่องจากพื้นที่ดิสก์ไม่เพียงพอในกลุ่มไฟล์ 'หลัก' สร้างพื้นที่ที่จำเป็นโดยการวางวัตถุในกลุ่มไฟล์เพิ่มไฟล์เพิ่มเติมไปยังกลุ่มไฟล์หรือการตั้งค่าอัตโนมัติในไฟล์ที่มีอยู่ในกลุ่มไฟล์ ฉันพยายามอัปโหลดไฟล์ขนาด 2GB และในขณะที่โหลดไฟล์ลำดับที่ 4 ฉันยังคงได้รับข้อความแสดงข้อผิดพลาดข้างต้นแม้หลังจากไปที่คุณสมบัติฐานข้อมูล> ไฟล์และเปลี่ยน autogrowth ของ Filegroup เป็น 2,500 MB และไม่ จำกัด ขนาดสูงสุด วิธีแก้ปัญหาที่ดีที่สุดคืออะไร ในที่สุดข้อมูลนี้จะใช้เวลาประมาณ 60-80GB
13 sql-server 

1
การตั้งค่าตัวแปรในโหมด SQLCMD
ใช้ SQL Server 2008 R2 Enterprise Edition พิจารณาข้อความต่อไปนี้: :setvar source_server_name "SERVERNAME\INSTANCENAME" เป็นไปได้ในโหมด SQLCMD เพื่อรับค่านั้นโดยใช้ TSQL สิ่งที่ต้องการ: :setvar source_server_name = SELECT @@servername ขอขอบคุณ อัพเดทเมื่อ 7/15/2013 คำตอบสองข้อเสนอด้านล่างไม่ได้ให้ผลลัพธ์ที่ต้องการดังนั้นฉันจึงเพิ่มตัวอย่างที่เกี่ยวข้อง :setvar source_server_name [myserver] ตัวแปร source_server_name ถูกตั้งค่าเป็นสตริงข้อความ [myserver_1] ฉันต้องการทำสิ่งนี้: create table #tmp( id int identity(1,1), server sysname ) insert into #tmp values('myserver_1'),('myserver_2'); :setvar source_server_name = SELECT …

4
แทรกจำนวนมากผ่านเครือข่าย
ใครสามารถช่วยฉันด้วยสิ่งเหล่านี้? BULK INSERT DATABESE01.dbo.TABLE01 FROM '\\COMPUTER01\FOLDER01\TextFile.txt' WITH ( FIELDTERMINATOR = ' ', rowterminator = '\n', tablock ) ข้อผิดพลาดแสดงไม่สามารถเปิดได้: ไม่สามารถแทรกจำนวนมากได้เนื่องจากไม่สามารถเปิดไฟล์ '\ SERVERNAME \ FOLDERNAME \ textFile.txt' รหัสข้อผิดพลาดของระบบปฏิบัติการ 5 (ปฏิเสธการเข้าถึง) พา ธ อยู่บนคอมพิวเตอร์เครื่องอื่นบนเครือข่าย

2
แกน CPU เพิ่มเติมเทียบกับดิสก์ที่เร็วกว่า
ฉันเป็นส่วนหนึ่งของ บริษัท ขนาดเล็กดังนั้นตามปกติจะครอบคลุมบทบาทที่แตกต่างกันจำนวนหนึ่ง ล่าสุดคือการจัดหากล่อง SQL Server เฉพาะสำหรับ. NET web app ของเรา เราได้รับการยกมาใน Dual Xeon E5-2620 (หกคอร์) การกำหนดค่าซีพียู 2.00 GHz (รวม 12 คอร์) พร้อม RAM 32 GB สิ่งนี้ทำให้เรามีงบประมาณ จำกัด สำหรับดิสก์อาเรย์ซึ่งโดยพื้นฐานแล้วจะประกอบด้วยไดรฟ์ SAS 300 GB 2.5 นิ้ว (15k RPM) สองตัวในการกำหนดค่า RAID 1 ฉันรู้ว่าการตั้งค่าดิสก์นั้นเหมาะสมที่สุดสำหรับ SQL Server และฉันต้องการผลักดัน RAID 10 จริงๆเพื่อให้เราสามารถวางฐานข้อมูลไฟล์บันทึกและ tempdb ลงในไดรฟ์ของตัวเอง เพื่อที่จะทำให้มันเข้ากันได้กับงบประมาณของเราฉันควรพิจารณาลดจำนวนคอร์ของ CPU …

2
ทำไมไม่ใช่ตัวเลข LIKE [0-9]
การเปรียบเทียบค่าเริ่มต้นของเซิร์ฟเวอร์ของฉันคือ Latin1_General_CI_AS ตามที่กำหนดโดยแบบสอบถามนี้: SELECT SERVERPROPERTY('Collation') AS Collation; ฉันรู้สึกประหลาดใจที่ค้นพบว่าด้วยการเปรียบเทียบนี้ฉันสามารถจับคู่อักขระที่ไม่ใช่ตัวเลขในสตริงโดยใช้เพLIKE '[0-9]'รดิเคต ทำไมในการจัดเรียงเริ่มต้นนี้เกิดขึ้นได้อย่างไร ฉันไม่สามารถนึกถึงกรณีที่สิ่งนี้จะเป็นประโยชน์ ฉันรู้ว่าฉันสามารถหลีกเลี่ยงพฤติกรรมนี้ได้โดยใช้การเปรียบเทียบแบบไบนารี แต่ดูเหมือนจะเป็นวิธีที่แปลกในการใช้การเปรียบเทียบแบบเริ่มต้น ตัวกรองหลักสร้าง caracters ที่ไม่ใช่ตัวเลข ฉันสามารถสาธิตพฤติกรรมโดยการสร้างคอลัมน์ที่มีค่าอักขระไบต์เดียวที่เป็นไปได้ทั้งหมดและกรองค่าด้วยภาคแสดงการจับคู่ตัวเลข คำสั่งต่อไปนี้สร้างตารางชั่วคราวที่มี 256 แถวหนึ่งแถวสำหรับรหัสแต่ละจุดในหน้ารหัสปัจจุบัน: WITH P0(_) AS (SELECT 0 UNION ALL SELECT 0), P1(_) AS (SELECT 0 FROM P0 AS L CROSS JOIN P0 AS R), P2(_) AS (SELECT 0 FROM P1 AS L …

3
มีวิธีการตรวจสอบว่าแบบสอบถาม SQL Server ทำงานในหน่วยความจำหรือไปที่ดิสก์?
ฉันเจอชุดของขั้นตอนการจัดเก็บในแอปพลิเคชันวันนี้ที่เรียกซ้ำ ๆ กันในกระบวนการที่ใช้เวลานาน ภายในแต่ละโพรซีเดอร์ฉันพบคำสั่งเลือกหลายคำสั่งบางคำสั่งในลูป ไม่น่าแปลกใจที่กิจวัตรเหล่านี้ที่ใช้ในปัจจุบันใช้เวลาหลายนาทีในการทำงาน ดูเหมือนว่าค่อนข้างชัดเจนว่าประสิทธิภาพไม่ได้ถูกนำมาพิจารณาเมื่อเขียนขั้นตอนเหล่านี้มีหลายสิ่งที่เป็นเพียง "ไม่ใช่ความคิดที่ดี" การประมวลผลแต่ละแถวเมื่อนำเข้าข้อมูลใช้เวลา 300ms ต่อแถวดังนั้นการนำเข้าขนาดเล็กจึงใช้เวลาประมวลผลหลายนาที อย่างไรก็ตามตารางที่เกี่ยวข้องกับกระบวนการส่วนใหญ่ค่อนข้างเล็ก ฉันคิดว่าถ้าตารางเหล่านี้ทั้งหมดอยู่ในความทรงจำอย่างเต็มที่บางทีอาจมีไม่มากนักที่จะได้รับจากการเขียนสิ่งนี้ ฉันกำลังพยายามหา .... สำหรับรหัสที่ไม่มีประสิทธิภาพนี้ชัดแจ้งว่ามีผลกระทบจริงเพียงใด มันคุ้มค่าที่จะแก้ไขหรือไม่ ดังนั้นคำถามคือ: - มีวิธีการกำหนดตารางใดตรึงในหน่วยความจำทั้งหมดหรือไม่ - มีวิธีเปิดใช้การติดตามเพื่อตรวจสอบขั้นตอนการจัดเก็บซ้อนเพื่อค้นหาส่วนที่มีราคาแพงโดยเฉพาะหรือไม่ หมายเหตุ: สิ่งนี้อยู่ใน SQL Server 2008 R2

4
ฉันใช้ SQL Server Agent เพื่อกำหนดเวลาแม้แต่งานที่ไม่ใช่ฐานข้อมูล - นี่เป็นความคิดที่ไม่ดีใช่ไหม
เนื่องจากฉันเป็น DBA (และในหลาย ๆ กรณีระบบปฏิบัติการจริง) ดังนั้น SQL Server จึงได้รับการติดตั้งบนเซิร์ฟเวอร์ทุกเครื่องที่ฉันต้องทำงานเป็นประจำ ฉันเพิ่งรู้ว่าฉันใช้ SQL Agent เป็นตัวกำหนดเวลางานในเกือบทุกกรณีแทนที่จะเป็น Windows Task Scheduler จากมุมมองของฉันตัวแทน SQL มีข้อได้เปรียบเหนือ Windows Task Scheduler หลายประการ: รีโมต (จากเวิร์กสเตชันของฉัน) เริ่ม / หยุด / ตรวจสอบงาน แชร์กำหนดการ (ไม่ใช่แต่ละงานด้วยตัวเอง) หลายขั้นตอนและการควบคุมการไหล งานประเภทต่าง ๆ แจ้งเตือนเมื่อความล้มเหลว / เสร็จสิ้น สามารถกำหนดค่าให้ทำหน้าที่ผู้ใช้ที่แตกต่างกัน (ปานกลาง) ข้อความแสดงข้อผิดพลาดอธิบายมากกว่ารหัสข้อผิดพลาด อย่างไรก็ตามฉันไม่สามารถหลบหนีจากความรู้สึกที่ว่านี่เป็นแนวปฏิบัติที่ไม่ดี - SQL Agent ควรสำรองไว้สำหรับงานที่เกี่ยวข้องกับฐานข้อมูลเท่านั้นและฉันควรปล่อยให้ระบบปฏิบัติการระดับทำงานใน Windows Task Scheduler แม้ว่าฉันจะไม่ชอบการใช้งานก็ตาม …

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