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

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

3
ประสิทธิภาพที่แย่ลงบนเซิร์ฟเวอร์ใหม่
เราอยู่บนเซิร์ฟเวอร์เฉพาะ (quad-core เดียว, RAM 6 GB) และกำลังย้ายไปยังเซิร์ฟเวอร์เฉพาะใหม่ (2x hex-core, 32 GB RAM) ทั้งสองเป็น Windows Server 2008, SQL Server 2008 ประสิทธิภาพการทำงานบนเซิร์ฟเวอร์ใหม่นั้นแย่กว่าเซิร์ฟเวอร์เก่าที่ช้ากว่าเล็กน้อย ในการทดสอบแอปพลิเคชัน ASP.NET ของเราทำงานช้าลง 10 - 20% การเรียกใช้ข้อความค้นหาราคาแพงทีละรายการด้วยสถิติ IO และสถิติเวลาแสดงเวลาที่ผ่านไปมากกว่า 10 - 20% บนเซิร์ฟเวอร์ใหม่ โปรไฟล์การสืบค้นข้อมูล SQL แสดงการใช้งาน CPU ที่สูงขึ้นสำหรับการสืบค้นที่มีราคาแพง ตัวจัดการงานบนเซิร์ฟเวอร์ใหม่แสดงให้เห็นว่า sqlserver.exe ใช้ RAM ขนาด 22 GB แต่ค่าของ CPU ยังคงต่ำอยู่เสมอ ฉันได้อัปเดตสถิติทั้งหมดสร้างใหม่หรือจัดดัชนีใหม่ ฯลฯ …

2
LATCH_EX รอทรัพยากร METADATA_SEQUENCE_GENERATOR
เรามีกระบวนการที่สร้างรายงานสินค้าคงคลัง ในฝั่งไคลเอ็นต์กระบวนการแยกจำนวนเธรดผู้ปฏิบัติงานที่สามารถกำหนดค่าได้เพื่อสร้างกลุ่มข้อมูลสำหรับรายงานที่สอดคล้องกับที่เก็บหนึ่งแห่งจากหลาย ๆ ที่ (อาจเป็นพันหลายสิบโดยทั่วไป) เธรดผู้ปฏิบัติงานแต่ละคนเรียกบริการเว็บที่ดำเนินการตามขั้นตอนที่เก็บไว้ กระบวนการฐานข้อมูลสำหรับการประมวลผลแต่ละกลุ่มรวบรวมข้อมูลลงในตาราง #Temporary ในตอนท้ายของแต่ละชิ้นประมวลผลข้อมูลจะถูกเขียนไปยังตารางถาวรใน tempdb ในที่สุดเมื่อสิ้นสุดกระบวนการหนึ่งเธรดที่ฝั่งไคลเอ็นต์ร้องขอข้อมูลทั้งหมดจากตาราง tempdb ถาวร ยิ่งผู้ใช้ที่เรียกใช้รายงานนี้ยิ่งได้รับช้า ฉันวิเคราะห์กิจกรรมในฐานข้อมูล ณ จุดหนึ่งฉันเห็นคำขอ 35 รายการที่ถูกบล็อกทั้งหมดถูกบล็อก ณ จุดหนึ่งในกระบวนการ SPIDs ทั้งหมดเหล่านี้ได้ในคำสั่งของ 50 มิลลิวินาทีรอประเภททรัพยากรLATCH_EX METADATA_SEQUENCE_GENERATOR (00000010E13CA1A8)SPID หนึ่งมีทรัพยากรนี้และอื่น ๆ ทั้งหมดกำลังบล็อก ฉันไม่พบสิ่งใดเกี่ยวกับทรัพยากรการรอนี้ในการค้นหาเว็บ ตารางใน tempdb ที่เราใช้อยู่มีIDENTITY(1,1)คอลัมน์ SPID เหล่านี้กำลังรอคอลัมน์ประจำตัวหรือไม่ เราสามารถใช้วิธีการใดในการลดหรือกำจัดการบล็อก เซิร์ฟเวอร์เป็นส่วนหนึ่งของคลัสเตอร์ เซิร์ฟเวอร์กำลังเรียกใช้ SQL Server 2012 Standard Edition SP1 64 บิตใน Windows 2008 R2 …

