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

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

4
ฉันต้องการลดขนาดฐานข้อมูลของฉัน - ฉันเพิ่งปลดปล่อยพื้นที่มาก
คำถามนี้ถูกถามในรูปแบบต่าง ๆ ที่นี่ แต่คำถามก็ยังลงไปที่: ฉันรู้ว่าการลดขนาดฐานข้อมูลมีความเสี่ยง ในกรณีนี้ฉันได้ลบข้อมูลจำนวนมากและฉันจะไม่ใช้มันอีก ฉันจะลดขนาดฐานข้อมูลของฉันได้อย่างไร ฉันจะลดขนาดไฟล์อะไร สิ่งที่ฉันควรพิจารณาเมื่อทำสิ่งนี้คืออะไร? ฉันควรทำอะไรหลังจาก ถ้าเป็นฐานข้อมูลขนาดใหญ่ล่ะ ฉันสามารถหดมันทีละน้อยกว่าได้ไหม?

2
ความแตกต่างระหว่างชุดคำสั่ง SQL และ RPC หรือไม่
อะไรคือความแตกต่างระหว่างชุดคำสั่ง SQL, คำสั่ง T-SQL และการเรียกขั้นตอนระยะไกล? ฉันจะรู้ได้อย่างไรว่าส่วนหนึ่งของรหัส T-SQL เป็นชุดหรือคำสั่ง?
35 sql-server 

1
ลบ vs TRUNCATE
ฉันพยายามทำความเข้าใจกับความแตกต่างระหว่างคำสั่งDELETEและ TRUNCATEความเข้าใจของฉันเกี่ยวกับ internals ไปบางอย่างตาม: DELETE-> เครื่องมือฐานข้อมูลค้นหาและลบแถวออกจากหน้าข้อมูลที่เกี่ยวข้องและหน้าดัชนีทั้งหมดที่ป้อนแถวนั้น ดังนั้นยิ่งดัชนียิ่งใช้เวลาลบนานเท่าใด TRUNCATE -> เพียงแค่ลบหน้าข้อมูลของตารางทั้งหมดออกมาซึ่งจะเป็นตัวเลือกที่มีประสิทธิภาพมากขึ้นสำหรับการลบเนื้อหาของตาราง สมมติว่าข้างต้นถูกต้อง (โปรดแก้ไขให้ฉันถ้าไม่): โหมดการกู้คืนที่แตกต่างกันมีผลต่อแต่ละคำสั่งอย่างไร หากมีผลกระทบใด ๆ เลย เมื่อทำการลบดัชนีทั้งหมดจะถูกสแกนหรือเฉพาะดัชนีที่อยู่แถวนั้น? ฉันจะถือว่าดัชนีทั้งหมดถูกสแกน (และไม่ได้หา?) คำสั่งจำลองอย่างไร? คำสั่ง SQL ส่งและประมวลผลกับผู้สมัครสมาชิกแต่ละคนหรือไม่? หรือ MSSQL ฉลาดกว่านี้สักหน่อย

