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

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

2
SQL Server ส่งคืน“ ข้อผิดพลาดทางคณิตศาสตร์มากเกินไปในการแปลงนิพจน์เป็นชนิดข้อมูล int”
เมื่อฉันเรียกใช้คำสั่งนี้ด้วย SUM() SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total] FROM dbo.t1 AS t WHERE t.Id > 0 AND t.Id < 101; ฉันได้รับ, Arithmetic overflow error converting expression to data type int. ความคิดเกี่ยวกับสาเหตุของมันคืออะไร? ฉันแค่ทำตามคำแนะนำในคำตอบนี้

4
ทางเลือกชุดเครื่องมือ SSMS [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับผู้ดูแลฐานข้อมูล Exchange Exchange ปิดให้บริการใน5 ปีที่ผ่านมา มีเครื่องมือใดบ้างเทียบได้กับSSMS Tools Pack 2012หรือไม่ การออกใบอนุญาต ($ 30 ต่อเครื่อง, $ 100 สำหรับเครื่องจำนวนเท่าใดก็ได้ ... เป็นเวลา 3 เดือน) เป็นที่ต้องการอย่างมากและฉันก็ไม่แน่ใจว่ามีตัวเลือกอื่นใดบ้าง ตัวอย่างเช่นสิ่งหนึ่งที่ฉันคิดถึงคือ "บันทึกทุกแบบสอบถามที่คุณเรียกใช้" เมื่อทำการซ่อมแซมและทำการค้นคว้าข้อมูลมันมีค่ามากที่จะมีการสำรองข้อมูลการสืบค้นของรุ่นที่แตกต่างกันของแบบสอบถามที่ฉันเรียกใช้ หรือเมื่อฉันรู้ว่าฉันไม่มีการสำรองข้อมูลของแบบสอบถามที่ฉันกำลังทำงานใน 2 เดือนที่ผ่านมา ชี้แจง: สตูดิโอการจัดการเซิร์ฟเวอร์ SQL ไม่มีการสนับสนุนเพิ่มเติมอย่างเป็นทางการ แต่มีเครื่องมือบางอย่างที่นั่น SSMS Tools Pack เป็นชุดที่ฉันชอบมาก (รุ่น 2005, 2008) แต่ค่าลิขสิทธิ์สำหรับปี 2012 นั้นแย่มาก (ฉันจะจ่ายค่าลิขสิทธิ์ที่สมเหตุสมผล แต่นั่นไม่ใช่คำถามที่นี่) ฉันได้พบSSMS Boost …

1
SQL Server จะเตือนเกี่ยวกับการให้สิทธิ์หน่วยความจำมากเกินไปเมื่อใด
เงื่อนไขใดบ้างที่ทำให้เกิดคำเตือนแผนการดำเนินการ"ให้เงินทุนมากเกินไป" ? หน่วยความจำแบบสอบถามให้ตรวจพบ "ExcessiveGrant" ซึ่งอาจส่งผลกระทบต่อความน่าเชื่อถือ ขนาดการให้สิทธิ์: เริ่มต้น 5128 KB, สุดท้าย 5128 KB, ใช้แล้ว 16 KB SSMS แผนสำรวจ Showplan xml <Warnings> <MemoryGrantWarning GrantWarningKind="Excessive Grant" RequestedMemory="5128" GrantedMemory="5128" MaxUsedMemory="16" /> </Warnings>

1
INSERT แบบแถวเดียว…เลือกช้ากว่าการเลือกแบบแยก
รับตารางฮีปต่อไปนี้ด้วย 400 แถวหมายเลขตั้งแต่ 1 ถึง 400: DROP TABLE IF EXISTS dbo.N; GO SELECT SV.number INTO dbo.N FROM master.dbo.spt_values AS SV WHERE SV.[type] = N'P' AND SV.number BETWEEN 1 AND 400; และการตั้งค่าต่อไปนี้: SET NOCOUNT ON; SET STATISTICS IO, TIME OFF; SET STATISTICS XML OFF; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; ต่อไปนี้SELECTเสร็จสมบูรณ์คำสั่งในรอบ6 …

1
วิธีล้างข้อมูลเร็วที่สุดคืออะไร
สถานการณ์: เรามีสองตารางTbl1& Tbl2บนเซิร์ฟเวอร์สมาชิก Tbl1จะถูกจำลองแบบจากสำนักพิมพ์Server Aและมันมีสองทริกเกอร์ - แทรกและการปรับปรุง Tbl2ทริกเกอร์แทรกและปรับปรุงข้อมูลลงใน ตอนนี้เราต้องกำจัด (ประมาณ 900 ล้านบันทึก) จากTbl2ที่มีทั้งหมด 1,000+ ล้านบันทึก ด้านล่างคือการกระจายข้อมูลสำหรับหนึ่งเดือนถึงหนึ่งนาที หนึ่งเดือน - 14986826 แถว หนึ่งวัน - 483446 แถว หนึ่งชั่วโมง - 20143 แถว หนึ่งนาที - 335 แถว สิ่งที่ฉันกำลังมองหา วิธีที่เร็วที่สุดในการล้างข้อมูลนั้นโดยไม่มีปัญหาการผลิตความสอดคล้องของข้อมูลและอาจไม่มีการหยุดทำงาน ดังนั้นฉันคิดว่าจะทำตามขั้นตอนด้านล่าง แต่ติดอยู่ :( ขั้นตอน: BCP จากข้อมูลที่ต้องการจากตาราง Tbl2 ที่มีอยู่ (ประมาณ 100 ล้านบันทึกอาจใช้เวลาประมาณ 30 นาที) สมมติว่าฉันเริ่มทำกิจกรรมในวันที่ 1Fab2018 10:00 …

1
เหตุใดตารางที่ได้รับนี้จึงปรับปรุงประสิทธิภาพ
ฉันมีแบบสอบถามซึ่งใช้สตริง json เป็นพารามิเตอร์ json เป็นอาร์เรย์ของคู่ละติจูดและลองจิจูด ตัวอย่างอินพุตอาจเป็นดังต่อไปนี้ declare @json nvarchar(max)= N'[[40.7592024,-73.9771259],[40.7126492,-74.0120867] ,[41.8662374,-87.6908788],[37.784873,-122.4056546]]'; มันเรียก TVF ที่คำนวณจำนวนจุดที่น่าสนใจรอบ ๆ จุดทางภูมิศาสตร์ที่ระยะ 1,3,5,10 ไมล์ create or alter function [dbo].[fn_poi_in_dist](@geo geography) returns table with schemabinding as return select count_1 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 1,1,0e)) ,count_3 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 3,1,0e)) ,count_5 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e …