2
เหตุใดการปิดใช้งานดัชนีคลัสเตอร์จึงทำให้ตารางไม่สามารถเข้าถึงได้
เมื่อดัชนีถูกปิดใช้งานคำจำกัดความยังคงอยู่ในแคตตาล็อกระบบ แต่ไม่ได้ใช้อีกต่อไป SQL Server ไม่รักษาดัชนี (เนื่องจากข้อมูลในการเปลี่ยนแปลงตาราง) และดัชนีไม่สามารถใช้เพื่อตอบสนองแบบสอบถาม หากปิดใช้งานดัชนีแบบคลัสเตอร์ตารางทั้งหมดจะไม่สามารถเข้าถึงได้ เหตุใดจึงไม่สามารถเข้าถึงข้อมูลโดยตรงจากตารางที่ทิ้งต้นไม้ทรี B (น่าจะเป็นโดยการสแกนตารางทีละแถว) มันจะไม่เหมาะสมกว่าการทำให้ข้อมูลไม่สามารถเข้าถึงได้อย่างสมบูรณ์? มันเป็นคำถามเชิงทฤษฎีล้วนๆ - ฉันจะไม่ทำอย่างนั้นจริง ๆ มันไม่ใช่สถานการณ์หรือสิ่งที่ต้องทำฉันแค่อยากรู้ว่าทำไมสิ่งนั้นถึงเป็นเช่นนั้นลองพิจารณาคำถามภายใน

