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

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

1
CREATE TABLE SomeSchema # TempTableName มีข้อบกพร่องหรือไม่
ทดสอบเตียงง่าย ๆ : USE tempdb; GO /* This DROP TABLE should not be necessary, since the DROP SCHEMA should drop the table if it is contained within the schema, as I'd expect it to be. */ IF COALESCE(OBJECT_ID('tempdb..#MyTempTable'), 0) <> 0 DROP TABLE #MyTempTable; IF EXISTS (SELECT 1 FROM sys.schemas …

4
คำนวณจำนวนการเข้าชมทั้งหมด
ฉันกำลังพยายามเขียนแบบสอบถามที่ฉันต้องคำนวณจำนวนการเข้าชมสำหรับลูกค้าโดยดูแลวันที่ทับซ้อนกัน สมมติว่าสำหรับวันที่เริ่มต้น itemID 2009 คือ 23 และวันที่สิ้นสุดคือ 26 ดังนั้นรายการ 20010 อยู่ระหว่างวันเหล่านี้เราจะไม่เพิ่มวันที่ซื้อนี้ไปยังจำนวนรวมของเรา ตัวอย่างสถานการณ์: Item ID Start Date End Date Number of days Number of days Candidate for visit count 20009 2015-01-23 2015-01-26 4 4 20010 2015-01-24 2015-01-24 1 0 20011 2015-01-23 2015-01-26 4 0 20012 2015-01-23 2015-01-27 5 1 20013 2015-01-23 …

1
วิธีการใช้ประโยชน์จากโหมดแบทช์ด้วย UNPIVOT (การเข้าร่วมแบบวนซ้ำ)
ฉันมีแบบสอบถามของแบบฟอร์มต่อไปนี้: SELECT ... FROM ColumnstoreTable cs CROSS APPLY ( SELECT * FROM (VALUES ('A', cs.DataA) , ('B', cs.DataB) , ('C', cs.DataC) ) x(Col0, Col1) ) someValues การดำเนินการนี้จะใช้ทุกแถวจากแบบสอบถามย่อยที่สำรองไว้ในคอลัมน์ ( ColumnstoreTable) และคูณแถวเหล่านั้น UNPIVOTนี้เป็นหลัก แบบสอบถามจริงมีขนาดใหญ่กว่านี้ ส่วนนี้ของแบบสอบถามจะดึงข้อมูลไปยังการประมวลผลอื่น ๆ ปัญหาที่นี่คือสิ่งนี้CROSS APPLYถูกนำไปใช้เป็นการเข้าร่วมแบบวนรอบซึ่งเป็นตัวเลือกที่สมเหตุสมผล น่าเสียดายที่การรวมลูปไม่สนับสนุนโหมดแบทช์ ส่วนหนึ่งของแบบสอบถามนี้มีประสิทธิภาพที่สำคัญมากและฉันสงสัยว่าการรันในโหมดแบตช์อาจเป็นประโยชน์อย่างมากต่อประสิทธิภาพ ฉันจะเขียนแบบสอบถามนี้ใหม่เพื่อที่ฉันจะไม่เปลี่ยนจากโหมดแบทช์ได้อย่างไร ฉันลองใช้ตารางชั่วคราวแทนVALUESแต่นั่นไม่ได้เปลี่ยนความจริงที่ว่าไม่มีเงื่อนไขการเข้าร่วมที่เท่าเทียมกันในการเข้าร่วมแฮช

