คำถามติดแท็ก database-internals

สำหรับคำถามทางเทคนิคเกี่ยวกับการทำงานภายในของเอ็นจินฐานข้อมูล

2
เหตุใดตารางอุณหภูมิจึงเป็นโซลูชันที่มีประสิทธิภาพมากขึ้นสำหรับปัญหาฮาโลวีนมากกว่าตัวหลอดที่กระตือรือร้น
พิจารณาแบบสอบถามต่อไปนี้ที่แทรกแถวจากตารางต้นฉบับเฉพาะเมื่อยังไม่ได้อยู่ในตารางเป้าหมาย: INSERT INTO dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR WITH (TABLOCK) SELECT maybe_new_rows.ID FROM dbo.A_HEAP_OF_MOSTLY_NEW_ROWS maybe_new_rows WHERE NOT EXISTS ( SELECT 1 FROM dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR halloween WHERE maybe_new_rows.ID = halloween.ID ) OPTION (MAXDOP 1, QUERYTRACEON 7470); รูปร่างแผนหนึ่งที่เป็นไปได้รวมถึงการรวมการผสานและสปูลที่กระตือรือร้น ผู้ประกอบการสปูลกระตือรือร้นที่จะนำเสนอเพื่อแก้ปัญหาฮาโลวีน : บนเครื่องของฉันรหัสด้านบนจะทำงานในเวลาประมาณ 6900 มิลลิวินาที รหัส Repro เพื่อสร้างตารางรวมอยู่ที่ด้านล่างของคำถาม หากฉันไม่พอใจกับการแสดงฉันอาจลองโหลดแถวเพื่อแทรกลงในตารางชั่วคราวแทนการใช้สปูลกระตือรือร้น การดำเนินการหนึ่งที่เป็นไปได้มีดังนี้: DROP TABLE IF EXISTS #CONSULTANT_RECOMMENDED_TEMP_TABLE; CREATE TABLE #CONSULTANT_RECOMMENDED_TEMP_TABLE ( …

4
ดัชนีค่าใช้จ่ายที่ไม่ซ้ำกัน
ฉันได้มีการถกเถียงอย่างต่อเนื่องกับนักพัฒนาหลายคนในสำนักงานของฉันเกี่ยวกับค่าใช้จ่ายของดัชนีและความเป็นเอกลักษณ์หรือไม่นั้นมีประโยชน์หรือมีค่าใช้จ่ายสูง (อาจเป็นได้ทั้งสองอย่าง) ปมของปัญหาคือทรัพยากรการแข่งขันของเรา พื้นหลัง ก่อนหน้านี้ฉันได้อ่านการสนทนาที่ระบุว่าUniqueดัชนีนั้นไม่มีค่าใช้จ่ายเพิ่มเติมในการบำรุงรักษาเนื่องจากการInsertดำเนินการโดยปริยายจะตรวจสอบว่าตรงกับต้นไม้ B หรือไม่และหากพบซ้ำในดัชนีที่ไม่ซ้ำใคร จุดสิ้นสุดของคีย์ แต่อย่างอื่นแทรกโดยตรง ในลำดับเหตุการณ์นี้Uniqueดัชนีไม่มีค่าใช้จ่ายเพิ่มเติม ผู้ร่วมงานของฉันต่อสู้กับแถลงการณ์นี้โดยกล่าวว่าการUniqueบังคับใช้เป็นการดำเนินการครั้งที่สองหลังจากการค้นหาตำแหน่งใหม่ในต้นไม้ B และทำให้ค่าใช้จ่ายในการบำรุงรักษาสูงกว่าดัชนีที่ไม่ซ้ำใคร ที่แย่ที่สุดฉันได้เห็นตารางที่มีคอลัมน์ข้อมูลประจำตัว (ไม่ซ้ำกันโดยเนื้อแท้) นั่นคือคีย์การทำคลัสเตอร์ของตาราง แต่ระบุไว้อย่างชัดเจนว่าไม่ซ้ำกัน ในอีกด้านหนึ่งของความเลวร้ายที่สุดคือการครอบงำจิตใจของฉันด้วยเอกลักษณ์และดัชนีทั้งหมดจะถูกสร้างขึ้นเป็นเอกลักษณ์และเมื่อไม่สามารถกำหนดความสัมพันธ์ที่ไม่ซ้ำกันอย่างชัดเจนกับดัชนีฉันผนวก PK ของตารางไปยังจุดสิ้นสุดของดัชนีเพื่อรับรอง รับประกันความเป็นเอกลักษณ์ ฉันมีส่วนร่วมในการตรวจสอบโค้ดสำหรับทีม dev บ่อยครั้งและฉันต้องสามารถให้แนวทางทั่วไปเพื่อให้พวกเขาทำตาม ใช่ทุกดัชนีควรได้รับการประเมิน แต่เมื่อคุณมีเซิร์ฟเวอร์ห้าตัวที่มีตารางนับพันแต่ละตัวและมากถึงยี่สิบดัชนีในตารางคุณจะต้องสามารถใช้กฎง่าย ๆ เพื่อรับประกันคุณภาพในระดับหนึ่ง คำถาม เอกลักษณ์มีค่าใช้จ่ายเพิ่มเติมที่ส่วนท้ายของการInsertเปรียบเทียบกับค่าใช้จ่ายในการบำรุงรักษาดัชนีที่ไม่ซ้ำหรือไม่? ประการที่สองมีอะไรผิดปกติในการผนวกคีย์หลักของตารางต่อท้ายดัชนีเพื่อให้แน่ใจว่ามีเอกลักษณ์? ตัวอย่างคำจำกัดความของตาราง create table #test_index ( id int not null identity(1, 1), dt datetime not null default(current_timestamp), val varchar(100) not …

