ผู้ดูแลฐานข้อมูล

ถามตอบสำหรับผู้เชี่ยวชาญด้านฐานข้อมูลที่ต้องการพัฒนาทักษะฐานข้อมูลและเรียนรู้จากผู้อื่นในชุมชน

2
คุณจะไปขอคุณสมบัติใหม่ใน SSMS ที่ไหน?
ฉันต้องการถาม Microsoft: หากต้องการโค้ดสีหน้าเว็บใน SSMS จะขึ้นอยู่กับเซิร์ฟเวอร์ที่เชื่อมต่ออยู่ ทำให้เป็นจริงเมื่อผลลัพธ์ของแบบสอบถามถูกส่งคืน คำถาม:คุณจะถามคุณสมบัติเหล่านั้นได้อย่างไร?
11 ssms 

1
ทำไมคุณสามารถดร็อปมุมมอง SQL Server ในฐานข้อมูลปัจจุบันเท่านั้น
เพิ่งสังเกตุสิ่งนี้และมีเวลาที่ยากลำบากในการหาเหตุผลทางเทคนิค ตารางสามารถถูกดร็อปโดยใช้ชื่อสามส่วน แต่มุมมองถูก จำกัด ไว้ที่สองส่วนชื่อ อะไรคือเหตุผลเบื้องหลังสิ่งนี้
11 sql-server  view 

1
เลือก * จากมุมมองใช้เวลา 4 นาที
ฉันกำลังประสบปัญหาซึ่งเมื่อฉันเรียกใช้แบบสอบถามกับมุมมองจะใช้เวลา 4+ นาที อย่างไรก็ตามเมื่อฉันเรียกใช้ความกล้าของแบบสอบถามมันจะเสร็จสิ้นในเวลา 1 วินาที สิ่งเดียวที่ฉันไม่แน่ใจเกี่ยวกับคือตารางที่เข้าร่วมเป็นตารางชั่วคราว แผนคิวรีแบบเฉพาะกิจ: https://www.brentozar.com/pastetheplan/?id=BykohB2p4 ดูแผนแบบสอบถาม: https://www.brentozar.com/pastetheplan/?id=SkIfTHh6E มีข้อเสนอแนะเกี่ยวกับสถานที่ที่จะลองและคิดออก ดูรหัส: ALTER VIEW [dbo].[vwDealHistoryPITA] AS SELECT ROW_NUMBER() OVER (PARTITION BY cm.CodeMasterID ORDER BY cm.CodeMasterID, cm.LastUpdateDate) AS Deal_HistoryID, cm.CodeMasterID, cm.ProjectName, cm.[Status], d.CompanyID, d.DealTypeMasterID, cm.[Description], d.PassiveInd, d.ApproxTPGOwnership, d.NumberBoardSeats, d.FollowonInvestmentInd, d.SocialImpactInd, d.EquityInd, d.DebtInd, d.RealEstateInd, d.TargetPctgReturn, d.ApproxTotalDealSize, cm.CurrencyCode, d.ConflictCheck, cm.CreatedDate, cm.CreatedBy, cm.LastUpdateDate, …
11 sql-server 

2
เหตุใดแบบสอบถาม DELETE จึงทำงานในรูปแบบหนึ่งนานกว่าอีกรูปแบบหนึ่ง
ฉันมีรหัสการล้างข้อมูลเฉพาะที่พยายามลบรายการที่ซ้ำบางรายการ สิ่งนี้ทำงานได้อย่างสมบูรณ์บนเว็บไซต์ของลูกค้าจำนวนมาก บันทึกบอกฉันว่าแบบสอบถามนี้ใช้อย่างน้อย 1 วินาทีสูงสุด 45 วินาที: DELETE FROM [tbl] WHERE [Id] NOT IN ( SELECT MIN([Id]) FROM [tbl] GROUP BY [IdProject], [IdRepresentative], [TimeStart] ) แต่ฉันมีลูกค้าที่แบบสอบถามนี้ทำงานนานกว่า 4 ชั่วโมง (ถึงตอนนี้และไม่สิ้นสุด)! ฉันตรวจสอบ DB ( DBCC CHECKDB) ฉันอัปเดตสถิติ ( sp_updatestats) แล้วและยังUPDATE STATISTICS [tbl] WITH FULLSCANไม่แสดงการเปลี่ยนแปลงอีกด้วย ฉันมีการสำรองข้อมูลดั้งเดิมของฐานข้อมูลจากลูกค้า ฉันเรียกใช้บน SQL Server 14.0.2002.14 ฉันมี Standard Edition …