2
สคีมาเปลี่ยนกลุ่ม "สถานะว่าง" หรือพวกมันถูกจัดการอย่างโปร่งใสหรือไม่?
องค์กรของฉันวางแผนที่จะนำกลุ่มความพร้อมใช้งานของ SQL Server 2012 มาใช้และฉันพยายามที่จะเข้าใจว่าจะมีผลกระทบอย่างไร (ถ้ามี) ในกระบวนการอัปเกรดแอปพลิเคชันของเรา เราปล่อยการอัปเดตแอปพลิเคชันในรอบ 8 สัปดาห์และการเปิดตัวใด ๆ อาจรวมถึงการเปลี่ยนแปลงสคีมาและ / หรือการย้ายข้อมูล สิ่งที่ฉันพยายามทำความเข้าใจคือว่าโซลูชัน HA / DR จะจัดการกับการเปลี่ยนแปลง schema อย่างโปร่งใสหรือไม่ (คอลัมน์ใหม่, ดัชนีเพิ่มเข้ากับ Secondaries) หรือเป็นการแทรกแซงด้วยตนเองที่จำเป็นในการสร้าง schema ในแต่ละอินสแตนซ์ ส่วนการโยกย้ายข้อมูลที่ฉันสมมติว่ามีการจัดการอย่างโปร่งใส แต่ต้องการยืนยันเช่นกัน ฉันเดาว่าฉันกำลังสร้างสมมุติฐานแบบครอบคลุมว่าพฤติกรรมเหล่านี้ไม่แตกต่างกันไปตามการกำหนดค่ากลุ่มความพร้อมใช้งานซึ่งอาจเป็นเท็จเช่นกัน โปรดแจ้งให้เราทราบ โดยสังเขป; ในแอปพลิเคชันของฉันที่ระบุฉันสามารถเปลี่ยนตารางที่มีขนาดใหญ่มาก (10s ถึง 100s ของเรคคอร์ด) โดยการเพิ่มคอลัมน์ลงไป บางคอลัมน์อาจเป็น "ใหม่สุทธิ" เพื่อให้สามารถใช้ประโยชน์จากฟังก์ชันการเปลี่ยนแปลงแบบแผนของ Enterprise Online ได้ คอลัมน์อื่นอาจเป็นการ refactoring ของคอลัมน์ที่มีอยู่ (FullName ได้รับการแบ่งเป็น FirstName …

3
การจัดเก็บวันที่เป็นจำนวนเต็ม (ตัวเลข) ข้อดีคืออะไร
คำถามที่ 1 ฉันกำลังทำงานกับระบบที่เก็บวันที่เป็นจำนวนเต็ม (ตัวเลขจริง (8,0)) และฉันสังเกตเห็นว่าระบบอื่น ๆ เก็บวันที่เป็น int เช่นซิสโก้ในหัวข้อนี้ ตัวอย่าง 20120101 -- 01 Jan 2012 มีข้อได้เปรียบอะไรบ้างในการรักษาระบบวันที่เป็นตัวเลขและไม่ได้ใช้ SQL Datetime? คำถามที่ 2 ตอนนี้ฉันพยายามวนวันที่เป็นตัวเลขเพื่อค้นหาลูกค้าระหว่างสองวัน หากstartและenddateรวมสองเดือนฉันจะได้รับบันทึกนับพันแทนที่จะเป็นเพียง 60 ตัวอย่าง: create table #temp1(day int,capacity int) /* just a temp table */ declare @start int declare @end int set @start=20111201 set @end = 20120131 while (@start …

2
การรับ“ สิทธิ์ SELECT ถูกปฏิเสธบนวัตถุ” แม้ว่าจะได้รับอนุญาตแล้วก็ตาม
ฉันเป็นโปรแกรมเมอร์ไม่ใช่ dba ... ฉันรู้ว่าเพียงพอที่จะเป็นอันตราย ฉันได้รับมรดกฐานข้อมูลด้วยผู้ใช้ดั้งเดิมที่เป็น db_owner สำหรับฐานข้อมูล เราไม่สามารถปรับการอนุญาตของผู้ใช้นี้สำหรับตาราง schema ที่มีอยู่ ฯลฯ ด้วยเหตุผลทางธุรกิจ แต่มีการสร้างตารางใหม่บางตารางขึ้นและฉันต้องการให้ผู้ใช้นี้มีสิทธิ์เข้าถึง SELECT เหล่านั้นเท่านั้น มีการตั้งค่าการอนุญาตสำหรับผู้ใช้นี้สำหรับตารางเหล่านี้เพื่อให้ทุกอย่างถูกปฏิเสธยกเว้น SELECT ซึ่งตั้งค่าเป็น GRANT แต่เมื่อผู้ใช้นี้ (dbadmin) พยายามทำการเลือกบนหนึ่งในตารางเหล่านี้ (AccountingAudit) ข้อผิดพลาดนี้เกิดขึ้น: The SELECT permission was denied on the object 'AccountingAudit', database 'billing', schema 'dbo'. ฉันใช้ SQL นี้เพื่อลองดูว่ามีการตั้งค่าการอนุญาตสำหรับตาราง / ผู้ใช้นี้: select object_name(major_id) as object, user_name(grantee_principal_id) as grantee, user_name(grantor_principal_id) …

3
เหตุใด. bak จึงเล็กกว่าฐานข้อมูลที่สำรองไว้มาก
ฉันเพิ่งสำรองฐานข้อมูล SQL Server ไฟล์ MDF และ LDF รวมกันประมาณ 29 GB แต่ไฟล์. bak มีขนาดเพียง 23 GB ซึ่งเล็กกว่าประมาณ 20% การเดาครั้งแรกของฉันเมื่อชุดข้อมูลหนึ่งรุ่นมีขนาดเล็กกว่ารุ่นอื่นที่มีข้อมูลเดียวกันจะเป็นการบีบอัดข้อมูล แต่การบีบอัดมักจะให้อัตราการบีบอัดที่ดีกว่า 20% โดยเฉพาะอย่างยิ่งสำหรับข้อมูลที่สั่งสูง ) นอกจากนี้ข้อมูลที่บีบอัดไม่สามารถบีบอัดได้ง่ายขึ้นอีก แต่ฉันรู้ว่าไฟล์. bak สามารถบีบอัดได้ ดังนั้นหากข้อมูลไม่ถูกบีบอัดและไม่มีการยกเลิก (เนื่องจากจุดทั้งหมดของการสำรองข้อมูลจะสามารถกู้คืนข้อมูลกลับสู่สถานะเดิมหลังจากนั้น) แล้ว 20% ที่ไม่ถูกต้องคืออะไร

