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

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

2
วนซ้ำ CTE เพื่อหาผลรวมสำหรับเด็กทุกคน
นี่คือต้นไม้ประกอบที่ฉันต้องการค้นหาโดยใช้T-SQLแบบสอบถามซ้ำ(สมมุติCTE) ด้วยผลลัพธ์ที่คาดหวังด้านล่าง ฉันต้องการที่จะรู้จำนวนรวมต่อการชุมนุมที่ได้รับส่วนใดส่วนหนึ่ง หมายความว่าถ้าฉันค้นหา 'หมุดย้ำ' ฉันต้องการทราบจำนวนรวมในแต่ละระดับภายในการชุมนุมไม่ใช่เฉพาะจำนวนลูกโดยตรง Assembly (id:1) | |-Rivet |-Rivet |-SubAssembly (id:2) | | | |-Rivet | |-Bolt | |-Bolt | |-SubSubAssembly (id:3) | | | |-Rivet | |-Rivet | |-SubAssembly (id:4) |-Rivet |-Bolt DESIRED Results ------- ID, Count 1 , 6 2 , 3 3 , 2 4 …

1
ทำไมการเพิ่มคอลัมน์ NOT NULL ด้วยข้อ จำกัด เริ่มต้นทันที?
CREATE TABLE TestTab (ID INT IDENTITY(1,1), st nvarchar(100)) INSERT INTO TestTab (st) values ('a') INSERT INTO TestTab (st) values ('b') INSERT INTO TestTab (st) values ('c') INSERT INTO TestTab (st) values ('d') INSERT INTO TestTab (st) values ('e') INSERT INTO TestTab (st) SELECT TOP 10000 st from testtab GO 30 …

3
ผลกระทบของดัชนีในคำสั่งการอัพเดทที่คอลัมน์อัพเดตไม่ได้อยู่ในดัชนี
ฉันตลอดเวลาเห็นคนบอกว่าดัชนีชะลอตัวลงupdate, และdelete insertสิ่งนี้ถูกใช้เป็นคำสั่งแบบครอบคลุมราวกับว่ามันเป็นค่าสัมบูรณ์ ในขณะที่ปรับฐานข้อมูลของฉันเพื่อปรับปรุงประสิทธิภาพฉันยังคงเจอกับสถานการณ์นี้ที่ขัดแย้งกับกฎอย่างมีเหตุผลสำหรับฉันและไม่มีที่ไหนที่ฉันสามารถหาใครพูดหรืออธิบายในทางใดทางหนึ่ง ใน SQL Server และฉันเชื่อ / เข้าใจ DBMS อื่น ๆ ส่วนใหญ่ดัชนีของคุณจะถูกสร้างขึ้นตามคอลัมน์เฉพาะที่คุณระบุ ส่วนแทรกและการลบจะมีผลกับทั้งแถวเสมอดังนั้นจึงไม่มีวิธีที่จะไม่ส่งผลกระทบต่อดัชนี แต่การปรับปรุงดูเหมือนจะมีความเป็นเอกลักษณ์มากกว่านี้เล็กน้อย หากฉันมีคอลัมน์ที่ไม่รวมอยู่ในดัชนีใด ๆ และฉันอัปเดตพวกเขาจะชะลอตัวลงเพียงเพราะฉันมีดัชนีในคอลัมน์อื่น ๆ ในตารางนั้นหรือไม่ ตัวอย่างเช่นพูดในUserตารางของฉันฉันมีหนึ่งหรือสองดัชนีคีย์หลักซึ่งเป็นคอลัมน์ Identity / Auto เพิ่มคอลัมน์และอาจอื่นในคอลัมน์บางคีย์ต่างประเทศ หากฉันอัปเดตคอลัมน์ที่ไม่มีดัชนีโดยตรงเช่นพูดว่าหมายเลขโทรศัพท์หรือที่อยู่การอัปเดตนี้จะช้าลงเพราะฉันมีดัชนีในตารางนี้ในคอลัมน์อื่น ๆ ในสถานการณ์ใดสถานการณ์หนึ่งหรือไม่ คอลัมน์ที่ฉันกำลังอัปเดตไม่ได้อยู่ในดัชนีดังนั้นเหตุผลที่ควรอัปเดตดัชนีไม่ควรใช่ไหม ถ้ามีอะไรฉันคิดว่ามันจะถูกเร่งถ้าฉันใช้ดัชนีในส่วนคำสั่ง WHERE

