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

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

2
จะปรับปรุงการประมาณแถวได้อย่างไรเพื่อลดโอกาสของการหกถึง tempdb
ฉันสังเกตเห็นว่าเมื่อมีการรั่วไหลของเหตุการณ์ tempdb (ทำให้เกิดการสืบค้นที่ช้า) ซึ่งบ่อยครั้งที่การประมาณแถวนั้นเป็นวิธีการปิดการเข้าร่วมแบบเฉพาะ ฉันเคยเห็นเหตุการณ์การรั่วไหลเกิดขึ้นจากการรวมและแฮชรวมและพวกเขามักจะเพิ่มรันไทม์ 3x เป็น 10x คำถามนี้เกี่ยวข้องกับวิธีปรับปรุงการประมาณการแถวภายใต้สมมติฐานว่าจะลดโอกาสการเกิดเหตุการณ์หก จำนวนแถวจริง 40k สำหรับแบบสอบถามนี้แผนจะแสดงค่าประมาณแถวที่ไม่ดี (11.3 แถว): select Value from Oav.ValueArray where ObjectId = (select convert(bigint, Value) NodeId from Oav.ValueArray where PropertyId = 3331 and ObjectId = 3540233 and Sequence = 2) and PropertyId = 2840 option (recompile); สำหรับแบบสอบถามนี้แผนแสดงการประมาณแถวที่ดี (56k แถว): declare @a …

3
การปัดเศษทศนิยมอัตโนมัติ
คำถามนั้นค่อนข้างง่าย ฉันต้องการคำนวณ 3 คอลัมน์ที่ผลลัพธ์กลางคือทศนิยมมากและฉันพบปัญหาในช่วงต้นกับ SQL Server โดยทั่วไปการปัดเศษทศนิยมโดยไม่คำนึงถึงการแปลง / แปลงใด ๆ ตัวอย่างเช่นลองทำหารง่าย ๆ เป็น 1234/1233 เครื่องคิดเลขจะผลิต 1,00081103000811 แต่เมื่อฉันทำเช่นนี้บน SQL Server เราได้รับต่อไปนี้: -- Result: rounded at 1.000811000... with trailing zeroes up until the 37 precision SELECT CAST(CAST(1234 AS DEC(38,34))/CAST(1233 AS DEC(38,34)) AS DEC(38,37)) -- Result: rounded at 1.000811 SELECT CONVERT(DECIMAL(38,32), 1234)/CONVERT(DECIMAL(38,32),1233) -- …

5
การตั้งค่าหน่วยความจำสูงสุดใน SQL Server
ฉันใช้ SQL Server 2008 และแอปพลิเคชันบนเว็บบนเซิร์ฟเวอร์เฉพาะเครื่องเดียวมีหน่วยความจำเพียง 2Gb เท่านั้น ตามที่ระบุไว้ที่อื่น SQL Server ใช้หน่วยความจำกายภาพสูงสุดถึง 98% เป็นประจำซึ่งดูเหมือนจะทำให้เว็บแอพพลิเคชันทำงานช้าลงบนเซิร์ฟเวอร์ ในคุณสมบัติเซิร์ฟเวอร์ใน SSMS ภายใต้หน่วยความจำหน่วยความจำเซิร์ฟเวอร์สูงสุด (เป็น Mb) ถูกตั้งค่าเป็น: 2147483647 คำถามของฉันคือจำนวนที่แนะนำที่จะใส่ในกล่องหน่วยความจำเซิร์ฟเวอร์สูงสุดตามจำนวนหน่วยความจำที่ฉันมีอยู่และเซิร์ฟเวอร์เดียวกันก็ใช้งานเว็บแอปพลิเคชันด้วยหรือไม่ นอกจากนี้การเปลี่ยนหมายเลขนี้เป็นเรื่องที่ปลอดภัยหรือไม่ในขณะที่ SQL Server กำลังทำงานอยู่ ขอบคุณสำหรับคำแนะนำ.