3
SQL Server: กลุ่มไฟล์สำหรับตารางระบบเท่านั้น
หนึ่งในมาตรฐานองค์กรของเราคือมีกลุ่มไฟล์ / ไฟล์แยกต่างหากสำหรับตารางผู้ใช้ / ดัชนี ค่านี้ถูกตั้งค่าเป็นค่าเริ่มต้นดังนั้นไม่จำเป็นต้องมีคุณสมบัติในการสร้างคำสั่ง CREATE TABLE ดังนั้นดูเหมือนว่านี้ fileid 1 = ตารางระบบ, MDF fileid 2 = t-log = LDF fileid 3 = สิ่งที่ผู้ใช้ = NDF ทุกคนที่นี่สามารถช่วยฉันเข้าใจเหตุผลดั้งเดิมได้ไหมว่าทำไมเรื่องนี้ถึงได้รับคำสั่ง? ฉันจะมาทำความสะอาดและฉันคิดว่ามันเป็นของขึ้น Am ฉันผิด ... ? แก้ไข: ฉันรู้วิธีใช้กลุ่มไฟล์เพื่อแยกดัชนี / พาร์ติชั่น / ไฟล์เก็บถาวรรวมถึงวิธีการกู้คืนทีละน้อย คำถามนี้เกี่ยวกับการใช้กลุ่มไฟล์แยกต่างหากในปริมาณเดียวกันสำหรับตารางระบบเท่านั้น

2
ป้องกัน SSMS จากการดูระบบไฟล์ของเซิร์ฟเวอร์
ฉันมีผู้ใช้หลายคนที่ใช้เซิร์ฟเวอร์ MS SQL ร่วมกันภายใต้การดูแลของฉัน พวกเขาไม่ควรเห็น (หรือแม้กระทั่งระวัง) ของผู้ใช้รายอื่นและข้อมูลของพวกเขาบนเซิร์ฟเวอร์นั้น ผู้ใช้แต่ละคนมีฐานข้อมูลของตัวเอง พวกเขาสามารถทำสิ่งที่พวกเขาต้องการด้วยฐานข้อมูลของพวกเขา ฉันใช้Partial Containmentคุณสมบัติของ SQL Server เพื่อล็อคผู้ใช้งาน ล็อกอินถูกสร้างขึ้นภายในฐานข้อมูล วิธีนี้ใช้งานได้ดีเนื่องจากไม่เห็นบัญชีผู้ใช้หรือฐานข้อมูลอื่นด้วยวิธีนี้ การเข้าสู่ระบบฐานข้อมูลถูกเพิ่มไปยังบทบาทฐานข้อมูลที่ฉันสร้างด้วยคำสั่งนี้: USE dbname CREATE ROLE dbrole GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, CREATE VIEW, ALTER ANY SCHEMA TO dbrole DENY EXECUTE TO dbrole ฉันสร้างบัญชีเข้าสู่ระบบ db ใหม่และเพิ่มไปยังบทบาทที่กล่าวไว้เท่านั้น ผู้ใช้ไม่มีสิทธิ์อื่น ๆ (ที่ฉันรู้) ปัญหาเดียวที่เหลืออยู่คือ SSMS ยังคงสามารถเรียกดูระบบไฟล์ของเซิร์ฟเวอร์ได้ ถ้าฉันคลิกขวาที่ฐานข้อมูลและเลือกTasks …

1
ตรรกะอ่านบนโต๊ะ temp ทั่วโลก แต่ไม่ได้อยู่ในตาราง temp ระดับเซสชั่น
พิจารณา MCVE แบบง่าย ๆ ต่อไปนี้: SET STATISTICS IO, TIME OFF; USE tempdb; IF OBJECT_ID(N'tempdb..#t1', N'U') IS NOT NULL DROP TABLE #t1; CREATE TABLE #t1 ( r int NOT NULL ); IF OBJECT_ID(N'tempdb..##t1', N'U') IS NOT NULL DROP TABLE ##t1; CREATE TABLE ##t1 ( r int NOT NULL ); IF OBJECT_ID(N'dbo.s1', …

1
มุมมองการเข้าถึงตามตารางในฐานข้อมูลอื่นที่ไม่มีบัญชีในฐานข้อมูลอื่นนั้น
ฉันสร้างมุมมองในฐานข้อมูล 1 ตามตารางในฐานข้อมูล 2 ฉันให้SELECTสิทธิ์แก่ผู้ใช้ที่เข้าถึงได้เฉพาะฐานข้อมูล 1 ผู้ใช้ไม่สามารถรับมุมมองนี้ให้ทำงานได้เนื่องจากเขาไม่มีบัญชีในฐานข้อมูล 2 ฉันจะแก้ปัญหานี้ได้อย่างไร ฉันไม่ต้องการสร้างบัญชีในฐานข้อมูล 2

