การแก้ไขข้อผิดพลาด “มีตารางมากเกินไป” ในคำสั่งค้นหาของ SQL Server
คุณเคยเขียนคำสั่ง SQL แล้วพบว่ามันไม่สามารถทำงานได้เนื่องจากการอ้างอิงตารางมากเกินไปหรือไม่? นี่อาจเป็นปัญหาที่น่าหงุดหงิดสำหรับผู้ดูแลฐานข้อมูลและนักพัฒนา โดยเฉพาะเมื่อทำงานกับชุดข้อมูลขนาดใหญ่ ในโพสต์นี้ เราจะมาดูข้อความผิดพลาดที่เกิดขึ้นโดย SQL Server เมื่อมีการอ้างอิงตารางมากเกินไป และฉันจะแบ่งปันวิธีแก้ปัญหาที่มีประสิทธิภาพเพื่อจัดการกับความท้าทายนี้อย่างมีประสิทธิภาพ
การเข้าใจปัญหา
SQL Server มีขีดจำกัดจำนวนตารางที่สามารถรวมอยู่ในคำสั่งค้นหาได้ หากคุณเกินขีดจำกัดนี้ คุณจะพบข้อความผิดพลาดเช่น:
- SQL Server 2000: “ไม่สามารถจัดสรรตารางเสริมสำหรับการมองหรือการแก้ไขฟังก์ชัน จำนวนตารางสูงสุดในคำสั่งค้นหา (256) ถูกเกิน.”
- SQL Server 2005: “มีชื่อโต๊ะมากเกินไปในคำสั่งค้นหา จำนวนสูงสุดที่อนุญาตคือ 256.”
ข้อผิดพลาดเหล่านี้บ่งชี้ว่าคุณได้แตะขีดจำกัดสูงสุดที่ตั้งโดย SQL Server สำหรับจำนวนตารางที่คุณสามารถอ้างอิงในคำสั่งค้นหาเดียว
เมื่อเผชิญกับข้อจำกัดเช่นนี้ นักพัฒนามักรู้สึกติดอยู่ พวกเขาอาจพิจารณาวิธีแก้ปัญหา เช่น ล้มเลิก ปล่อยให้ลูกค้าทำให้ความต้องการของพวกเขาง่ายขึ้น หรือแม้กระทั่งการทำให้ฐานข้อมูลเป็นปกติ อย่างไรก็ตาม มีวิธีที่มีประสิทธิภาพกว่าที่เราสามารถทำได้
วิธีแก้ปัญหาที่ใช้ได้จริง: การใช้ตัวแปรตาราง
แทนที่จะพยายามเรียกใช้คำสั่งค้นหาขนาดใหญ่ที่มีการเชื่อมต่อจำนวนมาก วิธีนี้มุ่งเน้นไปที่การใช้ ตัวแปรตาราง เพื่อสร้างชุดข้อมูลที่ต้องการอย่างเป็นระบบ นี่คือวิธีการดำเนินการในแต่ละขั้นตอน:
ขั้นตอนที่ 1: สร้างตัวแปรตาราง
เริ่มต้นโดยการกำหนดตัวแปรตารางที่แสดงถึงผลลัพธ์สุดท้ายที่คุณต้องการนำเสนอให้กับผู้ใช้ ตัวแปรตารางสามารถมีคอลัมน์ที่บรรจุผลลัพธ์ที่จำเป็นโดยไม่ต้องเชื่อมตารางมากเกินไปในครั้งเดียว
ขั้นตอนที่ 2: ระบุตารางหลักของคุณ
เลือกตารางหลักซึ่งคุณจะดึงข้อมูลหลักของคุณ ตัวอย่างเช่น หากคุณกำลังทำงานกับตาราง คำสั่งซื้อ คุณอาจเริ่มต้นจากการเลือกตารางนั้น
ขั้นตอนที่ 3: ดึงข้อมูลเสริม
จากนั้น ให้ดึงข้อมูลเพิ่มเติมที่จำเป็น ซึ่งสามารถเชื่อมโยงได้โดยเพียงหนึ่งการเชื่อมโยง ซึ่งอาจรวมถึงฟิลด์ เช่น ชื่อลูกค้าและชื่อผลิตภัณฑ์ ใช้คำสั่ง SELECT INTO
เพื่อเติมข้อมูลในตัวแปรตารางของคุณด้วยชุดข้อมูลเริ่มต้นนี้:
DECLARE @FinalResult TABLE (OrderID INT, CustomerName VARCHAR(255), ProductName VARCHAR(255));
INSERT INTO @FinalResult (OrderID, CustomerName, ProductName)
SELECT Orders.OrderID, Customers.Name, Products.ProductName
FROM Orders
JOIN Customers ON Orders.CustomerID = Customers.CustomerID
JOIN Products ON Orders.ProductID = Products.ProductID;
ขั้นตอนที่ 4: เยี่ยมชมเพื่อเติมข้อมูลที่เหลือ
เมื่อคุณมีข้อมูลเบื้องต้นในตัวแปรตารางของคุณแล้ว ให้ทำการวนซ้ำผ่านแต่ละแถวและดำเนินการเลือกขนาดเล็กและมีเป้าหมายเพื่อดึงข้อมูลเพิ่มเติมที่จำเป็น ตัวอย่างเช่น:
-- สมมติว่าทุกแถวใน @FinalResult ต้องการข้อมูลเพิ่มเติม
DECLARE @CurrentOrderID INT;
DECLARE cursor_orders CURSOR FOR
SELECT OrderID FROM @FinalResult;
OPEN cursor_orders;
FETCH NEXT FROM cursor_orders INTO @CurrentOrderID;
WHILE @@FETCH_STATUS = 0
BEGIN
-- ตัวอย่างการเลือกข้อมูลเสริม
INSERT INTO @FinalResult (AdditionalColumn)
SELECT AdditionalData FROM SourceTable WHERE OrderID = @CurrentOrderID;
FETCH NEXT FROM cursor_orders INTO @CurrentOrderID;
END
CLOSE cursor_orders;
DEALLOCATE cursor_orders;
ขั้นตอนที่ 5: ส่งผลลัพธ์กลับ
เมื่อคุณได้เติมข้อมูลในตัวแปรตารางของคุณด้วยข้อมูลที่จำเป็นทั้งหมดแล้ว การเลือกแบบง่าย SELECT *
จะส่งคืนชุดผลลัพธ์ที่สร้างขึ้นอย่างเต็มที่ให้กับผู้ใช้:
SELECT * FROM @FinalResult;
สรุป
วิธีนี้ไม่เพียงแต่มีประสิทธิภาพ แต่ยังสามารถมีประสิทธิภาพมากกว่าการพยายามเรียกใช้คำสั่งเลือกขนาดใหญ่ที่มีการเชื่อมโยงจำนวนมาก ในความเป็นจริง ในหลายกรณีที่ฉันพบ การแบ่งคำสั่งค้นหาที่ซับซ้อนออกเป็นแบบเล็กๆ และจัดการได้ง่ายได้แสดงให้เห็นว่าสามารถทำได้เร็วกว่าและมีประสิทธิภาพมากกว่า
โดยการใช้ตัวแปรตารางและดึงข้อมูลเสริมตามลำดับ คุณสามารถเอาชนะข้อจำกัดในการอ้างอิงจำนวนตารางที่มากเกินไปใน SQL Server ขณะเดียวกันก็รักษาประสิทธิภาพของคำสั่งค้นหาให้ดีอยู่เสมอ
ในครั้งต่อไปที่คุณพบข้อผิดพลาด มีตารางมากเกินไป
โปรดนึกถึงวิธีการเชิงโครงสร้างนี้และพิจารณาใช้ตัวแปรตารางเพื่อทำให้ออกแบบคำสั่งค้นหาของคุณง่ายขึ้น