3
วิธีปฏิบัติที่ดีที่สุดสำหรับไฟล์บันทึก tempdb
ฉันได้อ่านหลายบล็อกที่นี่และมีเกี่ยวกับวิธีการกำหนดค่า tempdb แฟ้มข้อมูล แต่ไม่ได้ฉันพบข้อมูลใด ๆ เกี่ยวกับการล็อกไฟล์ tempdb นี่เป็นกลยุทธ์ที่ฉันใช้กับ tempdb ของฉัน: ฉันใช้คำแนะนำของ Paul Randalในการแบ่งไฟล์ข้อมูล tempdb ของฉัน ฉันได้ตั้งค่าขนาดของไฟล์ข้อมูล tempdb ให้เป็นค่าสูงสุดและปิดการใช้งานอัตโนมัติ ตัวอย่างเช่นฉันมีพื้นที่ว่างในดิสก์ 100GB และตั้งขนาดของไฟล์ข้อมูล 8 tempdb ของฉันเป็น 10gb ต่อไฟล์ วิธีนี้ช่วยป้องกันการแตกแฟรกเมนต์บนดิสก์ตามที่ Brent Ozar แนะนำและฉันมี 20GB ฟรีสำหรับไฟล์บันทึกของฉัน แต่ชอบพูดว่าไม่มีใครจะพูดคุยเกี่ยวกับแฟ้มบันทึก tempdb ฉันควรทำอย่างไรกับมัน? ในการตั้งค่าของฉันไฟล์นี้อยู่ในที่เดียวกับไฟล์ข้อมูล tempdb ขนาดและค่า autogrowth ที่ฉันควรใช้กับล็อกไฟล์ tempdb คืออะไร

2
การบีบอัดข้อมูล SQL Server นั้นดีสำหรับฐานข้อมูลแบบอ่านอย่างเดียวหรือไม่?
บางวรรณกรรมเกี่ยวกับการบีบอัดข้อมูล SQL Server ฉันอ่านว่าค่าใช้จ่ายในการเขียนเพิ่มขึ้นประมาณสี่เท่าตามปกติ ดูเหมือนว่านี่เป็นข้อเสียเปรียบหลักของการบีบอัดข้อมูลซึ่งหมายความว่าสำหรับฐานข้อมูลการเก็บถาวรแบบอ่านอย่างเดียวประสิทธิภาพจะดีขึ้นด้วยการใช้การบีบอัดข้อมูลที่เต็มหน้า 100% ข้อความข้างต้นเป็นจริงหรือไม่ "การเปลี่ยนแปลง" หลักระหว่างการบีบอัดข้อมูลกับอะไร (สำหรับการอ่าน) "CPU + x%" "IO -y%"? หน้าแยกเกิดขึ้น? การใช้งาน tempdb? การใช้ RAM? และสำหรับการเขียน? สำหรับวัตถุประสงค์ของคำถามนี้คุณสามารถ จำกัด บริบทเป็นการบีบอัดระดับหน้าของฐานข้อมูลขนาดใหญ่(> 1TB)แต่ยินดีต้อนรับความคิดเห็นเพิ่มเติมเสมอ อ้างอิง: บล็อก SQL Server Storage Engine (สถานการณ์สมมติ DW แสดงให้เห็นว่าการบีบอัดมีประโยชน์มาก) การบีบอัดข้อมูล: กลยุทธ์การวางแผนกำลังการผลิตและวิธีปฏิบัติที่ดีที่สุด วิธีการที่มีรายละเอียดมากขึ้นในการตัดสินใจว่าจะบีบอัดอะไรเกี่ยวข้องกับการวิเคราะห์คุณสมบัติเวิร์กโหลดสำหรับแต่ละตารางและดัชนี มันขึ้นอยู่กับสองตัวชี้วัดต่อไปนี้: U: เปอร์เซ็นต์ของการดำเนินการอัปเดตบนตารางดัชนีหรือพาร์ติชันเฉพาะเมื่อเทียบกับการดำเนินการทั้งหมดบนวัตถุนั้น ยิ่งค่าของ U ต่ำลง (นั่นคือตารางดัชนีหรือพาร์ติชันถูกอัพเดตนาน ๆ ครั้ง) ผู้สมัครที่ดีกว่าสำหรับการบีบอัดหน้า S: เปอร์เซ็นต์ของการดำเนินการสแกนบนตารางดัชนีหรือพาร์ติชันสัมพันธ์กับการดำเนินการทั้งหมดบนวัตถุนั้น ยิ่งค่าของ …