4
ตัวช่วยสร้างการคืนค่าฐานข้อมูลจะไม่เปิดใน SSMS 2014
บนเครื่องที่ใช้ Windows Server 2012 R2 ฉันเพิ่งอัพเกรด SQL Server จาก 2012 เป็น 2014 ใช้ SQL Server Management Studio 2014 เมื่อฉันคลิกขวาที่ฐานข้อมูลและไปที่Tasks -> Restore -> Database...ไม่มีอะไรเกิดขึ้น ตัวช่วยสร้างการคืนค่าฐานข้อมูลไม่ปรากฏขึ้นอย่างที่คาดไว้ ไม่มีข้อผิดพลาดหรือล่มใน Event Viewer เคอร์เซอร์ไม่ได้เปลี่ยนเป็นนาฬิกาทราย การใช้ T-SQL เพื่อคืนค่าทำงานได้ดีและถ้าฉันย้อนกลับไปใช้ SSMS 2012 ได้ผลดี ความคิดเห็นใด ๆ เกี่ยวกับวิธีทำให้ตัวช่วยสร้างทำงานใน SSMS 2014 ฉันกำลังเชื่อมต่อกับอินสแตนซ์เดียวกันของ SQL Server ในทั้งสองเวอร์ชันของ SSMS และฉันได้ลองใช้ SSMS ในฐานะผู้ดูแลระบบแล้ว เป็น Service Pack …

4
ประเภทข้อมูลสำหรับหมายเลขโทรศัพท์: VARCHAR, INT หรือ BIGINT หรือไม่
ดังนั้นนี่จะเป็นคำถามจำลองของปี แต่ฉันต้องถามเนื่องจากไม่ใช่ครั้งแรกที่ฉันผ่านสิ่งนี้ ดูคำจำกัดความของตารางต่อไปนี้: ลองดูที่คอลัมน์from_numberซึ่งเป็นVARCHAR(45)ตอนนี้ แต่มันจะถือหมายเลขโทรศัพท์ เนื่องจากฉันไม่ทราบว่ามีกี่หมายเลขโทรศัพท์ที่สามารถมีได้ทั่วโลกดังนั้นฉันจึงพยายามครอบคลุมเกือบทั้งหมด ฉันต้องการให้สมบูรณ์ของฐานข้อมูลมากที่สุดเท่าที่เป็นไปได้ดังนั้นฉันคิดว่าVARCHARไม่ได้เป็นประเภทที่เหมาะสมสำหรับการถือชนิดของข้อมูลนี้ - บางทีฉันกำลังผิดคุณบอกฉัน - ดังนั้นฉันคิดในการเปลี่ยนแปลงหรือแม้กระทั่งINTBIGINT เมื่อฉันกำหนดคอลัมน์ใน Workbench ฉันควรระบุจำนวนระหว่างวงเล็บ()ไม่ใช่ทุกกรณี แต่ในรายการที่ฉันพูดถึงก่อนหน้านี้ฉันต้องทำ ดังนั้นถ้าฉันทำสิ่งนี้: BIGINT()ฉันได้รับข้อผิดพลาดนี้: ซึ่งให้คำแนะนำฉันไปอ่านเล็กน้อยเกี่ยวกับประเภท MySQL นี้ที่นี่ โดยทั่วไปข้อมูลนี้คือ: จำนวนเต็มขนาดใหญ่ ... ช่วงที่ไม่ได้ลงชื่อคือ 0 ถึง 18446744073709551615 ซึ่งทำให้ฉันถาม: สิ่งที่ฉันควรตั้งค่าสำหรับวงเล็บเมื่อฉันกำหนดBIGINT()ประเภท (ฉันใช้ BIGINT เพราะฉันไม่ทราบว่า INT สามารถถือตัวเลขได้มากเท่าที่โทรศัพท์มี - บางทีฉันก็ผิดด้วย) วิธีใดที่เหมาะสมในการสร้าง | ออกแบบคอลัมน์ในฐานข้อมูล MariaDB / MySQL อย่างไรก็ตามฉันต้องการทราบความคิดเห็นประสบการณ์และแน่นอนฉันต้องการคำตอบ หมายเหตุ:ฉันใช้ MySQL Workbench รุ่นล่าสุดเพื่อสร้างไดอะแกรม ER ฉันใช้ MariaDB …