2
ในการค้นหาข้อมูลภายในของ FILESTREAM
เมื่อฟีเจอร์ FILESTREAM เปิดใช้งานบน Microsoft SQL Server 2012 SQL Server จะสร้างการแชร์ "ที่ซ่อนอยู่" บนระบบ การแบ่งปันถูกกำหนดดังนี้: Sharename FILESTREAM_SHARE Path \\?\GLOBALROOT\Device\RsFx0320\<localmachine>\FILESTREAM_SHARE Remark SQL Server FILESTREAM share Maximum users unlimited Users Caching Manual caching of documents Permissions NT-AUTHORITY\Authenticated Users, FULL ชื่อที่เป็นชื่อของหุ้นที่คุณให้เมื่อเริ่มแรกการกำหนดค่า FILESTREAM ในการกำหนดค่าเซิร์ฟเวอร์ SQL ผู้จัดการ แต่มันมีไว้เพื่ออะไร? จนถึงตอนนี้ ฉันอ่านเอกสาร FILESTREAM ทั้งหมดที่มีอยู่เริ่มต้นที่: FILESTREAM (เซิร์ฟเวอร์ SQL) เปิดใช้งานและกำหนดค่า FILESTREAM …

2
ทำไม MySQL อนุญาตให้มีการใช้นามแฝง SELECT?
ใน SQL เท่าที่ฉันรู้ลำดับการประมวลผลแบบสอบถามตรรกะซึ่งเป็นลำดับการตีความแนวคิดเริ่มต้นด้วย FROM ด้วยวิธีดังต่อไปนี้: จาก WHERE จัดกลุ่มตาม การมี เลือก สั่งโดย การติดตามรายการนี้เป็นเรื่องง่ายที่จะดูว่าทำไมคุณไม่สามารถเลือกชื่อแทนในส่วนคำสั่ง WHERE เนื่องจากยังไม่ได้สร้างชื่อแทน T-SQL (SQL Server) ทำตามสิ่งนี้อย่างเคร่งครัดและคุณไม่สามารถใช้นามแฝง SELECT ได้จนกว่าคุณจะผ่าน SELECT แต่ใน MySQL มันเป็นไปได้ที่จะใช้นามแฝง SELECT ในส่วนคำสั่ง HAVING แม้ว่ามันควรจะดำเนินการก่อน สิ่งนี้จะเป็นไปได้อย่างไร เพื่อให้ตัวอย่าง: SELECT YEAR(orderdate), COUNT(*) as Amount FROM Sales.Orders GROUP BY YEAR(orderdate) HAVING Amount>1; คำสั่งไม่ถูกต้องใน T-SQL (เนื่องจาก HAVING อ้างถึงนามแฝง SELECT Amount) ... …