2
ทำไมฉันถึงได้รับการแปลงโดยนัยของ Int / Smallint เป็น Varchar และมันส่งผลกระทบต่อการประเมิน Cardinality จริง ๆ หรือไม่
ฉันกำลังพยายามแก้ไขปัญหาแบบสอบถามที่ทำงานช้าโดยใช้ Show Plan Analysis (SSMS) บนแผนปฏิบัติการจริง เครื่องมือวิเคราะห์ชี้ให้เห็นว่าการประมาณการจำนวนแถวนั้นไม่ได้ผลการค้นหาที่ส่งคืนในบางสถานที่ในแผนและให้คำเตือนการแปลงโดยนัยเพิ่มเติม ฉันไม่เข้าใจการแปลงโดยนัยเหล่านี้ของ int ไปเป็น Varchar- เขตข้อมูลที่อ้างถึงไม่ได้เป็นส่วนหนึ่งของพารามิเตอร์ / ตัวกรองใด ๆ ในแบบสอบถามและในตารางทั้งหมดที่เกี่ยวข้องกับชนิดข้อมูลคอลัมน์จะเหมือนกัน: ฉันได้รับคำเตือนจาก Cardinality ด้านล่าง: การแปลงประเภทในนิพจน์ (CONVERT_IMPLICIT (varchar (12), [ccd]. [profileid], 0)) อาจส่งผลต่อ "CardinalityEstimate" ในตัวเลือกแผนแบบสอบถาม - ฟิลด์นี้เป็นจำนวนเต็มทุกที่ในฐานข้อมูลของฉัน การแปลงประเภทในนิพจน์ (CONVERT_IMPLICIT (varchar (6), [ccd]. [nodeid], 0)) อาจส่งผลต่อ "CardinalityEstimate" ในตัวเลือกแผนแบบสอบถาม - ฟิลด์นี้มีขนาดเล็กทุกที่ใน DB ของฉัน การแปลงประเภทในการแสดงออก (CONVERT_IMPLICIT (varchar (6), [ccd]. …

4
คอลัมน์รหัสประจำตัวอีกครั้ง: เมื่อจำเป็นหรือไม่
ในช่วงหนึ่งของบทเรียนสุดท้ายที่มหาวิทยาลัย (ฉันเป็นนักเรียน) อาจารย์ขอให้เราพัฒนาฐานข้อมูล (MySQL Server ถ้ามันเป็นเรื่องสำคัญ) และแอปไคลเอ็นต์ขนาดเล็กที่ใช้ฐานข้อมูลเป็นแหล่งข้อมูล หนึ่งในข้อกำหนดคือคอลัมน์ประจำตัว (ซึ่งคือ PK ในทุกตาราง) จะต้องเรียงตามลำดับเพราะเป็นการปฏิบัติที่ดี (ตามคำของอาจารย์) กล่าวคือเมื่อลบแถวของตารางจะต้องมีการนำ PK กลับมาใช้ใหม่ในส่วนแทรกภายหลัง ฉันมีความรู้โดยเฉลี่ยเกี่ยวกับ RDBMS, PKs และคอลัมน์ข้อมูลประจำตัว จากสิ่งที่ฉันเข้าใจคอลัมน์ข้อมูลประจำตัวนั้นเป็นเพียงวิธีให้ DB สร้างอัตโนมัติ PK เมื่อแทรกแถวและไม่มีอะไรเพิ่มเติม และค่าคอลัมน์ข้อมูลประจำตัวจะไม่เกี่ยวข้องกับแอตทริบิวต์แถวในทางใด ๆ (ตราบใดที่มันไม่ใช่คีย์ธรรมชาติ) ข้อกำหนดนี้ (คอลัมน์ข้อมูลประจำตัวตามลำดับอย่างเคร่งครัด) เป็นที่น่าสงสัยสำหรับฉัน ฉันพยายามถามอาจารย์ว่าเกิดอะไรขึ้นถ้าตัวตนไม่ได้เรียงตามลำดับ (ด้วยช่องว่างที่เกิดจากการลบ) แต่ได้คำตอบที่เป็นนามธรรมเช่น "สะดวกสำหรับผู้ใช้และเป็นประโยชน์สำหรับผู้ดูแลฐานข้อมูลที่ดูแลฐานข้อมูล" ไม่มีตัวอย่างเฉพาะ อาร์กิวเมนต์ "สะดวกสำหรับผู้ใช้" ฟังดูไม่ดีเพราะไม่มีความหมายใด ๆ ในโดเมนธุรกิจ ดังนั้นฉันอยากรู้ว่าเหตุผลเหล่านี้เป็นจริงหรือไม่ ฉันสามารถคิดได้เพียงกรณีเดียวเท่านั้นที่ต้องมีการระบุคอลัมน์ข้อมูลประจำตัวใหม่ - เมื่อพื้นที่ข้อมูลส่วนบุคคลหมดแล้ว แต่นี่เป็นปัญหาการออกแบบที่มากขึ้นเมื่อเลือกคอลัมน์ประเภทข้อมูลระบุตัวตนไม่ถูกต้องพูดง่าย ๆintแทนbigintหรือuniqueidentifierเมื่อตารางมีจำนวนพันล้านแถว สมมติว่าคอลัมน์ข้อมูลประจำตัวเป็นดัชนีกลุ่ม: ช่องว่างในคอลัมน์ข้อมูลระบุตัวตนมีผลต่อประสิทธิภาพของดัชนีหรือไม่ อาจจะมีเหตุผลอื่น …

1
เหตุใดหน้าต่างโหมดแบตช์จึงรวมการคำนวณทางคณิตศาสตร์มากเกินไป
แบบสอบถามต่อไปนี้ดำเนินการแบบหน้าต่างSUMเหนือตาราง columnstore ด้วย1500 total rowsซึ่งแต่ละอันมีค่า 0 หรือ 1 และมัน overflows INTชนิดข้อมูล ทำไมสิ่งนี้จึงเกิดขึ้น SELECT a, p, s, v, m, n, SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition FROM ( SELECT a, p, s, v, m, n, RANK() …

1
แสดงรายการหน้า ROW_OVERFLOW_DATA สำหรับตารางที่ระบุ
ฉันพยายามรับรายการหน้าสำหรับตารางที่มีแถวที่มี ROW_OVERFLOW_DATA ฉันสามารถรับรายการของหน้าที่จัดสรรจาก DMV ที่ไม่มีเอกสารsys.db_db_database_page_allocationsแต่ดูเหมือนจะไม่มีหน้า ROW_OVERFLOW_DATA ที่แสดงรายการในผลลัพธ์ของ DMV นั้น มี DMV อื่นที่ฉันไม่สามารถค้นหาได้หรือไม่ ตัวอย่างที่ตรวจสอบได้น้อยที่สุดสมบูรณ์และ (หวังว่า!): USE tempdb; IF OBJECT_ID(N'dbo.t', N'U') IS NOT NULL DROP TABLE dbo.t; GO CREATE TABLE dbo.t ( rownum int NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED , on_row_data varchar(30) NOT NULL DEFAULT ('on_row_data') , off_row_data varchar(MAX) NOT NULL …

1
N'Șc 'พิจารณาคีย์ที่ซ้ำกันของ N'C' โดยใช้การเปรียบเทียบ Latin1_General_CI_AS
ฉันมีตารางที่มีคีย์เฉพาะที่มีNVARCHAR(50)คอลัมน์ (ถูกต้องหรือไม่ แต่มีอยู่) ดังนั้นเมื่อพยายามที่จะแทรกȘcหรือC(ไม่สำคัญกับคำสั่งของเม็ดมีด) มันจะแตกบนเม็ดที่สองเนื่องจากปัญหาการเรียง นี่คือข้อผิดพลาด: (รับผลกระทบ 1 แถว) ข่าวสารเกี่ยวกับ 2601, ระดับ 14, สถานะ 1, บรรทัดที่ 16 ไม่สามารถแทรกแถวคีย์ซ้ำในวัตถุ 'dbo.testT' ด้วยดัชนีเฉพาะ 'IX_TestT' ค่าคีย์ที่ซ้ำกันคือ (C) เลือกผลตอบแทน: Latin1_General_CI_ASเปรียบเทียบค่าเริ่มต้นฐานข้อมูลเป็น ใช้เวลาดูวิธีการแก้ปัญหาโดยไม่ต้องเปลี่ยนโครงสร้างที่มีอยู่แล้ว แต่ไม่สามารถหาวิธีทำงานได้ พยายามเรียงความและรวมที่แตกต่างกันทุกอย่างล้มเหลว อ่าน ( ที่นี่และที่นี่ ) เกี่ยวกับการขยายตัวอักขระและอื่น ๆ ยังคงติดอยู่ นี่คือตัวอย่างรหัสที่ฉันใช้เพื่อทำซ้ำปัญหารู้สึกฟรีเพื่อแก้ไขและแนะนำสิ่งที่สามารถช่วยแก้ปัญหานี้ได้ CREATE TABLE testT ( [Default_Collation] [NVARCHAR] (50) COLLATE DATABASE_DEFAULT, [Latin1_General_CI_AS] [NVARCHAR] (50) COLLATE Latin1_General_CI_AS, …

2
MAXDOP = 1, คำแนะนำการสืบค้นและเกณฑ์ค่าใช้จ่ายสำหรับความเท่าเทียม
หากมีการMAXDOPตั้งค่าอินสแตนซ์ที่ 1 และคำแนะนำแบบสอบถามถูกใช้เพื่ออนุญาตให้แบบสอบถามเฉพาะขนานกันเป็นเกณฑ์ต้นทุนสำหรับค่า Parallelism ที่ SQL ยังคงใช้เพื่อตัดสินใจว่าจริงหรือไม่ขนานกันหรือไม่ ฉันไม่สามารถขุดข้อมูลเฉพาะนี้ได้แม้ว่าลิงก์นี้แสดงให้เห็นว่า CTFP จะถูกเพิกเฉยถ้าMAXDOPเป็น 1 สิ่งนี้สมเหตุสมผลโดยไม่มีคำแนะนำแบบสอบถามเนื่องจากไม่มีการร้องขอโดยไม่คำนึงถึงต้นทุนจะขนานกันเมื่อMAXDOPเป็น 1 ใครช่วยให้ฉันรู้ว่าพฤติกรรมที่คาดหวังของคำขอทั้งสองนี้จะเป็นอย่างไร ตัวอย่างที่ 1: Instance Maxdop: 1 CTFP: 50 Query hint: Maxdop=2 Query cost: 30 ตัวอย่างที่ 2: Instance Maxdop: 1 CTFP: 50 Query hint: Maxdop=2 Query cost: 70

1
ทำไม NOLOCK ทำการสแกนด้วยการกำหนดตัวแปรให้ช้าลง?
ฉันต่อสู้กับ NOLOCK ในสภาพแวดล้อมปัจจุบันของฉัน อาร์กิวเมนต์หนึ่งที่ฉันได้ยินคือโอเวอร์เฮดของการล็อกทำให้การสืบค้นช้าลง ดังนั้นฉันจึงวางแผนการทดสอบเพื่อดูว่าค่าใช้จ่ายนี้จะมากแค่ไหน ฉันค้นพบว่า NOLOCK จริง ๆ แล้วการสแกนของฉันช้าลง ตอนแรกฉันดีใจ แต่ตอนนี้ฉันสับสน การทดสอบของฉันไม่ถูกต้องอย่างใด? NOLOCK ไม่ควรอนุญาตให้สแกนเร็วขึ้นเล็กน้อยจริง ๆ หรือ เกิดอะไรขึ้นที่นี่ นี่คือสคริปต์ของฉัน: USE TestDB GO --Create a five-million row table DROP TABLE IF EXISTS dbo.JustAnotherTable GO CREATE TABLE dbo.JustAnotherTable ( ID INT IDENTITY PRIMARY KEY, notID CHAR(5) NOT NULL ) INSERT dbo.JustAnotherTable SELECT …

3
การให้สิทธิ์ ALTER TABLE ได้รับอันตรายอย่างไร
ลองนึกภาพสถานการณ์ต่อไปนี้ CREATE DATABASE test GO USE test; CREATE TABLE dbo.Customer ( CustomerId INT, Email VARCHAR(100), SensitiveData VARCHAR(20) ); INSERT INTO dbo.Customer VALUES (1,'abc@foo.com','12346789'); ณ จุดหนึ่งกระบวนการ ETL จะถูกเขียนที่ดำเนินการบางกิจกรรมในtestฐานข้อมูล CREATE USER etlUser WITHOUT LOGIN; /*For demo purposes*/ CREATE TABLE dbo.StagingTable ( StagingTableId INT, SomeData VARCHAR(100), ) GRANT UPDATE,INSERT,DELETE,SELECT,ALTER ON dbo.StagingTable TO etlUser; …

2
ฐานข้อมูล SQL Server พร้อมที่จะรับแบบสอบถามเมื่อใด
ในไฟล์บันทึกข้อผิดพลาด SQL Server ฉันพบบรรทัดต่อไปนี้: 2018-02-22 14:10:58.95 spid17s Starting up database 'msdb'. 2018-02-22 14:10:58.95 spid16s Starting up database 'ReportServer'. 2018-02-22 14:10:58.95 spid18s Starting up database 'ReportServerTempDB'. 2018-02-22 14:10:58.95 spid19s Starting up database 'XYZ'. ถ้าฉันตรวจสอบสถานะของฐานข้อมูล XYZ ก่อนหน้านี้มันกำลังONLINEใช้คำสั่งต่อไปนี้: SELECT state_desc FROM sys.databases WHERE name='XYZ' ... แต่เมื่อฉันพยายามเชื่อมต่อกับฐานข้อมูลนี้โดยใช้แอปพลิเคชัน C # จะไม่สามารถเชื่อมต่อกับฐานข้อมูลได้ ข้อผิดพลาดคือ: การเข้าสู่ระบบล้มเหลวสำหรับผู้ใช้ 'asd' สาเหตุ: …

2
ฟังก์ชันเดียวกันใน SELECT และ WHERE clause
คำถามเริ่มต้น: ฉันมีฟังก์ชั่นราคาแพงf(x, y)สองคอลัมน์ x และ y ในตารางฐานข้อมูลของฉัน ฉันต้องการที่จะดำเนินการค้นหาที่ให้ผลลัพธ์ของฟังก์ชั่นเป็นคอลัมน์และทำให้ข้อ จำกัด ในสิ่งที่ชอบ SELECT *, f(x, y) AS func FROM table_name WHERE func < 10; อย่างไรก็ตามสิ่งนี้ไม่ได้ผลดังนั้นฉันจะต้องเขียนบางอย่างเช่น SELECT *, f(x, y) AS func FROM table_name WHERE f(x, y) < 10; สิ่งนี้จะเรียกใช้ฟังก์ชั่นราคาแพงสองครั้งหรือไม่ วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?

5
วิธีการมีมากกว่า 100 รายการในคำสั่ง case เป็นตัวแปร
ฉันเขียนคำสั่ง case ด้วยตัวเลือกมากกว่า 100 ตัวเลือกซึ่งฉันใช้คำสั่งเดียวกันใน 4 แห่งในการค้นหาแบบง่าย แบบสอบถามเดียวกันสองครั้งที่มีการรวมกันระหว่างพวกเขา แต่ยังมีการนับและดังนั้นกลุ่มโดยยังมีคำสั่งกรณี นี่คือการติดฉลากชื่อ บริษัท บางรายการที่มีการสะกดคำที่แตกต่างกันสำหรับ บริษัท เดียวกันต่างกัน ฉันพยายามประกาศตัวแปรเป็น VarChar (MAX) declare @CaseForAccountConsolidation varchar(max) SET @CaseForAccountConsolidation = 'CASE WHEN ac.accountName like ''AIR NEW Z%'' THEN ''AIR NEW ZEALAND'' WHEN ac.accountName LIKE ''AIR BP%'' THEN ''AIR BP'' WHEN ac.accountName LIKE ''ADDICTION ADVICE%'' THEN ''ADDICTION ADVICE'' …

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