4
จะเริ่มเข้าใจฐานข้อมูลที่ไม่รู้จักได้ที่ไหน
ดังนั้นชื่อเรื่องจึงสรุป ฉันมีฐานข้อมูล SQL Server ที่มี 28 ตารางและ 86 โพรซีเดอร์ที่เก็บไว้ซึ่งต้องถูกวิศวกรรมย้อนกลับ ฉันค่อนข้างแน่ใจว่าบางตารางไม่เคยใช้และไม่ใช้ procs ทั้งหมดเช่นกัน ปัญหาที่ใหญ่ที่สุดคือบริการ Windows ทั้งหมดที่สร้างขึ้นเพื่อใช้กับ DB นี้และเอกสารซอฟต์แวร์และฐานข้อมูลทั้งหมดหายไปและบุคคลที่ออกแบบระบบทั้งหมดไม่พบ ฉันได้สร้างไดอะแกรม ER แล้วเพื่อช่วยให้ฉันเข้าใจความสัมพันธ์ แต่เนื่องจากฉันไม่เคยมีประสบการณ์ในการจัดการฐานข้อมูลฉันจึงไม่ทราบว่าจะเริ่มต้นอย่างไร ฉันขอโทษด้วยถ้าคำถามแบบนี้ไม่ได้ถูกถามที่นี่

1
ปัญหาในการสร้างธุรกรรมในแพ็คเกจ SSIS
ฉันกำลังทำงานกับแพ็คเกจที่ต้องใช้ธุรกรรม แต่ขณะนี้ฉันได้รับข้อผิดพลาดต่อไปนี้: SSIS package "CATS-Package.dtsx" starting. Information: 0x4004300A at Data Flow Task, SSIS.Pipeline: Validation phase is beginning. Information: 0x4001100A at CATS-Package: Starting distributed transaction for this container. Error: 0xC001401A at CATS-Package: The SSIS Runtime has failed to start the distributed transaction due to error 0x8004D01B "The Transaction Manager is not …

2
วิธีที่ดีที่สุดในการรีเฟรชเพียงไม่กี่ตารางในฐานข้อมูลทดสอบจากการผลิตคืออะไร
ฉันมีฐานข้อมูลการผลิตขนาดใหญ่มากและฐานข้อมูลสภาพแวดล้อมการทดสอบขนาดใหญ่มากใน SQL Server 2008R2 ฐานข้อมูลทั้งสองมีโครงสร้างตารางที่คล้ายกัน แต่ผู้ใช้ / การเข้าสู่ระบบ / สิทธิ์ / บทบาทที่แตกต่างกัน ฉันต้องการรีเฟรชเพียงไม่กี่ตารางในฐานข้อมูลการทดสอบเป็นระยะ ๆ จากการผลิตประมาณเดือนละครั้ง วิธีปัจจุบันที่ฉันวางแผนจะทำคือ ใช้ยูทิลิตี้ BCP เพื่อทำการส่งออกตารางที่ฉันต้องการจากการผลิต คัดลอกไฟล์ส่งออก bcp ไปยังเซิร์ฟเวอร์ทดสอบ ปิดการใช้งานดัชนีและข้อ จำกัด ในตารางทั้งหมดที่ฉันรีเฟรชในการทดสอบ ตัดทอนตารางฐานข้อมูลทดสอบ โหลดข้อมูลกลับเข้าไปในตารางฐานข้อมูลทดสอบโดยใช้ BCP สร้างดัชนีใหม่และเปิดใช้งานข้อ จำกัด ในการทดสอบอีกครั้ง ทั้งหมดนี้ดูเหมือนจะซับซ้อนเกินไปสำหรับงานเล็ก ๆ น้อย ๆ ดูเหมือนว่าจะสร้างการทำซ้ำจำนวนมาก (ใน t-log) มีวิธีที่ดีกว่าในการทำเช่นนี้หรือไม่? อีกวิธีที่ฉันคิดว่าทำเช่นนี้คือการคืนค่าการสำรองข้อมูลจากการผลิตสู่สภาพแวดล้อมการทดสอบ - แต่ปัญหาที่ฉันมีคือการสำรองข้อมูลเต็มรูปแบบจะมีขนาดค่อนข้างใหญ่และฉันไม่ต้องการให้ทุกตารางทำการรีเฟรช - และผู้ใช้และความปลอดภัยในฐานข้อมูลการผลิตแตกต่างจากการทดสอบ ที่จะถูกเขียนทับโดยการตั้งค่าความปลอดภัยในฐานข้อมูลการผลิตถ้าฉันคืนค่าฐานข้อมูลทั้งหมด