3
ทำไม SQL Server จะไม่สนใจดัชนี
ผมมีตารางCustPassMasterที่มี 16 คอลัมน์ในนั้นซึ่งเป็นหนึ่งและฉันสร้างดัชนีCustNum varchar(8) IX_dbo_CustPassMaster_CustNumเมื่อฉันเรียกใช้SELECTคำสั่งของฉัน: SELECT * FROM dbo.CustPassMaster WHERE CustNum = '12345678' จะละเว้นดัชนีอย่างสมบูรณ์ สับสนนี้ฉันเป็นฉันมีตารางอีกCustDataMasterด้วยวิธีการคอลัมน์อื่น ๆ (55) CustNum varchar(8)ซึ่งหนึ่งในนั้นคือ ฉันสร้างดัชนีในคอลัมน์นี้ ( IX_dbo_CustDataMaster_CustNum) ในตารางนี้และใช้แบบสอบถามเดียวกันจริง: SELECT * FROM dbo.CustDataMaster WHERE CustNum = '12345678' และใช้ดัชนีที่ฉันสร้างขึ้น มีเหตุผลเฉพาะที่อยู่เบื้องหลังสิ่งนี้หรือไม่? ทำไมมันจะใช้ดัชนีจากCustDataMasterแต่ไม่จากCustPassMaster? มันเป็นเพราะการนับคอลัมน์ต่ำ? แบบสอบถามแรกส่งคืน 66 แถว สำหรับแถวที่สองจะส่งคืน 1 แถว นอกจากนี้หมายเหตุเพิ่มเติม: CustPassMasterมี 4991 บันทึกและCustDataMasterมี 5376 บันทึก นี่อาจเป็นเหตุผลที่ละเลยดัชนีหรือไม่ CustPassMasterยังมีระเบียนที่ซ้ำกันซึ่งมีCustNumค่าเหมือนกันเช่นกัน นี่เป็นปัจจัยอื่นหรือไม่ …