1
วิธีการจำลองสถานะหน่วยความจำต่ำเมื่อเรียกใช้แบบสอบถาม
ฉันพยายามที่จะเข้าใจวิธีการทำงานของโปรแกรมการทำงานของ SQL Server ให้ดีขึ้นในสถานะหน่วยความจำต่ำ พูดในแง่ของเงินอุดหนุนหน่วยความจำผมสงสัยว่าถ้ามีวิธีที่จะบังคับให้บางส่วนจะเท่ากับGrantedMemory RequiredMemory(ฉันเดาว่ามีสถานะการติดตามที่ไม่มีเอกสารซึ่งจะทำอย่างนั้นใครรู้ว่ามันคืออะไร?)

1
สิ่งที่ทำให้ SQL Server แลกเปลี่ยนชื่อวัตถุสำหรับสตริงที่ส่งผ่านไปยังโพรซีเดอร์ระบบ
สิ่งที่ทำให้มันถูกต้องตามกฎหมายที่จะส่งชื่อวัตถุที่จะขั้นตอนของระบบที่เก็บไว้sp_helptext? กลไกใดที่แปลงชื่อวัตถุเป็นสตริง เช่น -- works sp_helptext myproc sp_helptext [myproc] sp_helptext [dbo.myproc] -- and behaves the same as a string sp_helptext 'myproc' sp_helptext 'dbo.myproc' -- does not work sp_helptext dbo.myproc -- Msg 102, Level 15, State 1, Line 1 incorrect syntax near '.' -- an additional case that does not work. …

2
การย้อนกลับของ SQL Server ทั้งสองนี้แตกต่างกันอย่างไร
ใน SQL Server 2008 R2 การย้อนกลับสองแบบนี้แตกต่างกันอย่างไร: เรียกใช้ALTERคำสั่งสักครู่แล้วกด 'ยกเลิกการดำเนินการ' ใช้เวลาสองสามนาทีในการย้อนกลับอย่างสมบูรณ์ เรียกใช้ALTERคำสั่งเดียวกันแต่ให้แน่ใจว่าLDFไฟล์นั้นไม่ใหญ่พอที่จะทำให้สำเร็จ เมื่อถึงLDFขีด จำกัด และไม่อนุญาตให้ 'autogrowth' การประมวลผลแบบสอบถามจะหยุดทันที (หรือย้อนกลับเกิดขึ้น) พร้อมกับข้อความแสดงข้อผิดพลาดนี้: The statement has been terminated. Msg 9002, Level 17, State 4, Line 1 The transaction log for database 'SampleDB' is full. To find out why space in the log cannot be reused, see …

1
Array ของช่องและขนาดหน้าทั้งหมด
ฉันอ่านต่อในฟอรัมจำนวนมากและในหลาย ๆ บล็อกที่หน้าประกอบด้วยดังต่อไปนี้: ขนาดหน้า: 16 x 512B = 8192B ส่วนหัวของหน้า: = 96B แถว In_Row สูงสุด: = 8060B ใบนี้ (8192 - 96 - 8060) B = 36B ตกลงนี่เป็นตรรกะและถูกต้อง คำถามที่ฉันมีคือ: ทำไมผู้คนมากมายพูดว่า 36B ที่เหลือถูกสงวนไว้สำหรับอาร์เรย์สล็อต? เห็นได้ชัดว่าอาร์เรย์สล็อตให้ 2B ต่อแถวในหน้า; ดังนั้นอาจเล็กเพียง 2B และใหญ่ถึง 1472B: 2B: 1 แถว * 2B = 2B 1472B: 8096B = n * …