6
ALTER INDEX ALL REBUILD ใช้พื้นที่บันทึกธุรกรรมมากขึ้นด้วยรูปแบบการกู้คืนข้อมูลที่ง่ายกว่าการสร้างดัชนีแต่ละรายการใหม่หรือไม่
การดำเนินการ "ALTER INDEX ALL REBUILD" ใน SQL Server 2012 ล้มเหลวเนื่องจากบันทึกธุรกรรมหมดพื้นที่ ดัชนีไม่เคยถูกจัดระเบียบใหม่หรือสร้างใหม่ดังนั้นการกระจายตัวจึงมากกว่า 80% สำหรับเกือบทั้งหมด DB ใช้รูปแบบการกู้คืนอย่างง่าย ฉันสันนิษฐานว่าต่อไปนี้การดำเนินการแต่ละดัชนีดำเนินการโดยรูปแบบ "ALL" ของคำสั่งข้อมูลบันทึกธุรกรรมจะถูกล้างออกก่อนที่จะสร้างดัชนีครั้งต่อไป นั่นเป็นวิธีการใช้งานจริงหรือดัชนีสร้างใหม่ราวกับว่าพวกเขาเป็นส่วนหนึ่งของการทำธุรกรรมเดียว? กล่าวอีกนัยหนึ่งฉันสามารถลดการเติบโตของบันทึกธุรกรรมโดยการเขียนสคริปต์เพื่อดำเนินการสร้างใหม่ทีละรายการหรือไม่ มีปัจจัยอื่น ๆ ที่ต้องพิจารณาอีกหรือไม่?
18 sql-server  index 