1
ทำไมเซิร์ฟเวอร์ sql จำเป็นต้องแปลงผลลัพธ์ count (*) เป็น int ก่อนที่จะเปรียบเทียบกับตัวแปร int?
ฉันมีคำถามมากมายในแอปพลิเคชันของฉันซึ่งในประโยคที่มีฉันมีการเปรียบเทียบฟังก์ชั่นการนับรวมกับตัวแปร int ในแผนคิวรีฉันสามารถเห็น implicit_convert ก่อนการเปรียบเทียบ ฉันต้องการทราบว่าทำไมสิ่งนี้เกิดขึ้นเพราะตามเอกสารเซิร์ฟเวอร์ sql ฟังก์ชั่นการนับกลับเป็น int เหตุใดจึงต้องมีการแปลงโดยนัยสำหรับการเปรียบเทียบค่า int สองค่า ต่อไปนี้เป็นส่วนหนึ่งของแผนแบบสอบถามหนึ่งที่ @IdCount ถูกกำหนดให้เป็นตัวแปร int | --Filter (สถานที่: ([Expr1022] = [@ IdCount])) | - คำนวณสเกลาร์ (คำจำกัดความ: ([Expr1022] = CONVERT_IMPLICIT (int, [Expr1028], 0))) | - สตรีมรวม (กลุ่มตาม: ([MOCK_DB]. [dbo]. [ขอบเขต]. [ขอบเขต ID]) กำหนด: ([Expr1028] = จำนวน (*)))

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

4
ข้อความค้นหาช้าสำหรับผู้ใช้บางราย
ฉันมีแบบสอบถามสองสามข้อที่เรียกจากแอปพลิเคชันเว็บ C # .NET ซึ่งรวดเร็วสำหรับฉันเสมอ (ฉันเป็นผู้ดูแลระบบภายใน SQL Server) แต่สำหรับกลุ่มผู้ใช้ (กลุ่มโดเมนที่มีสิทธิ์ที่จำเป็น) แบบสอบถามนั้นช้ามาก จุดที่มันหมดเวลาในแอปพลิเคชัน อะไรจะทำให้การค้นหาเดียวกันที่แน่นอนนั้นทำงานต่างกันสำหรับผู้ใช้ที่ต่างกัน ข้อมูลเพิ่มเติม: แบบสอบถามเป็นแบบอินไลน์ SQL ในรหัส C # ไม่ใช่ขั้นตอนการจัดเก็บ แอปใช้การรับรองความถูกต้องของโดเมนและทั้งผู้ใช้และตัวฉันเองเรียกใช้แบบสอบถามผ่านแอป ดูเหมือนว่าปัญหานี้เป็นแผนที่แตกต่างกันและมีการแคชหนึ่งครั้งดังนั้นจึงเป็นเหตุผลที่แตกต่างกันสำหรับผู้ใช้ที่ต่างกัน มีบางอย่างที่ส่งผลต่อแคชเพราะตอนนี้คิวรีช้าสำหรับฉันผ่านแอปและรวดเร็วใน SQL Server Management Studio

1
เหตุใดแบบสอบถาม SQL Server จึงไม่ใช้ดิสก์ I / O มากกว่า 7MB / วินาที
ฉันมี SSD ที่ใช้การทดสอบ IOmeter แสดงประสิทธิภาพมากกว่า 200MB / s อย่างไรก็ตามเมื่อฉันเรียกใช้แบบสอบถาม SQL ใด ๆ จากเครื่องท้องถิ่นการตรวจสอบทรัพยากร windows ไม่เคยแสดงดิสก์ IO เหนือ 7MB / วินาที สิ่งนี้ถือเป็นจริงแม้กระทั่งการสืบค้นที่ใช้เวลานานกว่า 2 นาที สิ่งที่เป็นปัญหาคอขวดคือการใช้เพียง 7MB / วินาทีจาก SSD? ฉันกำลังวิ่ง: มาตรฐาน Windows Server 2012 SQL Server 2008 r2 Intel i7 3820 หน่วยความจำ 32GB sandisk SSD