1
เหตุใดข้อความค้นหาที่คล้ายกันเหล่านี้จึงใช้ขั้นตอนการเพิ่มประสิทธิภาพที่แตกต่างกัน (การประมวลผลธุรกรรมกับแผนด่วน)
รหัสตัวอย่างในรายการเชื่อมต่อนี้ แสดงข้อบกพร่องที่ SELECT COUNT(*) FROM dbo.my_splitter_1('2') L1 INNER JOIN dbo.my_splitter_1('') L2 ON L1.csv_item = L2.csv_item ส่งคืนผลลัพธ์ที่ถูกต้อง แต่ผลลัพธ์ต่อไปนี้จะส่งกลับผลลัพธ์ที่ไม่ถูกต้อง (เมื่อปี 2014 โดยใช้เครื่องมือประมาณการ Cardinality ใหม่) SELECT (SELECT COUNT(*) FROM dbo.my_splitter_1('2') L1 INNER JOIN dbo.my_splitter_1('') L2 ON L1.csv_item = L2.csv_item) เนื่องจากมันโหลดผลลัพธ์อย่างไม่ถูกต้องสำหรับ L2 ลงในสปูลนิพจน์ย่อยทั่วไปจากนั้นรีเพลย์ผลลัพธ์ของผลลัพธ์นั้นสำหรับผลลัพธ์ L1 ฉันอยากรู้ว่าทำไมความแตกต่างของพฤติกรรมระหว่างสองข้อความค้นหา Trace ธง 8675 แสดงให้เห็นว่าคนที่ทำงานเข้ามาและเป็นคนที่ไม่เข้าsearch(0) - transaction processingsearch(1) - quick …

1
เหตุใดกระแสรวมนี้จึงมีความจำเป็น
ลองดูคำถามนี้ มันค่อนข้างง่าย (ดูจุดสิ้นสุดของการโพสต์สำหรับคำจำกัดความของตารางและดัชนีและสคริปต์ที่ซ้ำกัน): SELECT MAX(Revision) FROM dbo.TheOneders WHERE Id = 1 AND 1 = (SELECT 1); หมายเหตุ: "AND 1 = (SELECT 1) เพียงเพื่อป้องกันไม่ให้มีการกำหนดพารามิเตอร์อัตโนมัติซึ่งฉันรู้สึกว่าสับสนปัญหา - จริง ๆ แล้วได้รับแผนเดียวกันโดยมีหรือไม่มีประโยคนั้นแม้ว่า และนี่คือแผน ( วางลิงก์แผน) : เนื่องจากมี "อันดับ 1" อยู่ที่นั่นฉันรู้สึกประหลาดใจที่เห็นผู้ดำเนินการรวมสตรีม ไม่จำเป็นสำหรับฉันเนื่องจากมีการรับประกันว่าจะมีแถวเดียวเท่านั้น เพื่อทดสอบทฤษฎีนั้นฉันลองใช้เคียวรีที่มีเหตุผลเชิงตรรกะนี้: SELECT MAX(Revision) FROM dbo.TheOneders WHERE Id = 1 GROUP BY Id; นี่คือแผนสำหรับแผนนั้น ( …