1
การเปรียบเทียบประสิทธิภาพระหว่างการใช้ฟังก์ชั่นเข้าร่วมและหน้าต่างเพื่อรับค่านำและระยะเวลาล่าช้า
ผมมีตารางที่มีแถว 20M และแต่ละแถวมี 3 คอลัมน์: time, และid valueสำหรับแต่ละidและtimeมีvalueสถานะ ฉันต้องการทราบว่านำและล่าช้าค่าของบางอย่างสำหรับการที่เฉพาะเจาะจงtimeid ฉันใช้สองวิธีเพื่อให้ได้สิ่งนี้ วิธีการหนึ่งคือการใช้เข้าร่วมและอีกวิธีหนึ่งคือการใช้ฟังก์ชั่นหน้าต่างนำ / ล่าช้ากับดัชนีคลัสเตอร์บนและtimeid ฉันเปรียบเทียบประสิทธิภาพของสองวิธีนี้ตามเวลาดำเนินการ วิธีการเข้าร่วมใช้เวลา 16.3 วินาทีและวิธีฟังก์ชั่นหน้าต่างใช้เวลา 20 วินาทีโดยไม่รวมเวลาในการสร้างดัชนี สิ่งนี้ทำให้ฉันประหลาดใจเพราะฟังก์ชั่นหน้าต่างดูเหมือนจะก้าวหน้าในขณะที่วิธีการเข้าร่วมนั้นดุร้าย นี่คือรหัสสำหรับสองวิธี: สร้างดัชนี create clustered index id_time on tab1 (id,time) เข้าร่วมวิธีการ select a1.id,a1.time a1.value as value, b1.value as value_lag, c1.value as value_lead into tab2 from tab1 a1 left join tab1 b1 …

6
ไม่สามารถดำเนินการต่อได้เนื่องจากเซสชันอยู่ในสถานะ kill ในขณะที่สร้างดัชนีคลัสเตอร์
ฉันได้รับข้อผิดพลาดต่อไปนี้ขณะที่พยายามสร้างดัชนีคลัสเตอร์ คำสั่งถูกยกเลิก ข่าวสารเกี่ยวกับ 596 ระดับ 21 สถานะ 1 บรรทัด 0 ไม่สามารถดำเนินการต่อได้เนื่องจากเซสชันอยู่ในสถานะ kill ข่าวสารเกี่ยวกับ 0 ระดับ 20 สถานะ 0, บรรทัด 0 ข้อผิดพลาดร้ายแรงที่เกิดขึ้นกับคำสั่งปัจจุบัน ควรยกเลิกผลลัพธ์หากมี ดัชนีคือ: BEGIN TRANSACTION SET QUOTED_IDENTIFIER ON SET ARITHABORT ON SET NUMERIC_ROUNDABORT OFF SET CONCAT_NULL_YIELDS_NULL ON SET ANSI_NULLS ON SET ANSI_PADDING ON SET ANSI_WARNINGS ON COMMIT BEGIN TRANSACTION GO …

1
วิธีรับประวัติการสืบค้นที่ดำเนินการโดยใช้ชื่อผู้ใช้ใน SQL
ฉันสามารถเรียกใช้คิวรีได้โดยใช้: SELECT deqs.last_execution_time AS [Time] ,dest.TEXT AS [Query] FROM sys.dm_exec_query_stats AS deqs CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest ORDER BY deqs.last_execution_time DESC แต่ฉันกำลังมองหาusernameคอลัมน์ที่ดำเนินการค้นหาเหล่านี้ด้วย

3
ข้อแตกต่างระหว่าง WITH CTE และ WITH CTE (<column_name>) คืออะไร
ดังที่แสดงในการใช้ Common Table Expressionsบน MSDN คุณสามารถกำหนด CTE เป็น: WITH expression_name [ ( column_name [,...n] ) ] AS ( CTE_query_definition ) และใช้มันเช่น: SELECT &lt;column_list&gt; FROM expression_name; สมมติว่าฉันมี 2 CTE ต่อไปนี้ with cte1 as( select name from Table1 ) with cte2(name) as( select name from Table1 ) แบบสอบถามส่งผลลัพธ์เดียวกันสำหรับ CTE ทั้งสองเนื่องจากแบบสอบถามภายในเหมือนกัน ข้อแตกต่างระหว่างสองสิ่งนี้คือcte2มีชื่อคอลัมน์ ( …

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