1
SQL Server Deadlock สำหรับการอัพเดตสองครั้งเนื่องจากคำสั่งล็อคดัชนี
ฉันมีการอัปเดตสองครั้ง - หนึ่งล็อค CI ก่อนจากนั้น NCI (ตามสถานะ) เนื่องจากคอลัมน์สถานะกำลังอัปเดตด้วย อีกคนหนึ่งเป็นเจ้าของล็อค U บน NCI เพราะรู้ว่ามันกำลังเปลี่ยนแปลงและพยายามดึง U ล็อคบน CI วิธีที่ง่ายที่สุดในการบังคับให้สิ่งเหล่านี้เป็นอันดับคืออะไร ดูเหมือนแปลกที่จะใช้คำใบ้ระดับ Table เนื่องจากนี่เป็นปัญหาการจัดทำดัชนีภายใน - มีเพียงหนึ่งตารางที่เกี่ยวข้อง - UPDLOCK จะ HOLDLOCK จะใช้กับดัชนีทั้งหมดที่จำเป็นในตารางนั้นโดยอัตโนมัติหรือไม่ นี่คือแบบสอบถาม: UPDATE htt_action_log SET status = 'ABORTED', CLOSED = GETUTCDATE() WHERE transition_uuid = '{F53ADDDA-E46B-4726-66D8-D7B640B66597}' AND status = 'OPEN'; X ตัวนั้นล็อกแถวใน CI (บนคอลัมน์ CREATED) …

2
กู้คืนฐานข้อมูลจากไฟล์สำรองของรุ่น / รุ่นที่แตกต่างกัน
ฉันอ่านว่าเป็นไปได้ที่จะกู้คืนฐานข้อมูลใน SQL Server ตราบใดที่คุณกำลังกู้คืนจากรุ่นเก่าเป็นรุ่นที่ใหม่กว่าด้วยเหตุผลด้านความเข้ากันได้ย้อนหลัง มีใครรู้บ้างไหมถ้าคุณสามารถกู้คืนฐานข้อมูลจากไฟล์ * .bak สำหรับ SQL Server รุ่นต่าง ๆ ได้ เรากำลังย้ายฐานข้อมูลที่มีขนาดใหญ่มากผ่านทาง FTP ซึ่งจะใช้เวลาสองสามวันดังนั้นเราควรทำเช่นนี้เพียงครั้งเดียว หากไม่มีใครตอบกลับตามเวลาที่เราถ่ายโอนฐานข้อมูลผ่านทาง FTP เราจะลองใช้งานและดูว่ามันใช้งานได้โดยการทดสอบและตอบคำถามของเราเองหรือไม่ ด้านล่างนี้เป็นแบบสอบถามเพื่อรับรายละเอียดรุ่นของ SQL Server อยู่ในรูปแบบproductversion {major revision}.{minor revision}.{release revision}.{build number}ในกรณีของฉัน{release revision}ค่ามี5500สำหรับแหล่งที่มาและ5512เป้าหมาย นั่นดูไม่เป็นไร อย่างไรก็ตามความeditionแตกต่าง ค้นหา: SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY('productlevel'), SERVERPROPERTY('edition') ฐานข้อมูลแหล่งที่มา: 10.0.5500.0 SP3 Developer Edition (64-bit) ฐานข้อมูลเป้าหมาย: 10.0.5512.0 SP3 Enterprise Edition (64-bit)

2
เนื้อหาของไฟล์บันทึกธุรกรรมโดยละเอียด
ฉันมีคำถามเกี่ยวกับการทำธุรกรรม (ขอเรียกสั้น ๆ ว่า LDF) เนื้อหา ฉันสมมติว่าฐานข้อมูลพร้อมกับแบบจำลองการกู้คืนเต็มรูปแบบ ฉันได้อ่านว่าไฟล์ LDF มี (บันทึก) การดำเนินการแต่ละรายการและทุกครั้งไปยังฐานข้อมูล (ที่อยู่ในโหมดการกู้คืนเต็ม) มันแตกต่างจากการล็อกระหว่างBEGIN TRAN; COMMAND(s); COMMITอะไร ฉันถามเพราะเห็นได้ชัดว่าคุณสามารถย้อนกลับธุรกรรม แต่คุณไม่สามารถย้อนกลับคำสั่งมาตรฐาน (ในโหมดการกู้คืนเต็ม) ฉันเดาว่าระหว่างการทำธุรกรรมเนื้อหาที่ถูกบันทึกลงในไฟล์ LDF นั้นแตกต่างจากการบันทึกการกู้คืนแบบเต็มปกติ นั่นถูกต้องใช่ไหม? แตกต่างกันอย่างไร เป็นเพียงการรวมการดำเนินงาน "เลิกทำ" สำหรับแต่ละการกระทำหรือไม่ ในบันทึกที่เกี่ยวข้องฉันได้ยินมาว่ามีเครื่องมือเชิงพาณิชย์สำหรับ "การย้อนกลับ / เลิกทำ" คำสั่งมาตรฐานโดยใช้ไฟล์ LDF สำหรับการกู้คืนแบบเต็ม พวกเขาทำมันได้อย่างไร? พวกเขาวิเคราะห์เนื้อหาของ LDF หรือไม่และพยายามทำสิ่งที่ตรงกันข้าม / เลิกทำหรือไม่?