1
SQL Server เก็บค่าความเป็นตัวตนของตารางไว้ที่ใด
ฉันหวังว่าบางคนสามารถชี้ฉันไปในทิศทางที่ถูกต้องในอันนี้ นี่คือผลงานของฉันจนถึงตอนนี้ SELECT * FROM sys.identity_columnsคือมุมมองระบบที่ให้ "last_value" แต่คำจำกัดความสำหรับมุมมองนั้นใช้ฟังก์ชันภายในIdentityProperty(colName, 'LastValue')- นั่นคือจุดสิ้นสุด (ไม่ดึงออกจากตารางระบบที่นั่น) ทุกที่ (ฉันดู) บนอินเทอร์เน็ตแนะนำให้ใช้DBCC IDENT_...คำสั่งเพื่อเปิดเผยค่า แต่ก็ยังทำให้ฉันอยู่ในที่มืดราวกับว่ามันถูกเก็บไว้ที่ไหน ดังนั้นฉันมาถึงการค้นหาหน้าเว็บแต่ละหน้าพร้อมDBCC PAGE(TestDB,1,1325,3)กับชุดทดสอบฐานข้อมูลของฉันและการใช้RESEEDคำสั่งเพื่อดำเนินการระหว่างค่า 10 และ 12 ในการนี้ผมสังเกตเห็นค่าฐานสิบหกบนIAM: Header, IAM: Single Page AllocationsและIAM: Extent Alloc Status Slot 1การเปลี่ยนแปลงทั้งหมด (และตระหนักว่าพวกเขามีการเปลี่ยนแปลงเป็นระยะอยู่แล้วพร้อมกับค่าbUse1ซึ่งการเปลี่ยนแปลงที่เพิ่มขึ้นด้วยตัวเองเช่นกัน) ดังนั้นจุดจบอื่นและฉันหมดความคิด ฉันสามารถค้นหาได้ที่ไหน ฉันใช้ SQL Server 2014 ฉันมีความกระหายที่ไม่รู้จักพอสำหรับความรู้ภายในและยังไม่เจออะไรที่เข้าใจยากเช่นนี้ มันดึงดูดความสนใจของฉันได้เพราะในทางทฤษฎีแล้วมัน (ค่าสัมบูรณ์) ถูกเก็บไว้ที่ไหนสักแห่งและควรระบุตำแหน่ง (เนื้อหา) ในการสืบเสาะหาที่ตั้งของข้อมูล / เมตาดาต้าที่เก็บไว้ภายในค่านี้จะทำให้ฉันเข้าใจยากเป็นพิเศษ ฉันคาดเดา / หวังว่าจะมีใครบางคนเข้ามาและบอกฉันคุณสามารถเอามันไปด้วยDBCC …

3
การต่อข้อมูลทางกายภาพ: รับประกันการดำเนินการตามคำสั่งหรือไม่?
ใน SQL มาตรฐานผลลัพธ์ของ a union allไม่ได้รับประกันว่าจะอยู่ในลำดับใด ๆ ดังนั้นสิ่งที่ชอบ: select 'A' as c union all select 'B' สามารถส่งคืนสองแถวในลำดับใดก็ได้ (แม้ว่าในทางปฏิบัติในฐานข้อมูลใด ๆ ที่ฉันรู้ว่า 'A' จะมาก่อน 'B') ใน SQL Server สิ่งนี้จะเปลี่ยนเป็นแผนการดำเนินการโดยใช้การดำเนินการทางกายภาพ "การต่อข้อมูล" ฉันนึกภาพออกได้ง่ายว่าการดำเนินการเรียงต่อกันจะสแกนอินพุตของมันคืนสิ่งที่อินพุตมีบันทึกไว้ อย่างไรก็ตามฉันพบข้อความต่อไปนี้บนเว็บ ( ที่นี่ ): ตัวประมวลผลข้อความค้นหาจะดำเนินการตามแผนนี้ตามลำดับที่ผู้ให้บริการปรากฏในแผนข้อแรกคืออันดับแรกและรายการสุดท้ายคือรายการสุดท้าย คำถาม: จริงหรือไม่ในทางปฏิบัติ สิ่งนี้รับประกันได้ว่าเป็นจริงหรือไม่? ฉันไม่พบการอ้างอิงใด ๆ ในเอกสารประกอบของ Microsoft ที่อินพุตถูกสแกนตามลำดับตั้งแต่ครั้งแรกถึงครั้งสุดท้าย ในทางกลับกันเมื่อใดก็ตามที่ฉันพยายามเรียกใช้ผลลัพธ์แนะนำว่าอินพุตนั้นถูกประมวลผลตามลำดับ มีวิธีที่จะทำให้กระบวนการของเครื่องยนต์มากกว่าหนึ่งอินพุตในแต่ละครั้งหรือไม่? การทดสอบของฉัน (โดยใช้นิพจน์ที่ซับซ้อนกว่าค่าคงที่) อยู่ในเครื่อง 8-core ที่เปิดใช้งานแบบขนานและการสืบค้นส่วนใหญ่จะใช้ประโยชน์จากความขนาน

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 …