3
การทำความเข้าใจผลกระทบ / ความเสี่ยงของการปิด“ ตรวจสอบความถูกต้องของข้อมูลสำรอง” ในการสำรองข้อมูล SQL
ขณะนี้เราใช้แผนการบำรุงรักษามาตรฐานสำหรับการสำรองข้อมูลบนเซิร์ฟเวอร์ SQL Server 2005/2008 / 2008R2 / 2012 ในสภาพแวดล้อมของเราและมีการทำเครื่องหมายในช่อง "ตรวจสอบความถูกต้องของการสำรองข้อมูลที่สมบูรณ์" การสำรองข้อมูลบางอย่างใช้เวลานานมากดังนั้นฉันแนะนำให้ปิดตัวเลือกนั้น แต่ฝ่ายบริหารต้องการให้ฉันบันทึกผลกระทบและความเสี่ยงของการเปลี่ยนแปลงนี้ ฉันเข้าใจการใช้งานและประวัติของตัวเลือกนี้ดูเหมือนว่าไม่จำเป็นสำหรับฉันที่จะเพิ่มเวลาเป็นสองเท่าสำหรับงานสำรองเมื่อ (ในความคิดของฉัน) ข้อผิดพลาดใด ๆ ที่อาจเกิดขึ้นจะเกิดขึ้นในระหว่างขั้นตอนการสำรองข้อมูล ฉันผิดหรือเปล่า? เป็นความเสี่ยงเพียงเล็กน้อยในการปิดการทำงานนี้หากฉันสำรองข้อมูลไว้ในดิสก์และไม่ทำการสตรีมเทปหรือบางสิ่งบางอย่าง (เราสำรองข้อมูลผ่านเครือข่ายไปยังอุปกรณ์สำรองข้อมูล EMC DD-800 หากมีความเกี่ยวข้อง) มีคำแนะนำอย่างเป็นทางการของ MS สำหรับเมื่อใดที่ปลอดภัยที่จะปิด คุณเรียกใช้ "ยืนยัน" ในการสำรองข้อมูลทุกครั้งในระบบของคุณหรือไม่? คุณตรวจสอบพวกเขาหรือไม่ แก้ไข : เพื่อชี้แจงเมื่อคุณทำเครื่องหมายที่ "ตรวจสอบความถูกต้องสำรองข้อมูล" ในแผนการบำรุงรักษา SQL จะทำการคืนค่าข้อมูลทั้งหมดในฐานข้อมูลแต่ละรายการทันทีหลังจากการสำรองข้อมูลแต่ละครั้ง นี่เป็นเพียงข้อมูล / IO มากเช่นเดียวกับการสำรองข้อมูลดั้งเดิมและ (โดยทั่วไป) จะเพิ่มเวลาโดยรวมของงานสำรองเป็นสองเท่า นี่ไม่เหมือนกับการเปิดใช้งานตัวเลือก "checksum" ในการสำรองข้อมูล (ซึ่งไม่สามารถทำได้ในตัวช่วยสร้างเท่าที่ฉันรู้)

2
แบบสอบถามที่ใดที่จะตรวจสอบการเปรียบเทียบที่ง่ายกว่า (เช่นบิต) ก่อนที่จะทำการเปรียบเทียบที่ยากขึ้น (เช่น varchar)
ถ้าฉันเขียนแบบสอบถามที่มีWHEREคำสั่งผสมเช่น: SELECT * FROM MyTable WHERE BitField = 1 AND VarcharField = 'asdf' และการรวมbitการเปรียบเทียบนั้นเพียงแค่แยกฟิลด์เดียวกันที่การvarcharเปรียบเทียบจะแยกออกการมีอยู่ของbitการเปรียบเทียบฟิลด์นั้นจะทำให้ฉันปรับปรุงประสิทธิภาพได้หรือไม่