1
บริบท DB_ID จากสแต็คการโทรไกลขึ้น
ใน SQL Server เป็นไปได้หรือไม่ที่จะรับDB_IDจากบริบทจากระยะไกลกว่า call stack? เป้าหมายของฉันคือการสร้างฟังก์ชั่นยูทิลิตี้ที่มีประโยชน์ (และแฮ็คยอมรับ) ในฐานข้อมูล dev sandbox ที่ทำให้มันง่ายและรัดกุมเพื่อให้ได้ชื่อของวัตถุที่มีคุณสมบัติครบถ้วนที่กำหนดชื่อแบบสั้นหรือแบบแยกส่วน . ฟังก์ชั่นยูทิลิตี้เหล่านี้จะอยู่ในฐานข้อมูลยูทิลิตี้เดียว แต่เรียกจากฐานข้อมูลอื่น ๆ บนเซิร์ฟเวอร์เดียวกัน จากสิ่งที่ฉันเห็นจากการทดสอบ: ORIGINAL_DB_NAME()ตามที่ต้องการจะส่งคืนสิ่งที่อยู่ในสตริงการเชื่อมต่อไม่ใช่บริบทปัจจุบัน (กำหนดโดยUSE [dbname]) เมื่อเรียกฟังก์ชั่นDB_NAME()ส่งกลับชื่อของฐานข้อมูลที่ฟังก์ชั่นที่กำหนดไว้ อีกวิธีในการพูดแบบนี้คือบริบทภายในฟังก์ชันหรือกระบวนงานที่เก็บไว้คือของฐานข้อมูลที่กำหนดไว้ ฉันรู้ว่าเอ็นจิ้นติดตามสถานะของฐานข้อมูลแต่ละบริบทขึ้น ๆ ลง ๆ สแต็กการโทร (ดูด้านล่างเพื่อพิสูจน์) ดังนั้นมีวิธีการเข้าถึงข้อมูลนี้หรือไม่? ฉันต้องการที่จะสามารถค้นหาและดำเนินการกับวัตถุในบริบทของฐานข้อมูลของผู้โทรถึงแม้ว่ารหัสการดำเนินการไม่ได้อยู่ในฐานข้อมูลเดียวกัน ตัวอย่างเช่น: use SomeDB EXEC util.dbo.frobulate_table 'my_table' ฉันรู้ว่าฉันสามารถทำได้ EXEC util.dbo.frobulate_table 'SomeDB.dbo.my_table' แต่ฉันแค่อยากรู้อยากเห็นจริง ๆ ถ้าเป็นไปได้ในการสอบถามสแตกการโทรด้วยวิธีนี้ อัปเดต / บันทึกย่อ ผมไม่อ่านและดาวน์โหลดรหัสจากบล็อกของกาเบรียล McAdams' นี่เป็นเร็กคอร์ดของ …
11 sql-server 

1
โดยประมาณกับแผนแบบสอบถามจริงกับการเรียกใช้ฟังก์ชัน
ฉันมีแบบสอบถามนี้ในเซิร์ฟเวอร์ SQL แบบสอบถามจำลองแบบผสาน: SELECT DISTINCT b.tablenick, b.rowguid, c.generation, sys.fn_MSgeneration_downloadonly ( c.generation, c.tablenick ) FROM #belong b LEFT OUTER JOIN dbo.MSmerge_contents c ON c.tablenick = b.tablenick AND c.rowguid = b.rowguid; แผนแบบสอบถามโดยประมาณมีข้อมูลเกี่ยวกับ 3 แบบสอบถาม แบบสอบถามข้างต้น การเรียกใช้ฟังก์ชันเพื่อ fn_MSgeneration_download เท่านั้น การเรียกใช้ฟังก์ชันเพื่อ fn_MSArticle_has_downloadonly_property แผนแบบสอบถามจริงรวมเฉพาะข้อมูลนี้: แบบสอบถามข้างต้น ไม่มีอะไรเกี่ยวกับฟังก์ชั่น เหตุใดข้อมูลฟังก์ชันจึงขาดหายไปในแผนจริง ฉันลองตัวเลือกเหล่านี้: SET STATISTICS PROFILE ON SET STATISTICS XML …

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