2
ฐานข้อมูลสำหรับการค้นหารวมช่วงที่มีประสิทธิภาพ?
เป็นตัวอย่างแบบง่ายสมมติว่าฉันมีตารางเช่นนี้ seq | value ----+------ 102 | 11954 211 | 43292 278 | 19222 499 | 3843 ตารางอาจมีหลายร้อยล้านระเบียนและฉันต้องทำแบบสอบถามบ่อยเช่นนี้: SELECT sum(value) WHERE seq > $a and seq < $b แม้ว่าseqจะมีการจัดทำดัชนีการใช้ฐานข้อมูลทั่วไปจะวนซ้ำแต่ละแถวเพื่อคำนวณผลรวมในกรณีที่ดีที่สุดO(n)โดยที่nขนาดของช่วงนั้นอยู่ที่ใด มีฐานข้อมูลใดบ้างที่สามารถทำได้อย่างมีประสิทธิภาพเช่นเดียวกับในO(log(n))แบบสอบถามต่อ? ฉันได้เจอโครงสร้างข้อมูลที่เรียกว่า Segment ต้นไม้ตามที่อธิบายไว้ที่นี่ บางครั้งก็เรียกว่าช่วงต้นไม้หรือช่วงต้นไม้แม้ว่าชื่อเหล่านี้มักจะอธิบายว่าเป็นรูปแบบที่แตกต่างกันเล็กน้อยของโครงสร้างข้อมูล อย่างไรก็ตามฉันยังไม่เจอฐานข้อมูลใด ๆ ที่ใช้โครงสร้างข้อมูลดังกล่าว การนำไปใช้ตั้งแต่เริ่มต้นนั้นเป็นเรื่องง่ายสำหรับโครงสร้างในหน่วยความจำ แต่จะยุ่งยากหากต้องคงไว้หรือมีขนาดใหญ่เกินไปที่จะใส่ลงในหน่วยความจำ หากมีรูปแบบที่มีประสิทธิภาพสำหรับการนำไปใช้งานด้านบนของฐานข้อมูลที่มีอยู่นั่นอาจช่วยได้เช่นกัน หมายเหตุด้านข้าง: นี่ไม่ใช่ตารางต่อท้ายเท่านั้นดังนั้นโซลูชันเช่นการรักษายอดรวมสะสมจะไม่ทำงานในกรณีนี้

2
ทำไมการวนซ้ำซ้อนกันจึงสนับสนุนเฉพาะการรวมซ้ายเท่านั้น
ในบล็อกของ Craig Freedman เข้าร่วม Nested Loops Joinเขาอธิบายว่าทำไมการเข้าร่วม loops แบบซ้อนไม่สามารถรองรับการเข้าร่วมด้านนอกที่ถูกต้อง: ปัญหาคือเราสแกนตารางด้านในหลาย ๆ ครั้ง - หนึ่งครั้งสำหรับแต่ละแถวของการรวมภายนอก เราอาจพบแถวภายในเดียวกันหลายครั้งในระหว่างการสแกนหลายครั้ง เราสามารถสรุปได้ว่าจุดภายในแถวใดแถวหนึ่งไม่ได้หรือจะไม่เข้าร่วม? ใครช่วยอธิบายสิ่งนี้ด้วยวิธีที่ง่ายและให้ความรู้ได้จริงหรือ? หมายความว่าการวนรอบเริ่มต้นด้วยตารางด้านนอก ( R1) และการสแกนด้านใน ( R2) หรือไม่ ฉันเข้าใจว่าสำหรับR1ค่าที่ไม่ได้เข้าร่วมR2ควรแทนที่ด้วยNULLชุดผลลัพธ์จึงกลายเป็น ( NULL, R2) สำหรับฉันดูเหมือนว่าเป็นไปไม่ได้ที่จะคืนR2ค่าเมื่อR1ไม่ได้เข้าร่วมด้วยเหตุผลที่ไม่สามารถรู้ว่าR2จะคืนค่าใด แต่นั่นไม่ใช่วิธีที่อธิบาย หรือมันคืออะไร? ในความเป็นจริง SQL Server จะปรับให้เหมาะสม (และมักจะแทนที่) RIGHT JOINด้วยLEFT JOINแต่คำถามคือเพื่ออธิบายว่าทำไมมันเป็นไปไม่ได้ทางเทคนิคสำหรับตรรกะNESTED LOOPS JOINการใช้งาน / การสนับสนุนRIGHT JOIN

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