2
TOP (และทำไม) ส่งผลกระทบต่อแผนการดำเนินการอย่างไร
สำหรับข้อความค้นหาที่ซับซ้อนปานกลางที่ฉันพยายามปรับให้เหมาะสมฉันสังเกตว่าการลบTOP nคำสั่งเปลี่ยนแผนการดำเนินการ ฉันจะเดาว่าเมื่อเคียวรีมีเอ็นจินTOP nฐานข้อมูลจะรันเคียวรีโดยไม่สนใจTOPคำสั่งและจากนั้นในตอนท้ายก็ลดขนาดของผลลัพธ์ที่กำหนดไว้เป็นจำนวนแถวnที่ถูกร้องขอ แผนการดำเนินการกราฟิกดูเหมือนว่าจะระบุว่าเป็นกรณีนี้ - TOPเป็นขั้นตอน "สุดท้าย" แต่ดูเหมือนว่าจะเกิดขึ้นมากขึ้น คำถามของฉันคือประโยค TOP และ N มีผลอย่างไรต่อแผนการดำเนินการของแบบสอบถาม นี่เป็นเวอร์ชั่นที่เรียบง่ายของสิ่งที่เกิดขึ้นในกรณีของฉัน: แบบสอบถามกำลังจับคู่แถวจากสองตาราง A และ B โดยไม่ต้องTOPเป็นไปตามข้อเพิ่มประสิทธิภาพประเมินจะมี 19k แถวจากตารางและ 46K แถวจากตาราง B. จำนวนที่เกิดขึ้นจริงของแถวกลับเป็น 16k สำหรับ A และ 13k สำหรับการแข่งขันบีกัญชาจะใช้ในการเข้าร่วมทั้งสองชุดผลลัพธ์ รวม 69 แถว (จากนั้นจะใช้การเรียงลำดับ) แบบสอบถามนี้เกิดขึ้นอย่างรวดเร็วมาก เมื่อฉันเพิ่มTOP 1001เครื่องมือเพิ่มประสิทธิภาพไม่ได้ใช้แฮชจับคู่; แต่ก่อนจะเรียงลำดับผลลัพธ์จากตาราง A (ประมาณเดียวกัน / เป็นจริงของ 19k / 16k) และทำการวนซ้ำซ้อนกับตาราง B จำนวนแถวของตาราง …