3
การป้องกันภัยพิบัติของฐานข้อมูล [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ฐานข้อมูลของฉันใหญ่กว่า 250GB ฉันสำรองข้อมูลตามกำหนดเวลาด้วยเครื่องมือของบุคคลที่สาม การสำรองฐานข้อมูลตามกำหนดเวลาเป็นวิธีที่ดีที่สุดในการปกป้องฐานข้อมูล SQL Server จากความเสียหายหรือไม่ หรือคุณจะแนะนำอย่างอื่นได้ไหม

1
วางดัชนีที่ไม่ได้ใช้ - ประเมินอันตรายที่ไม่คาดคิด
เรามีฐานข้อมูลขนาดใหญ่มากที่มีดัชนีที่ไม่ได้ใช้หลายร้อยตามสถิติ DMV ซึ่งได้รับการสะสมตั้งแต่เซิร์ฟเวอร์รีบูตครั้งล่าสุดในเดือนกรกฎาคม หนึ่งใน DBA ของเราทำข้อความเตือนต่อไปนี้ซึ่งไม่สมเหตุสมผลสำหรับฉัน: ก่อนที่เราจะวางดัชนีเราจำเป็นต้องตรวจสอบให้แน่ใจว่ามันไม่ได้บังคับใช้ข้อ จำกัด ที่ไม่ซ้ำกันเนื่องจากเครื่องมือเพิ่มประสิทธิภาพการสืบค้นอาจต้องมีดัชนีนี้อยู่ เมื่อใดก็ตามที่มีการสร้างดัชนีสถิติที่เกี่ยวข้องกับดัชนีนั้นจะถูกสร้างขึ้นใน SQL Server ด้วย แบบสอบถามอาจไม่ได้ใช้ดัชนี แต่อาจใช้สถิติของแบบสอบถาม ดังนั้นเราอาจพบสถานการณ์หลังจากวางดัชนีประสิทธิภาพการสืบค้นเฉพาะจะแย่มาก SQL Server ไม่เก็บสถิติการใช้งานของสถิติ แม้ว่าเราจะเปิดใช้งานคุณลักษณะ "สร้างสถิติอัตโนมัติ" ในฐานข้อมูลของเรา แต่ฉันไม่ทราบว่าจะต้องทำตามพารามิเตอร์ทั้งหมดภายในใดก่อนที่เครื่องมือเพิ่มประสิทธิภาพการสืบค้นจะสร้างสถิติที่ขาดหายไป เกี่ยวกับ # 1 ฉันคิดว่า SQL Server จะทำการค้นหาดัชนีเพื่อตรวจสอบความเป็นเอกลักษณ์ก่อนที่จะทำการแทรก / อัพเดทดังนั้นดัชนีจะไม่แสดงว่าไม่ได้ใช้งาน เกี่ยวกับข้อที่ 2 เป็นไปได้จริงหรือ โดยวิธีเมื่อฉันบอกว่าดัชนีไม่ได้ใช้ฉันหมายถึงไม่มีการค้นหาและไม่มีการสแกน
16 sql-server  index 

1
การเรียกใช้แพคเกจ SSIS จากงาน SQL Agent ที่เป็นเจ้าของโดยผู้ใช้โดเมนที่ไม่ใช่ sysadmin
ฉันมีแพคเกจ SSIS สองชุดที่เรียกใช้งานข้ามคืน (ผ่านทางตัวแทนของเซิร์ฟเวอร์ SQL) ซึ่งเป็นส่วนหนึ่งของการปรับใช้ SSIS ที่ใหญ่กว่าโดยไม่มีปัญหาใด ๆ ทุกอย่างใช้การรับรองความถูกต้องของ Windows และงานที่กำหนดเวลาเป็น sysadmin (ดีฉัน) และทำงานเป็นบัญชีบริการตัวแทนของเซิร์ฟเวอร์ SQL ดังนั้นข้อมูลจึงsource system ~> transit db ~> staging ~> NDSค้างคืน SSIS สองแพ็คเกจที่ฉันสนใจจัดการtransit db ~> stagingและstaging ~> NDSส่วนต่าง ๆ ตามลำดับสำหรับชุดข้อมูลเฉพาะ ผู้ใช้โดเมน (ไม่ใช่ผู้ดูแลระบบ) ทำอะไรในsource systemและผลักดันข้อมูลที่น่าสนใจเข้ามาtransit dbดังนั้นฉันต้องการวิธีที่จะดึงข้อมูลที่อัปเดตนี้ในระหว่างชั่วโมงทำงานเพื่ออัปเดตNDS: มีการตัดสินใจว่าวิธีที่ง่ายที่สุดสำหรับบุคคลนี้ในการเรียก ETL นั้นโดยคลิกปุ่มในสมุดงาน Excel ที่เปิดใช้งานแมโครซึ่งเชื่อมต่อกับ SQL Server ผ่าน ODBC (โดยใช้การพิสูจน์ตัวจริงของ Windows) …

6
กำหนดวันศุกร์ที่ 3 ของทุกเดือน
ฉันต้องกำหนดวันที่ซึ่งเป็น "วันศุกร์ที่ 3 ของแต่ละเดือน" สำหรับช่วงวันที่ "1.1.1996 - 30.8.2014" ใน SQL Server ฉันคาดหวังว่าฉันควรใช้การรวมกันของDENSE_RANK()และPARTITION BY()เพื่อตั้ง "อันดับ = 3" อย่างไรก็ตามฉันใหม่กับ SQL และไม่สามารถค้นหารหัสที่ถูกต้องได้

4
อ้างสิทธิ์พื้นที่ดิสก์หลังจากลบเขตข้อมูลตาราง
ฉันใช้ sql 2008 r2 และ db นั้นทำงานได้ดีและรวดเร็วในช่วง 3 ปีที่ผ่านมาจนถึงประมาณ 3 เดือนที่ผ่านมาเราได้เพิ่มเขตข้อมูล ntext ในตารางที่ใช้งานและใช้งานมาก ตอนนี้เรากำลังเริ่มที่จะออกจากพื้นที่เซิร์ฟเวอร์เนื่องจากขนาดที่ใหญ่ขึ้นของตารางนี้ ฉันอ่านว่าการลดขนาดเราไม่ต้องการทำให้ดัชนีของฐานข้อมูลหลวมเพราะมันทำงานได้อย่างรวดเร็วเป็นเวลาหลายปีและเราไม่ต้องการที่จะได้รับการกระจายตัวของข้อมูล เราตัดสินใจลบฟิลด์นั้นและค่าทั้งหมด: มีวิธีลบฟิลด์ ntext และค่าทั้งหมดและพื้นที่ปล่อยโดยไม่ต้องลบการทำดัชนีโดยไม่ลดขนาดโดยไม่ลดขนาดประสิทธิภาพ db หรือไม่ ฉันกำลังแนบเอาต์พุตคิวรีขนาด db เพื่อแสดงการขยายขนาดของคุณใน 5 เดือนที่ผ่านมา

3
สร้างลำดับชั้นของหลายระดับโดยที่แต่ละโหนดมีจำนวนชายด์แบบสุ่ม
ฉันต้องการสร้างข้อมูลทดสอบที่เกี่ยวข้องกับลำดับชั้น ฉันสามารถทำให้ง่ายและทำสองสามCROSS JOINวินาที แต่นั่นจะให้โครงสร้างที่เหมือนกันโดยสมบูรณ์ / ไม่มีการเปลี่ยนแปลงใด ๆ นั่นไม่เพียง แต่ดูน่าเบื่อ แต่การขาดความผันแปรในข้อมูลการทดสอบบางครั้งก็เป็นตัวกำหนดปัญหาที่อาจพบได้ ดังนั้นฉันต้องการสร้างลำดับชั้นที่ไม่เหมือนกันซึ่งปฏิบัติตามกฎเหล่านี้: ลึก 3 ระดับ ระดับ 1 คือการสุ่ม 5 - 20 โหนด ระดับ 2 คือ 1 - 10 โหนดสุ่มต่อโหนดระดับ 1 แต่ละโหนด ระดับ 3 คือ 1 - 5 โหนดสุ่มต่อโหนดระดับ 2 แต่ละโหนด ทุกสาขาจะลึก 3 ระดับ ความสม่ำเสมอในเชิงลึกก็โอเค ณ จุดนี้ อาจมีการทับซ้อนกันในชื่อของโหนดลูกในระดับที่กำหนดใด ๆ (เช่นชื่อของโหนดลูกไม่จำเป็นต้องไม่ซ้ำกันในทุกโหนดในระดับเดียวกัน) คำว่า "สุ่ม" …

3
อัปเดตช้าในตารางขนาดใหญ่พร้อมแบบสอบถามย่อย
เมื่อSourceTableมีระเบียน> 15MM และBad_Phraseมีระเบียน> 3K แบบสอบถามต่อไปนี้จะใช้เวลาเกือบ 10 ชั่วโมงในการเรียกใช้บน SQL Server 2005 SP4 UPDATE [SourceTable] SET Bad_Count= ( SELECT COUNT(*) FROM Bad_Phrase WHERE [SourceTable].Name like '%'+Bad_Phrase.PHRASE+'%' ) ในภาษาอังกฤษคำนี้คือการนับจำนวนของวลีที่แตกต่างกันการระบุไว้ใน Bad_Phrase ที่มี substring ของสนามNameในแล้ววางผลว่าในสนามSourceTableBad_Count ฉันต้องการคำแนะนำเกี่ยวกับวิธีทำให้แบบสอบถามนี้ทำงานได้เร็วขึ้นอย่างมาก

9
ทางเลือกของประโยคที่ [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัพเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Exchange Administrators Stack Exchange ปิดให้บริการใน4 ปีที่แล้ว มีวิธีSELECTแถวเฉพาะกับข้อมูลบางอย่างในคอลัมน์โดยไม่ใช้WHEREหรือไม่? เช่นถ้าฉันมีสิ่งนี้: SELECT * FROM Users WHERE town = 'Townsville' มีวิธีการใช้WHEREประโยคในSELECTคำสั่งหรือไม่ สิ่งที่ต้องการ SELECT *, town('Townsville') FROM Users มันเป็นคำถามที่แปลกประหลาด แต่เป็นคำถามที่ฉันถูกถามจากคนรอบข้าง
16 sql-server 

6
วิธีการแก้ไขข้อผิดพลาด“ บัญชีที่ระบุมีอยู่แล้ว” ระหว่างการติดตั้ง SQL Server 2008 R2
ฉันเพิ่งมีปัญหาขณะติดตั้ง Visual Studio 2012 และ SQL Server 2008 R2 บนเครื่องพัฒนาใหม่ ลำดับการติดตั้งของฉันคือ Visual Studio 2012 จากนั้นติดตั้ง SQL Server 2008 R2 เกิดข้อผิดพลาดระหว่างการติดตั้ง SQL Server ตรงกลาง: บัญชีที่ระบุมีอยู่แล้ว ฉันใช้เวลาทั้งวันพยายามแก้ไขปัญหานี้

2
Latin1_General_BIN ส่งผลกระทบต่อประสิทธิภาพเมื่อเปลี่ยนการเปรียบเทียบค่าเริ่มต้นของฐานข้อมูล
ฉันได้ตั้งค่าการเปรียบเทียบฐานข้อมูลเป็นLatin1_General_BINเพื่อทำการเปรียบเทียบสตริงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ สิ่งนี้จะส่งผลกระทบต่อประสิทธิภาพหรือไม่ มันจะมีผลกระทบกับการดำเนินงาน DML หรือ DDL ในฐานข้อมูลหรือไม่ ฐานข้อมูลมีอยู่แล้วในตาราง

2
ทำไมการอ้างถึงตัวแปรในลูปที่ซ้อนกันของกำลังภาคบังคับ
ฉันเจอปัญหานี้เมื่อเร็ว ๆ นี้และไม่พบการสนทนาออนไลน์ แบบสอบถามด้านล่าง DECLARE @S VARCHAR(1) = ''; WITH T AS (SELECT name + @S AS name2, * FROM master..spt_values) SELECT * FROM T T1 INNER JOIN T T2 ON T1.name2 = T2.name2; รับแผนลูปซ้อนกันเสมอ การพยายามบังคับให้เกิดปัญหากับINNER HASH JOINหรือINNER MERGE JOINคำแนะนำจะทำให้เกิดข้อผิดพลาดดังต่อไปนี้ ตัวประมวลผลแบบสอบถามไม่สามารถสร้างแผนแบบสอบถามได้เนื่องจากคำแนะนำที่กำหนดไว้ในแบบสอบถามนี้ ส่งแบบสอบถามโดยไม่ระบุคำแนะนำใด ๆ และไม่ต้องใช้ SET FORCEPLAN ฉันพบวิธีแก้ปัญหาที่อนุญาตให้ใช้การรวมแฮชหรือการผสาน - การรวมตัวแปรในการรวม แผนที่สร้างขึ้นนั้นมีต้นทุนที่ต่ำกว่าอย่างมาก …

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