2
คำถามเกี่ยวกับประสิทธิภาพของ "SELECT TOP"
ฉันมีข้อความค้นหาที่ทำงานเร็วขึ้นมากเมื่อเลือกtop 100และช้ากว่าโดยไม่top 100เลือก จำนวนระเบียนที่ส่งคืนคือ 0 คุณสามารถอธิบายความแตกต่างในแผนคิวรีหรือแชร์ลิงก์ที่อธิบายความแตกต่างดังกล่าวได้หรือไม่ แบบสอบถามที่ไม่มีtopข้อความ: SELECT --TOP 100 * FROM InventTrans JOIN InventDim ON InventDim.DATAAREAID = 'dat' AND InventDim.INVENTDIMID = InventTrans.INVENTDIMID WHERE InventTrans.DATAAREAID = 'dat' AND InventTrans.ITEMID = '027743' AND InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND InventDim.ECC_BUSINESSUNITID = 'Казахстан'; แผนแบบสอบถามสำหรับข้างต้น (ไม่รวมtop): https://pastebin.com/cbtJpxFf สถิติ IO และ TIME (ไม่รวมtop): SQL Server …

6
ข้อเสียของการมีคอลัมน์จำนวนเต็มเดียวเป็นคีย์หลักเสมอ
ภายในเว็บแอปพลิเคชั่นตัวหนึ่งที่ฉันทำงานอยู่การดำเนินการฐานข้อมูลทั้งหมดจะถูกทำให้เป็นนามธรรมโดยใช้แหล่งเก็บข้อมูลทั่วไปที่กำหนดไว้ผ่าน Entity Framework ORM อย่างไรก็ตามเพื่อให้มีการออกแบบที่เรียบง่ายสำหรับที่เก็บข้อมูลทั่วไปตารางที่เกี่ยวข้องทั้งหมดจะต้องกำหนดจำนวนเต็มเฉพาะ ( Int32ใน C #, intใน SQL) จนถึงขณะนี้ได้รับเสมอ PK IDENTITYของตารางและยังได้ คีย์ต่างประเทศมีการใช้งานอย่างหนักและจะอ้างอิงคอลัมน์จำนวนเต็มเหล่านี้ จำเป็นสำหรับทั้งความสอดคล้องและสำหรับการสร้างคุณสมบัติการนำทางโดย ORM โดยทั่วไปแล้วแอปพลิเคชันเลเยอร์จะดำเนินการดังต่อไปนี้: การโหลดข้อมูลเริ่มต้นจากตาราง (*) -SELECT * FROM table อัพเดท -UPDATE table SET Col1 = Val1 WHERE Id = IdVal ลบ -DELETE FROM table WHERE Id = IdVal ส่วนแทรก -INSERT INTO table (cols) VALUES (...) …

2
ทำไมถึงเป็น TIME ZONE nondeterministic
AT TIME ZONEดูเหมือนว่าSQL Server 2016 จะเป็น nondeterministic อย่างไรก็ตามฉันไม่สามารถค้นหาเอกสารอย่างเป็นทางการที่ระบุสิ่งนี้หรือให้เหตุผลเกี่ยวกับเหตุผลที่อยู่เบื้องหลัง ทำไมต้องเป็นAT TIME ZONEnondeterministic ตัวอย่างที่แสดงให้เห็นถึงความไม่มุ่งมั่น การดำเนินการ: CREATE TABLE Test ( LegacyTimestamp DATETIME, Timestamp AS LegacyTimestamp AT TIME ZONE 'Eastern Standard Time' PERSISTED ); ส่งคืนข้อผิดพลาดต่อไปนี้: Msg 4936, Level 16, State 1, Line 1 Computed column 'Timestamp' in table 'Test' cannot be persisted because the …

1
จะป้องกันการสร้างสถิติในคอลัมน์ได้อย่างไร?
ฉันมีตารางที่มีคอลัมน์ที่ฉันไม่ต้องการให้สร้างหรืออัปเดตสถิติ ฉันจะได้ค่าประมาณการเข้าร่วมที่ดีขึ้นถ้าฉันบังคับให้เครื่องมือเพิ่มประสิทธิภาพการสืบค้นใช้ความหนาแน่นของสถิติในคีย์หลักซึ่งต่างจากสถิติฮิสโตแกรมในคอลัมน์นั้น สถิติการอัปเดตอัตโนมัติและสร้างอัตโนมัติอยู่ที่ระดับฐานข้อมูลและฉันไม่สามารถเปลี่ยนแปลงได้ หากคุณต้องการแนะนำทางเลือกอื่น ๆ ในการป้องกันการสร้างสถิติโปรดจำไว้ว่าตารางนั้นถูกใช้ในมุมมองที่อ้างอิงโดยการสืบค้นหลายพันรายการ ฉันไม่สามารถควบคุมคิวรีที่เรียกใช้ กลยุทธ์เริ่มต้นของฉันคือการสร้างสถิติในคอลัมน์ด้วยNOCOMPUTEและSAMPLE 0 ROWSตัวเลือก ฉันรู้สึกว่า SQL Server จะไม่สร้างสถิติในคอลัมน์ที่มีวัตถุสถิติโดยอัตโนมัติ แต่สิ่งนี้เกิดขึ้นบนเซิร์ฟเวอร์ dev และ QA ของเรา COL_GROUPสถิติใหม่ที่สร้างขึ้นสำหรับ NORECOMPUTEสถิติของฉันไม่ได้รับการปรับปรุง ฉันไม่รู้ว่าทำไมสถิติจึงถูกสร้างขึ้นและฉันไม่สามารถเรียกใช้ตัวเองด้วยการเรียกใช้คิวรีได้ มีวิธีป้องกัน SQL Server จากการสร้างสถิติโดยอัตโนมัติในหนึ่งคอลัมน์หรือไม่? ตารางของฉันมีสองคอลัมน์เท่านั้นดังนั้นโซลูชันที่ป้องกันไม่ให้สร้างสถิติอัตโนมัติในตารางเดียวจะช่วยแก้ปัญหาของฉันได้เช่นกัน แฟล็กการติดตาม 4139 และ 2371 เปิดอยู่ในกรณีที่สร้างความแตกต่าง หากคุณต้องการเล่นกับโครงสร้างตารางฉันได้รวมไว้และข้อมูลตัวอย่างด้านล่าง: CREATE TABLE X_NO_COLUMN_STATS( [COL_USER] [varchar](256) NOT NULL, [COL_GROUP] [int] NOT NULL, CONSTRAINT [PK_X_NO_COLUMN_STATS] PRIMARY KEY CLUSTERED ( …

7
ปรับช่วงตัวเลข (ช่วงเวลา) ให้เหมาะสมที่สุดใน SQL Server
คำถามนี้คล้ายกับการเพิ่มประสิทธิภาพการค้นหาช่วง IP หรือไม่ แต่อันนั้นถูก จำกัด ไว้ที่ SQL Server 2000 สมมติว่าฉันมี 10 ล้านช่วงที่จัดเก็บไว้ชั่วคราวในตารางที่มีโครงสร้างและมีประชากรดังนี้ CREATE TABLE MyTable ( Id INT IDENTITY PRIMARY KEY, RangeFrom INT NOT NULL, RangeTo INT NOT NULL, CHECK (RangeTo > RangeFrom), INDEX IX1 (RangeFrom,RangeTo), INDEX IX2 (RangeTo,RangeFrom) ); WITH RandomNumbers AS (SELECT TOP 10000000 ABS(CRYPT_GEN_RANDOM(4)%100000000) AS Num FROM …

1
วางแผนขนาดแคชและหน่วยความจำที่สงวนไว้
เมื่อรันเคียวรีรวมถึงแผนการดำเนินการตามจริงผู้ดำเนินการรูท ( SELECT) จะบอกฉันว่าขนาดแผนแคชคือ 32KB แบบสอบถามที่เข้าร่วมsys.dm_exec_cached_plansและsys.dm_os_memory_objectsมองไปที่แผนดังกล่าวกล่าวว่าค่าสำหรับpages_in_bytesและmax_pages_in_bytesคือ 32768 (32KB) ซึ่งตรงกับขนาดแผนแคช สิ่งที่ฉันไม่เข้าใจคือสิ่งที่มีค่าsys.dm_exec_cached_plans.size_in_bytesซึ่งคือ 49152 (48KB) ฉันได้อ่าน BOL ในคอลัมน์เหล่านี้ทั้งหมดและโดยเฉพาะsize_in_bytesที่บอกว่า: " จำนวนไบต์ที่ใช้โดยวัตถุแคช " ฉันไม่สามารถรับจิ๊กซอว์ชิ้นสุดท้ายได้เพื่อทำความเข้าใจความหมายของมัน ฉันรู้ว่าตัวดำเนินการทั้งหมด (ไม่ได้พูดถึงการให้สิทธิ์หน่วยความจำเพิ่มเติมที่ใช้สำหรับการเรียงลำดับและแฮช) ต้องใช้หน่วยความจำคงที่จำนวนหนึ่งเพื่อจัดเก็บสถานะทำการคำนวณ ฯลฯ ซึ่งจัดเก็บไว้ด้วยแผนเพิ่มประสิทธิภาพในแคช ดังนั้นคำถามของฉันคือ: อะไรsize_in_bytesจริงๆหมายถึง เพราะเหตุใดจึงมีมูลค่าสูงกว่า "ขนาดแผนแคช" จำนวนหน่วยความจำคงที่สำหรับตัวดำเนินการทั้งหมด / ตัวจองที่จองไว้กับ "ขนาดแผนแคช" (32Kb ในตัวอย่างของฉัน) หรือที่อื่น? ฉันรู้ว่าพวกเขาเป็น DMV ที่แตกต่างกันและมีฟังก์ชั่นต่างกัน แผนเรียบเรียง (แคช) sys.dm_exec_cached_plansรวมsys.dm_os_memory_objectsในmemory_object_addressคอลัมน์ เหตุผลที่ฉันโพสต์คำถามที่นี่คือฉันขอความช่วยเหลือในเรื่องนี้เข้าใจวิธีตีความ DMV และคอลัมน์ของพวกเขา ถ้าsize_in_bytesขนาดของแผนแคชทำไม SQL Server ถึงพูดถึงค่าอื่นในแผนการดำเนินการจริง แบบสอบถามใหม่หมายเลขใหม่: แผนจริง …

4
ทำไมการสำรองข้อมูลส่วนต่างไม่สามารถระบุฐานได้
นี่เป็นโพสต์ DBA.SE แรกของฉันดังนั้นโปรดแจ้งความผิดพลาดใด ๆ ขอบคุณ! ฉันเป็น DBA ใหม่ (ไม่ใช่มืออาชีพด้านไอทีไม่มีใครทำใน บริษัท ) ดังนั้นคำอธิบายพื้นฐานที่ดีกว่าก็ดีกว่า ฉันได้อ่านเกี่ยวกับกลยุทธ์การสำรองฐานข้อมูล (หรืออย่างที่ฉันได้เรียนรู้ที่จะเรียกพวกเขาว่า "คืนค่ากลยุทธ์") ฉันเข้าใจว่าการสำรองข้อมูล Full, Differential และ Transaction Log ทำอะไร แต่ฉันต้องการทราบว่าเหตุใดการสำรองข้อมูลส่วนต่างสามารถทำได้โดยใช้การสำรองข้อมูลเต็มรูปแบบล่าสุดเท่านั้น หากการสำรองข้อมูลส่วนต่างคือทุกสิ่งที่เปลี่ยนแปลงตั้งแต่การสำรองข้อมูลเต็มรูปแบบครั้งล่าสุดเหตุใดจึงไม่สามารถใช้การสำรองข้อมูลที่แตกต่างจากการสำรองข้อมูลใด ๆ ที่ฉันเลือกได้ เพื่อความชัดเจนมากขึ้นฉันถามเกี่ยวกับการระบุฐานเมื่อมีการสำรองข้อมูลไม่ใช่เมื่อกู้คืน ฉันสมมติว่าเมื่อกู้คืนคุณจะเลือกฐานที่ถูกต้องและส่วนต่างที่สอดคล้องกันเพื่อทำการกู้คืน (ไม่ได้ใช้ส่วนต่างจากฐาน B เพื่อกู้คืนจากฐาน A) อะไรคือสาเหตุที่ทำให้ไม่สามารถใช้งานฟังก์ชั่นนี้ได้? ฉันคิดว่าต้องมีเหตุผลฉันไม่รู้ว่ามันคืออะไร หมายเหตุ: ผมเข้าใจว่าฐานที่ไม่สามารถระบุ แต่คำถามของฉันคือทำไมไม่ ? (ฉันไม่สนใจที่จะพูดคุยเกี่ยวกับ "ทำไมต้องเป็นคุณ") การเปรียบเทียบ นี่คือการเปรียบเทียบสำหรับวิธีที่ฉันเข้าใจการสำรองข้อมูลที่แตกต่างกัน: ฉันมีไฟล์ Excel พร้อมข้อมูลบางอย่างในเซลล์ ในวันที่ 1 ฉันทำสำเนาของไฟล์นี้และเก็บไว้ที่อื่น ("การสำรองข้อมูลทั้งหมด") ในวันที่ …

2
เหตุใดจึงใช้เวลานานกว่าในการสร้างดัชนีหลังจากขนาดคอลัมน์เพิ่มขึ้น
ผู้ขายของเราเปลี่ยนความกว้างของคอลัมน์ในเกือบทุกคอลัมน์ในฐานข้อมูลทั้งหมด ฐานข้อมูลอยู่ที่ประมาณ 7TB, 9000+ ตาราง เรากำลังพยายามสร้างดัชนีบนตารางที่มี 5.5 พันล้านแถว ก่อนการอัพเกรดของผู้ขายเราสามารถสร้างดัชนีได้ภายใน 2 ชั่วโมง ตอนนี้ต้องใช้เวลาหลายวัน สิ่งที่พวกเขาทำคือเพิ่มขนาด varchar (xx) เป็น varchar (256) ดังนั้นคอลัมน์ส่วนใหญ่เคยเป็น varchar (18) หรือ varchar (75) เป็นต้น อย่างไรก็ตามคีย์หลักประกอบด้วย 6 คอลัมน์ที่มีความกว้างรวมกันคือ 126 ตัวอักษร หลังจากอัปเกรดแล้วคีย์หลักคือ 1283 ตัวอักษรซึ่งละเมิดข้อ จำกัด ของเซิร์ฟเวอร์ SQL 900 ตัวอักษร ความกว้างคอลัมน์ของตารางทั้งหมดเพิ่มขึ้นจากการนับรวม varchar รวม 1049 ถึงการรวม varchar รวม 4009 ไม่มีข้อมูลเพิ่มขึ้นตารางไม่ใช้พื้นที่ "เกิน" มากกว่าที่เคยทำก่อนที่ความกว้างของคอลัมน์จะเพิ่มขึ้นทั้งหมด แต่ประสิทธิภาพในการสร้างบางอย่างเรียบง่ายเช่นเดียวกับดัชนีขณะนี้ใช้เวลานานเกินไป …

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