2
ตรวจสอบการมีอยู่ของ EXISTS ดีกว่า COUNT! …ไม่
ฉันได้อ่านบ่อยเมื่อมีการตรวจสอบการดำรงอยู่ของแถวควรเสมอทำได้ด้วย EXISTS แทนกับการนับ แต่ในหลายสถานการณ์ที่ผ่านมาฉันได้วัดการปรับปรุงประสิทธิภาพเมื่อใช้การนับ รูปแบบเป็นไปดังนี้: LEFT JOIN ( SELECT someID , COUNT(*) FROM someTable GROUP BY someID ) AS Alias ON ( Alias.someID = mainTable.ID ) ฉันไม่คุ้นเคยกับวิธีการที่จะบอกว่าเกิดอะไรขึ้น "ภายใน" SQL Server ดังนั้นฉันจึงสงสัยว่ามีข้อผิดพลาดที่ไม่มีผู้แปลที่มี EXISTS ที่ให้ความรู้สึกที่สมบูรณ์แบบกับการวัดที่ฉันทำ คุณมีคำอธิบายเกี่ยวกับปรากฏการณ์นั้นบ้างไหม? แก้ไข: นี่คือสคริปต์เต็มรูปแบบที่คุณสามารถเรียกใช้: SET NOCOUNT ON SET STATISTICS IO OFF DECLARE @tmp1 TABLE ( ID INT UNIQUE …

4
ลำดับของคอลัมน์ในคำจำกัดความของตารางมีความสำคัญหรือไม่
เมื่อกำหนดตารางการเรียงลำดับคอลัมน์ในกลุ่มเชิงตรรกะและกลุ่มจะเป็นประโยชน์ การเรียงลำดับแบบลอจิคัลของคอลัมน์ในตารางบ่งบอกถึงความหมายของผู้พัฒนาและเป็นองค์ประกอบของสไตล์ที่ดี นั่นชัดเจน อย่างไรก็ตามสิ่งที่ไม่ชัดเจนคือว่าการเรียงลำดับเชิงตรรกะของคอลัมน์ในตารางมีผลกระทบต่อการจัดเรียงทางกายภาพที่ชั้นการจัดเก็บหรือไม่หรือมีผลกระทบอื่น ๆ ที่อาจสนใจ นอกเหนือจากผลกระทบต่อสไตล์การเรียงลำดับของคอลัมน์มีความสำคัญหรือไม่ มีคำถามเกี่ยวกับ Stack Overflowเกี่ยวกับเรื่องนี้ แต่ไม่มีคำตอบที่เชื่อถือได้

1
ฉันควรใช้ดัชนีฟิลด์เดียวหลายดัชนีแทนที่จะเป็นดัชนีหลายคอลัมน์ที่เฉพาะเจาะจงหรือไม่
คำถามนี้เกี่ยวกับประสิทธิผลของเทคนิคการทำดัชนี SQL Server ฉันคิดว่าเป็นที่รู้จักกันในชื่อ "จุดตัดดัชนี" ฉันกำลังทำงานกับแอปพลิเคชัน SQL Server (2008) ที่มีอยู่ซึ่งมีปัญหาเรื่องประสิทธิภาพและความเสถียรหลายประการ นักพัฒนาทำสิ่งแปลก ๆ ด้วยการจัดทำดัชนี ฉันไม่สามารถรับข้อสรุปมาตรฐานเกี่ยวกับปัญหาเหล่านี้ได้ฉันไม่สามารถหาเอกสารที่ดีเกี่ยวกับ internets ได้ มีคอลัมน์ที่ค้นหาได้จำนวนมากในตาราง นักพัฒนาสร้างดัชนีคอลัมน์เดียวในแต่ละคอลัมน์ที่ค้นหาได้ ทฤษฎีคือ SQL Server จะสามารถรวม (ตัดกัน) แต่ละดัชนีเหล่านี้เพื่อเข้าถึงตารางอย่างมีประสิทธิภาพในสถานการณ์ส่วนใหญ่ นี่คือตัวอย่างที่ง่าย (ตารางจริงมีเขตข้อมูลเพิ่มเติม): CREATE TABLE [dbo].[FatTable]( [id] [bigint] IDENTITY(1,1) NOT NULL, [col1] [nchar](12) NOT NULL, [col2] [int] NOT NULL, [col3] [varchar](2000) NOT NULL, ... CREATE NONCLUSTERED INDEX …

1
GO หลังจากทุกคำสั่ง T-SQL
เหตุผลเบื้องหลังการใช้คำสั่ง GO หลังจากทุกคำสั่ง SQL คืออะไร ฉันเข้าใจว่า GO ส่งสัญญาณการสิ้นสุดของแบทช์และ / หรืออนุญาตให้มีชื่อเสียงของข้อความ แต่สิ่งที่มันมีประโยชน์ใช้หลังจากทุกคำสั่ง ฉันแค่อยากรู้อยากเห็นเป็นเอกสาร Microsoft จำนวนมาก ฯลฯ ได้เริ่มใช้มันหลังจากทุกคำสั่งหรือบางทีฉันเพิ่งเริ่มสังเกตเห็น นอกจากนี้สิ่งที่ถือว่าเป็นแนวปฏิบัติที่ดีที่สุด

1
ฉันจะอ่านค่าคิวรีได้อย่างไรและเป็นเปอร์เซ็นต์เสมอหรือไม่
ขณะนี้ฉันกำลังศึกษาเกี่ยวกับ SQL 70-433 (การสอบ Microsoft Certification) และฉันสับสนมากเกี่ยวกับการวัดประสิทธิภาพ "ค่าใช้จ่ายแบบสอบถาม" จากเอกสารใด ๆ ที่ฉันสามารถหาได้ผ่าน Google ค่าใช้จ่ายในการสืบค้นคือตัวเลขที่เป็นเปอร์เซ็นต์และแสดงถึงเปอร์เซ็นต์ของแบทช์ทั้งหมดที่ดำเนินการโดยส่วนใดส่วนหนึ่งของมัน สิ่งนี้ดูเหมือนจะแปลกเล็กน้อยสำหรับฉันเนื่องจากฉันสนใจในข้อดีของการสืบค้นแบบเฉพาะเจาะจงมากกว่าการทำแบบนั้นเทียบกับการสืบค้นอื่น ๆ ที่ปรากฏขึ้นข้างๆมัน แต่แล้วฉันก็คิดว่าบางทีสิ่งที่คุณคาดหวังว่าจะทำคือวางข้อความค้นหาสองแบบเคียงข้างกันเรียกใช้พวกเขาเป็น "ชุด" และจากนั้นแล้วแต่จำนวนใดที่มีค่าใช้จ่ายน้อยกว่า 50% จะเป็นผู้ชนะ แต่การอภิปรายเรื่องค่าใช้จ่ายในการสืบค้นในบทที่ 6 บทเรียนหนึ่งของชุดฝึกอบรม SQL 70-433 ของ Microsoft ดูเหมือนจะไม่เกี่ยวข้องกับเรื่องนี้ นี่คือตัวอย่าง: พวกเขาแสดงแบบสอบถามที่ประกอบด้วยแบบสอบถามย่อยย่อยที่สัมพันธ์กันสองรายการแล้วปรับปรุงด้วยแบบสอบถามโดยแทนที่แบบสอบถามย่อยด้วย OUTER APPLY ผลลัพธ์: "แบบสอบถามนี้มีค่าใช้จ่ายประมาณ 76 ในขณะที่ค่าใช้จ่ายของแบบสอบถามแรกนั้นเพิ่มขึ้นเป็นสองเท่าโดยประมาณ 151 รายการ" พวกเขาปรับปรุงแบบสอบถามให้ดียิ่งขึ้นและลดต้นทุนจาก 76 เป็น 3.6 พวกเขาไม่ได้หมายความว่าตัวเลขเหล่านี้เป็นเปอร์เซ็นต์ในขณะที่พวกเขาบอกเป็นนัย ๆ ว่าเป็นตัวเลขสัมบูรณ์ซึ่งเกี่ยวข้องกับแบบสอบถามเป็นวัตถุแบบสแตนด์อโลนโดยไม่มีการอ้างอิงกับแบบสอบถามอื่นใด ๆ และต่อไปคำถามแรกอาจมีราคา 151% ได้อย่างไร …
34 sql-server  ssms 

4
NOLOCK เลวเสมอหรือไม่
ฉันเป็นผู้พัฒนารายงานที่ต้องการทำให้ข้อความค้นหาของฉันมีประสิทธิภาพมากที่สุด ฉันเคยทำงานกับ DBA ที่บอกฉัน - ฉันเชื่อว่าเพราะฉันมักจะจัดการกับรายงานในเซิร์ฟเวอร์การผลิต - เพื่อใช้NOLOCKในทุกแบบสอบถาม ตอนนี้ฉันทำงานกับ DBA ที่ถูกแบนไม่NOLOCKว่ากรณีใด ๆ - แม้ว่ารายงานของฉัน (เนื่องจากการขาดดัชนีจำนวนมากในตารางสองสามตาราง) กำลังหยุดการจำลองแบบและการอัปเดตระบบ ในความคิดของฉันในกรณีนี้NOLOCKจะเป็นสิ่งที่ดี เนื่องจากการฝึกอบรม SQL ส่วนใหญ่ของฉันมาพร้อมกับ DBA ที่หลากหลายและมีความคิดเห็นที่แตกต่างกันมากฉันจึงอยากถามเรื่องนี้กับ DBA ที่หลากหลาย

2
ดัชนีไม่ทำให้การดำเนินการเร็วขึ้นและในบางกรณีทำให้การสืบค้นช้าลง ทำไมถึงเป็นเช่นนั้น?
ฉันกำลังทดลองกับดัชนีเพื่อเร่งความเร็วของสิ่งต่าง ๆ แต่ในกรณีของการเข้าร่วมดัชนีจะไม่ปรับปรุงเวลาดำเนินการแบบสอบถามและในบางกรณีจะทำให้สิ่งต่าง ๆ ช้าลง แบบสอบถามเพื่อสร้างตารางทดสอบและกรอกข้อมูลคือ: CREATE TABLE [dbo].[IndexTestTable]( [id] [int] IDENTITY(1,1) PRIMARY KEY, [Name] [nvarchar](20) NULL, [val1] [bigint] NULL, [val2] [bigint] NULL) DECLARE @counter INT; SET @counter = 1; WHILE @counter < 500000 BEGIN INSERT INTO IndexTestTable ( -- id -- this column value is auto-generated NAME, val1, val2 …
34 sql-server  index 

3
วิ่งรวมกับการนับ?
ตามชื่อเรื่องแนะนำว่าฉันต้องการความช่วยเหลือในการหาผลรวมสะสมใน T-SQL ปัญหาคือผลรวมที่ฉันต้องทำคือผลรวมของการนับ: sum(count (distinct (customers))) พูดถ้าฉันวิ่งนับคนเดียวผลลัพธ์จะเป็น: Day | CountCustomers ---------------------- 5/1 | 1 5/2 | 0 5/3 | 5 ฉันต้องการผลลัพธ์ที่มีผลรวมเป็น: Day | RunningTotalCustomers ---------------------- 5/1 | 1 5/2 | 1 5/3 | 6 ฉันใช้ผลรวมทั้งหมดก่อนใช้coalesceวิธีการ แต่ไม่นับด้วย ฉันไม่แน่ใจว่าจะทำอย่างไรตอนนี้ที่ฉันมีการนับ
34 sql-server  t-sql 

5
วิธีจัดการ TimeZone อย่างถูกต้องใน SQL Server
เซิร์ฟเวอร์การพัฒนาในพื้นที่ของฉันอยู่ในตะวันออกกลาง แต่เซิร์ฟเวอร์ที่ใช้งานจริงของฉันอยู่ในสหราชอาณาจักร ฉันต้องการแสดงวันที่ถึงผู้ใช้ในเขตเวลาของพวกเขา ตัวอย่างเช่นหากผู้ใช้อยู่ในซาอุดิอาระเบียแล้วฉันต้องแสดงเวลาตามรูปแบบซาอุดิอาระเบีย ฉันควรสร้างตารางฐานข้อมูลใหม่ที่ชื่อว่า TimeZone และบันทึกเวลาใน UTC หรือไม่

1
SLEEP_TASK Wait Type ใน SQL Server - มันระบุอะไร?
ฉันไม่เคยเห็นSLEEP_TASKประเภทรอมาก่อนและวันนี้ฉันดูเหมือนจะได้รับพวกเขามากมาย ฉันไม่ใช่ DBA ที่เป็นทางการเพียงแค่นักพัฒนา SQL Server ที่รู้เรื่อง DBA เราอัปเกรดเซิร์ฟเวอร์ของเราเมื่อสัปดาห์ที่แล้วเป็น10.52.2500.0- R2SP1 ฉันคิดว่า ข้อมูลทั้งหมดที่ฉันสามารถค้นหาออนไลน์ระบุว่าSLEEP_TASKเซิร์ฟเวอร์กำลังรอกระบวนการภายในบางประเภทให้เสร็จสมบูรณ์ ฉันไม่มีการบล็อกหรือกระบวนการพื้นหลังใด ๆ เช่นจุดตรวจหรือการล้างข้อมูลผีทำงานดังนั้นฉันจึงนิ่งงันเล็กน้อย มีใครเคยเห็นรูปแบบการรอนี้มาก่อนและถ้าเป็นเช่นนั้นคุณสามารถบอกฉันได้ว่าอะไรเป็นสาเหตุ

2
การปรับแผนให้เหมาะสมด้วยตัวอ่าน XML
ดำเนินการค้นหาจากที่นี่เพื่อดึงเหตุการณ์ deadlock ออกจากเซสชันเพิ่มเติมของเหตุการณ์ที่ขยายเริ่มต้น SELECT CAST ( REPLACE ( REPLACE ( XEventData.XEvent.value ('(data/value)[1]', 'varchar(max)'), '<victim-list>', '<deadlock><victim-list>'), '<process-list>', '</victim-list><process-list>') AS XML) AS DeadlockGraph FROM (SELECT CAST (target_data AS XML) AS TargetData FROM sys.dm_xe_session_targets st JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address WHERE [name] = 'system_health') AS Data CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS …

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