2
ทำไมส่วนคำสั่ง WHERE ของฉันจึงได้รับประโยชน์จากคอลัมน์ "รวม"
ตามคำตอบนี้เว้นแต่ว่าดัชนีจะถูกสร้างขึ้นเหนือคอลัมน์ที่ใช้ในการ จำกัด การสืบค้นจะไม่ได้รับประโยชน์จากดัชนี ฉันมีคำจำกัดความนี้: CREATE TABLE [dbo].[JobItems] ( [ItemId] UNIQUEIDENTIFIER NOT NULL, [ItemState] INT NOT NULL, [ItemPriority] INT NOT NULL, [CreationTime] DATETIME NULL DEFAULT GETUTCDATE(), [LastAccessTime] DATETIME NULL DEFAULT GETUTCDATE(), -- other columns ); CREATE UNIQUE CLUSTERED INDEX [JobItemsIndex] ON [dbo].[JobItems]([ItemId] ASC); GO CREATE INDEX [GetItemToProcessIndex] ON [dbo].[JobItems]([ItemState], [ItemPriority], [CreationTime]) …

4
การรวบรวมข้อมูลจากตารางที่แตกต่างกันเป็นแบบฝึกหัดหรือไม่
พื้นหลัง ฉันเขียนรายงานขนาดใหญ่จำนวนมากและโดยทั่วไปแล้วรักษาฐานข้อมูลสุขภาพขนาดใหญ่ (เขียน SP, ฟังก์ชั่น, งาน, ฯลฯ ) สคีมาดั้งเดิมและซอฟต์แวร์ที่ใช้นั้นมาจากผู้จำหน่ายรายอื่นดังนั้นฉันจึงไม่สามารถเปลี่ยนแปลงโครงสร้างได้มากนัก มีบันทึกมากมายที่ต้องมีการติดตามเช่นห้องปฏิบัติการขั้นตอนวัคซีน ฯลฯ และพวกมันกระจัดกระจายไปทั่วโต๊ะหลายสิบแห่งซึ่งหลายแห่งถูกป่องและจัดทำดัชนีไม่ดี (ฉันสามารถแก้ไขปัญหานี้ได้บ้าง) ปัญหา ปัญหาคือเนื่องจากเรามีการควบคุม DB น้อยและเนื่องจากสามารถเปลี่ยนแปลงได้จากการอัพเดทหรือแพทช์ใด ๆ ทำให้การเขียนและการบำรุงรักษารายงานเหล่านี้ยากและน่าเบื่อโดยเฉพาะอย่างยิ่งเมื่อมีการทับซ้อนกันจำนวนมาก สิ่งที่ต้องทำคือแพทช์เดียวและฉันติดเขียนส่วนใหญ่ของรายงานโหล นอกจากนี้เคียวรีกลายเป็นสับสนและช้าลงเมื่อการรวมซ้อนเลือกและซ้อนกัน "ทางออก" ของฉัน แผนของฉันคือการเขียนระเบียนทั้งหมดเหล่านี้ลงในตาราง "catch-all" หนึ่งตารางและเขียนทริกเกอร์บนตารางดั้งเดิมเพื่อรักษาระเบียนในตารางรวมนี้ แน่นอนฉันต้องมั่นใจว่าตัวกระตุ้นของฉันยังคงอยู่หลังจากการอัพเดต แต่จะง่ายกว่ามากจากมุมมองการบำรุงรักษาและเพียงแค่อ้างอิงข้อมูล ตารางจะบางและยาวเก็บเฉพาะข้อมูลที่ต้องการเช่นนี้: CREATE TABLE dbo.HCM_Event_Log ( id INT IDENTITY, type_id INT NULL, orig_id VARCHAR(36) NULL, patient_id UNIQUEIDENTIFIER NOT NULL, visit_id UNIQUEIDENTIFIER NULL, lookup_id …

2
ทำไมฉันไม่เห็นตารางของฉัน (PostgreSQL) เมื่อฉันใช้ \ dt (+) ภายใน psql
ฉันได้สร้างตารางdonorในสคีมาreferenceตาม: CREATE TABLE reference.donor ( donor_code smallint PRIMARY KEY, donor_name character varying NOT NULL, donor_type smallint REFERENCES reference.donor_type (type_id), alpha_2_code char(2) REFERENCES reference.iso_3166_1 (alpha_2_code) ); ฉันเติมตารางตาม: INSERT INTO reference.donor (donor_code, donor_name, donor_type, alpha_2_code) SELECT donor_code, donor_name, donor_type, alpha_2_code FROM reference.donor_template; เมื่อฉันวิ่ง: \dt+ reference.* ภายใน psql ฉันเห็นreference.donorตาราง: List of relations Schema …

1
ทำไมการติดตั้ง SQL Server ถึงรูทของไดรฟ์จึงเป็นสิ่งที่ไม่ดี
เมื่อฉันติดตั้ง SQL Server ลงในรากของไดรฟ์ของฉันตัวอย่างเช่นD:\ฉันได้รับข้อผิดพลาดเมื่อฉันเรียกใช้โปรแกรมปรับใช้ฐานข้อมูลจากซอฟต์แวร์ของบุคคลที่สาม แต่เมื่อฉันย้ายอินสแตนซ์ SQL Server ของฉันไปที่D:\SQL\(ย้ายไปยังโฟลเดอร์ภายในไดรฟ์) การติดตั้งก็ทำงานได้อย่างสมบูรณ์ คำถามของฉันไม่เกี่ยวกับตัวปรับใช้ฐานข้อมูล แต่เหตุผลที่ว่าทำไม SQL จะมีปัญหาในการติดตั้งลงในรากของไดรฟ์ นี่คือการปฏิบัติที่ไม่ดีหรือไม่? ทำไมฉันไม่ควรติดตั้ง SQL Server ไปยังรากของไดรฟ์ของฉัน

2
เคยตกลงที่จะไม่ทดสอบคุณสมบัติหรือไม่?
มีจุดใดบ้างที่คุณคุ้นเคยกับภาษา / ฐานข้อมูล / ระบบของคุณซึ่งไม่จำเป็นต้องทดสอบคุณสมบัติใหม่ / การกำหนดค่า / แบบสอบถาม / ฯลฯ โดยการทดสอบแบบมีอยู่ / จำลองก่อนนำมาใช้ในระบบของคุณ (โดยเฉพาะเกี่ยวกับคุณสมบัติที่แก้ไขข้อมูล) หรือมันเป็นเสมอที่สำคัญในการทดสอบแบบสอบถามใหม่โดยการจำลองในสภาพแวดล้อมการทดสอบ ? หากต้องการระบุเพิ่มเติมเป็นที่ชัดเจนว่าปลอดภัยที่สุดเสมอที่จะทดสอบ อย่างไรก็ตามมีวิธีการพิจารณาว่าเมื่อใดที่ความเสี่ยงมีน้อยมากจนการทดสอบนั้นไม่คุ้มค่ากับความพยายาม? อีกวิธีหนึ่งของการใช้ถ้อยคำที่: เมื่อหรือมันคือเคยเป็นมืออาชีพทางปฏิบัติที่จะใช้ความเสี่ยงในการดำเนินการวัดคุณลักษณะหรือไม่ นอกจากนี้สมมติว่าทุกอย่างมีการสำรองข้อมูลดังนั้นกรณีที่เลวร้ายที่สุดข้อมูลอาจถูกกู้คืนด้วยความพยายาม ใครบางคนสามารถกล่าวถึงประสบการณ์ที่เชี่ยวชาญและเฉพาะเจาะจงเพื่อแก้ไขปัญหานี้ได้? โปรดรวมการอ้างอิงตามความเหมาะสม / เป็นไปได้

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