วิธีการพิสูจน์การขาดคำสั่งโดยนัยในฐานข้อมูลหรือไม่


21

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

ฉันได้สังเกตสิ่งนี้มาก่อนและสิ่งที่ฉันทำได้จริงๆคือยืนยันว่าพวกเขาเชื่อใจฉันและไม่เพียงแค่คิดว่าตารางฐานข้อมูลจะทำตัวเหมือนไฟล์ CSV หรือ Excel แบบดั้งเดิม

ตัวอย่างเช่นการดำเนินการแบบสอบถาม (PostgreSQL)

create table mytable (
    id INTEGER PRIMARY KEY,
    data TEXT
);
INSERT INTO mytable VALUES
    (0, 'a'),
    (1, 'b'),
    (2, 'c'),
    (3, 'd'),
    (4, 'e'),
    (5, 'f'),
    (6, 'g'),
    (7, 'h'),
    (8, 'i'),
    (9, 'j');

จะสร้างตารางที่มีลำดับความคิดที่ชัดเจน การเลือกข้อมูลเดียวกันด้วยวิธีที่ง่ายที่สุดคือ:

SELECT * FROM mytable;

ให้ผลลัพธ์ดังต่อไปนี้กับฉันเสมอ:

 id | data 
----+------
  0 | a
  1 | b
  2 | c
  3 | d
  4 | e
  5 | f
  6 | g
  7 | h
  8 | i
  9 | j
(10 rows)

ฉันสามารถทำสิ่งนี้ซ้ำแล้วซ้ำอีกและมันจะกลับมาหาฉันข้อมูลเดียวกันในลำดับเดียวกันเสมอ อย่างไรก็ตามฉันรู้ว่าคำสั่งโดยปริยายนี้สามารถใช้งานไม่ได้ฉันเคยเห็นมาก่อนโดยเฉพาะในชุดข้อมูลขนาดใหญ่ซึ่งค่าสุ่มบางอย่างจะถูกส่งไปยังสถานที่ "ผิด" เมื่อถูกเลือก แต่มันเกิดขึ้นกับฉันโดยที่ฉันไม่รู้ว่าสิ่งนี้เกิดขึ้นได้อย่างไรหรือจะทำซ้ำได้อย่างไร ฉันพบว่ามันยากที่จะได้รับผลลัพธ์ใน Google เพราะคำค้นหามีแนวโน้มที่จะเพียงแค่ส่งคืนความช่วยเหลือทั่วไปในการเรียงลำดับชุดผลลัพธ์

ดังนั้นคำถามของฉันเป็นหลักเหล่านี้:

  1. ฉันจะได้เห็นถึงรูปธรรมและพิสูจน์ให้เห็นว่าการสั่งการกลับมาของแถวจากแบบสอบถามโดยไม่ต้องมีORDER BYคำสั่งไม่น่าเชื่อถืออย่างยิ่งโดยก่อให้เกิดและแสดงรายละเอียดของการสั่งซื้อนัยแม้ในขณะที่ตารางในคำถามที่จะไม่มีการปรับปรุงหรือแก้ไข ?

  2. มันสร้างความแตกต่างหรือไม่ถ้าข้อมูลถูกแทรกครั้งเดียวมาสค์และไม่เคยอัพเดทอีกเลย?

ฉันต้องการคำตอบจาก postgres เนื่องจากเป็นคำตอบที่ฉันคุ้นเคยมากที่สุด แต่ฉันก็สนใจทฤษฎีมากกว่า


6
“ ไม่เคยเขียนหรืออัปเดตอีกครั้ง” - ทำไมจึงเป็นตารางนี้ ฟังดูเหมือนไฟล์ หรือ enum หรือสิ่งที่ไม่จำเป็นต้องอยู่ในฐานข้อมูล หากเป็นไปตามลำดับเวลาจะไม่มีคอลัมน์วันที่ให้เรียงตาม หากลำดับเหตุการณ์สำคัญคุณอาจคิดว่าข้อมูลนั้นสำคัญพอที่จะมีในตาราง อย่างไรก็ตามแผนสามารถเปลี่ยนแปลงได้เนื่องจากมีคนวางหรือสร้างดัชนีใหม่หรือเหตุการณ์เช่นการเปลี่ยนแปลงหน่วยความจำการติดตามสถานะหรืออิทธิพลอื่น ๆ ข้อโต้แย้งของพวกเขาดูเหมือน“ ฉันไม่เคยคาดเข็มขัดนิรภัยและไม่เคยผ่านกระจกหน้ารถดังนั้นฉันจะไม่สวมเข็มขัดนิรภัยต่อไป” :-(
Aaron Bertrand

9
ปัญหาตรรกะบางอย่างไม่สามารถแก้ไขได้ในทางเทคนิคหรือไม่มีส่วนร่วมของฝ่ายทรัพยากรบุคคล หาก บริษัท ของคุณต้องการอนุญาตให้ผู้พัฒนาใช้แนวทางปฏิบัติที่เชื่อถือได้ในลัทธิวูดูและเพิกเฉยต่อเอกสารประกอบและกรณีการใช้งานของคุณนั้น จำกัด อยู่ที่โต๊ะเล็ก ๆ ที่ไม่เคยอัปเดตเลย มันไม่คุ้มค่าที่จะเถียง
Aaron Bertrand

1
คุณไม่มีพื้นฐานที่จะอ้างสิทธิ์ "จะเสมอ" คุณสามารถอ้างสิทธิ์ "ได้เสมอ", "เมื่อฉันตรวจสอบ" ภาษามีคำจำกัดความ - นั่นคือสัญญากับผู้ใช้
philipxy

10
ฉันอยากรู้ว่าทำไมเพื่อนร่วมงานของคุณไม่เห็นด้วยกับการเพิ่มส่วนorder byคำสั่งในการค้นหาของพวกเขา? พวกเขากำลังพยายามที่จะบันทึกในการจัดเก็บรหัสต้นฉบับ? การสึกหรอของแป้นพิมพ์? เวลาที่ใช้ในการพิมพ์ประโยคหวั่น?
mustaccio

2
ฉันคิดเสมอว่าเอ็นจิ้นฐานข้อมูลควรสุ่มแถวคำถามสองสามแถวแรกที่ซีแมนทิกส์ไม่รับประกันการสั่งซื้อเพื่อช่วยในการทดสอบ
Doug McClean

คำตอบ:


30

ฉันเห็นสามวิธีในการพยายามโน้มน้าวพวกเขา:

  1. ให้พวกเขาลองใช้แบบสอบถามเดียวกัน แต่มีตารางที่ใหญ่กว่า (จำนวนแถวมากขึ้น) หรือเมื่อตารางกำลังถูกอัพเดตระหว่างการประมวลผล หรือแทรกแถวใหม่และแถวเก่าจะถูกลบ หรือมีการเพิ่มหรือลบดัชนีระหว่างการประมวลผล หรือตารางสูญญากาศ (ใน Postgres) หรือดัชนีถูกสร้างใหม่ (ใน SQL Server) หรือตารางเปลี่ยนจากคลัสเตอร์เป็นฮีป หรือบริการฐานข้อมูลเริ่มต้นใหม่

  2. คุณสามารถแนะนำให้พวกเขาพิสูจน์ว่าการประหารชีวิตที่แตกต่างกันนั้นจะกลับมาเป็นลำดับเดียวกัน พวกเขาสามารถพิสูจน์ได้หรือไม่ พวกเขาสามารถให้ชุดการทดสอบที่พิสูจน์ว่าแบบสอบถามใด ๆจะให้ผลลัพธ์ในลำดับเดียวกันไม่ว่าจะถูกดำเนินการกี่ครั้ง?

  3. จัดทำเอกสารของ DBMS ต่างๆในเรื่องนั้น ตัวอย่างเช่น:

PostgreSQL :

จัดเรียงแถว

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

เซิร์ฟเวอร์ SQL :

SELECT- ORDER BYข้อ (Transact-SQL)

เรียงลำดับข้อมูลที่ส่งคืนโดยแบบสอบถามใน SQL Server ใช้ข้อนี้เพื่อ:

สั่งซื้อชุดผลลัพธ์ของแบบสอบถามโดยรายการคอลัมน์ที่ระบุและเลือกที่จะ จำกัด แถวที่ส่งคืนไปยังช่วงที่ระบุ ลำดับที่จะส่งคืนแถวในชุดผลลัพธ์ไม่ได้รับการรับรองเว้นแต่ORDER BYจะระบุข้อไว้

ออราเคิล :

order_by_clause

ใช้ส่วนORDER BYคำสั่งเพื่อสั่งซื้อแถวที่ส่งคืนโดยคำสั่ง หากไม่มี order_by_clause จะไม่มีการรับประกันว่าแบบสอบถามเดียวกันที่ดำเนินการมากกว่าหนึ่งครั้งจะดึงแถวในลำดับเดียวกัน


ด้วยตารางเล็ก ๆ ที่ไม่ได้ปรับเปลี่ยนคุณอาจเห็นพฤติกรรมนี้ คาดว่า แต่มันก็ไม่รับประกันเช่นกัน คำสั่งซื้ออาจเปลี่ยนแปลงได้เนื่องจากคุณเพิ่มดัชนีหรือคุณแก้ไขดัชนีหรือคุณรีสตาร์ทฐานข้อมูลและอาจมีอีกหลายกรณี
ypercubeᵀᴹ

6
หากคำสั่งซื้อมีความสำคัญผู้ที่มีหน้าที่รับผิดชอบในการตรวจสอบรหัสควรปฏิเสธจนกว่าพวกเขาจะใช้ ORDER BY นักพัฒนาของ DBMSs (Oracle, SQL Server, Postgres) ทุกคนพูดในสิ่งเดียวกันเกี่ยวกับสิ่งที่รับประกันผลิตภัณฑ์ของพวกเขาและสิ่งที่ไม่ (และพวกเขาจะได้รับเงินมากกว่าที่ฉันจะเป็นดังนั้นพวกเขาจึงรู้ว่าพวกเขาพูดอะไร สิ่ง)
ypercubeᵀᴹ

1
แม้ว่าคำสั่งซื้อจะดูเหมือนกันในตอนนี้หรือไม่แน่นอนว่าตารางเหล่านี้จะไม่ถูกอัปเดตตลอดอายุการใช้งานของซอฟต์แวร์ที่คุณกำลังสร้างใช่หรือไม่ จะไม่มีการแทรกแถวอีกต่อไปใช่ไหม?
ypercubeᵀᴹ

1
มีการรับประกันหรือไม่ว่าตารางนี้จะเล็กไปหรือไม่ มีการรับประกันว่าจะไม่มีการเพิ่มคอลัมน์อีกหรือไม่ ฉันสามารถดูได้หลายสิบกรณีที่ตารางอาจมีการเปลี่ยนแปลงในอนาคต (และการเปลี่ยนแปลงเหล่านี้บางอย่างอาจส่งผลต่อลำดับของผลลัพธ์คิวรี) ฉันขอแนะนำให้คุณตอบคำถามเหล่านี้ทั้งหมด พวกเขาสามารถรับประกันได้หรือไม่ว่าไม่มีอะไรจะเกิดขึ้น? และทำไมพวกเขาจะไม่เพิ่มง่าย ๆORDER BYซึ่งจะรับประกันการสั่งซื้อไม่ว่าตารางจะมีการเปลี่ยนแปลงอย่างไร ทำไมไม่เพิ่มเซฟซึ่งไม่เป็นอันตราย?
ypercubeᵀᴹ

10
เอกสารควรเพียงพอ สิ่งอื่นใดที่เป็นการคาดเดาครั้งที่สองและไม่ว่าจะด้วยวิธีใดก็ตามไม่ว่าคุณจะพิสูจน์อะไร มันจะเป็นสิ่งที่คุณทำและอธิบายอาจจะเป็นที่ค่าใช้จ่ายของคุณมากกว่าสิ่งที่เป็น มีเอกสารประกอบส่ง "การรับประกัน" ของคุณเป็นลายลักษณ์อักษรและเพียงขออนุญาตเป็นลายลักษณ์อักษรเพื่อไม่ให้ส่งคืนแถวตามลำดับที่ต้องการ (คุณจะไม่ได้รับมัน)

19

นี่คือเรื่องราวของหงส์ดำทั้งหมดอีกครั้ง หากคุณยังไม่เคยเห็นใครไม่ได้หมายความว่าพวกเขาไม่มีตัวตน หวังว่าในกรณีของคุณมันจะไม่นำไปสู่วิกฤติการเงินโลกกว้างอีกต่อไปสำหรับลูกค้าที่ไม่มีความสุข

Postgres เอกสารกล่าวว่านี้อย่างชัดเจน:

หากไม่ได้รับ ORDER BY แถวจะถูกส่งคืนตามลำดับที่ระบบค้นหาได้เร็วที่สุดในการสร้าง

"ระบบ" ในกรณีนี้ประกอบด้วย postgres ภูตตัวเอง (รวมถึงการดำเนินการตามวิธีการเข้าถึงข้อมูลและเพิ่มประสิทธิภาพการค้นหา) ระบบปฏิบัติการที่รองรับรูปแบบตรรกะและทางกายภาพของการจัดเก็บฐานข้อมูลอาจยังแคช CPU เนื่องจากคุณในฐานะผู้ใช้ฐานข้อมูลไม่สามารถควบคุมสแต็กนั้นได้คุณไม่ควรพึ่งพามันต่อไปเพื่อให้ทำงานได้อย่างต่อเนื่องในลักษณะที่มันทำงานในนาทีนี้

เพื่อนร่วมงานของคุณจะกระทำเข้าใจผิดรีบร้อนทั่วไป เพื่อพิสูจน์จุดของพวกเขามันก็เพียงพอที่จะแสดงให้เห็นว่าการสันนิษฐานของพวกเขานั้นผิดเพียงครั้งเดียวเช่นโดยdbfiddleนี้


12

ลองพิจารณาตัวอย่างต่อไปนี้โดยที่เรามีสามตารางที่เกี่ยวข้อง คำสั่งซื้อผู้ใช้และรายละเอียดการสั่งซื้อ OrderDetails ถูกเชื่อมโยงกับกุญแจต่างประเทศไปยังตารางคำสั่งซื้อและตารางผู้ใช้ นี่คือการตั้งค่าทั่วไปสำหรับฐานข้อมูลเชิงสัมพันธ์ เนื้อหาวัตถุประสงค์ทั้งหมดของDBMS เชิงสัมพันธ์

USE tempdb;

IF OBJECT_ID(N'dbo.OrderDetails', N'U') IS NOT NULL
DROP TABLE dbo.OrderDetails;

IF OBJECT_ID(N'dbo.Orders', N'U') IS NOT NULL
DROP TABLE dbo.Orders;

IF OBJECT_ID(N'dbo.Users', N'U') IS NOT NULL
DROP TABLE dbo.Users;

CREATE TABLE dbo.Orders
(
    OrderID int NOT NULL
        CONSTRAINT OrderTestPK
        PRIMARY KEY
        CLUSTERED
    , SomeOrderData varchar(1000)
        CONSTRAINT Orders_somedata_df
        DEFAULT (CRYPT_GEN_RANDOM(1000))
);

CREATE TABLE dbo.Users
(
    UserID int NOT NULL
        CONSTRAINT UsersPK
        PRIMARY KEY
        CLUSTERED
    , SomeUserData varchar(1000)
        CONSTRAINT Users_somedata_df
        DEFAULT (CRYPT_GEN_RANDOM(1000))
);

CREATE TABLE dbo.OrderDetails
(
    OrderDetailsID int NOT NULL
        CONSTRAINT OrderDetailsTestPK
        PRIMARY KEY
        CLUSTERED
    , OrderID int NOT NULL
        CONSTRAINT OrderDetailsOrderID
        FOREIGN KEY
        REFERENCES dbo.Orders(OrderID)
    , UserID int NOT NULL
        CONSTRAINT OrderDetailsUserID
        FOREIGN KEY
        REFERENCES dbo.Users(UserID)
    , SomeOrderDetailsData varchar(1000)
        CONSTRAINT OrderDetails_somedata_df
        DEFAULT (CRYPT_GEN_RANDOM(1000))
);

INSERT INTO dbo.Orders (OrderID)
SELECT TOP(100) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM sys.syscolumns sc;

INSERT INTO dbo.Users (UserID)
SELECT TOP(100) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM sys.syscolumns sc;

INSERT INTO dbo.OrderDetails (OrderDetailsID, OrderID, UserID)
SELECT TOP(10000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
    , o.OrderID
    , u.UserID
FROM sys.syscolumns sc
    CROSS JOIN dbo.Orders o
    CROSS JOIN dbo.Users u
ORDER BY NEWID();

CREATE INDEX OrderDetailsOrderID ON dbo.OrderDetails(OrderID);
CREATE INDEX OrderDetailsUserID ON dbo.OrderDetails(UserID);

ที่นี่เรากำลังสอบถามตาราง OrderDetails โดยที่ UserID คือ 15:

SELECT od.OrderDetailsID
    , o.OrderID
    , u.UserID
FROM dbo.OrderDetails od
    INNER JOIN dbo.Users u ON u.UserID = od.UserID
    INNER JOIN dbo.Orders o ON od.OrderID = o.OrderID
WHERE u.UserID = 15

ผลลัพธ์จากแบบสอบถามดูเหมือนว่า:

╔════════════════╦═════════╦════════╗
║ OrderDetailsID ║ OrderID ║ UserID ║
╠════════════════╬═════════╬════════╣
00 2200115 ║ 2 ║ 15 ║
║ 630215 ║ 3 ║ 15 ║
║ 1990215 ║ 3 ║ 15 ║
║ 4960215 ║ 3 ║ 15 ║
║ 100715 ║ 8 ║ 15 ║
║ 3930815 ║ 9 ║ 15 ║
║ 6310815 ║ 9 ║ 15 ║
║ 4441015 ║ 11 ║ 15 ║
║ 2171315 ║ 14 ║ 15 ║
║ 3431415 ║ 15 ║ 15 ║
║ 4571415 ║ 15 ║ 15 ║
║ 6421515 ║ 16 ║ 15 ║
║ 2271715 ║ 18 ║ 15 ║
║ 2601715 ║ 18 ║ 15 ║
║ 3521715 ║ 18 ║ 15 ║
18 221815 ║ 19 ║ 15 ║
║ 3381915 ║ 20 ║ 15 ║
║ 4471915 ║ 20 ║ 15 ║
╚════════════════╩═════════╩════════╝

อย่างที่คุณเห็นลำดับของเอาท์พุทแถวไม่ตรงกับลำดับของแถวในตาราง OrderDetails

การเพิ่มORDER BYแถวชัดเจนจะส่งกลับไปยังลูกค้าตามลำดับที่ต้องการ:

SELECT od.OrderDetailsID
    , o.OrderID
    , u.UserID
FROM dbo.OrderDetails od
    INNER JOIN dbo.Users u ON u.UserID = od.UserID
    INNER JOIN dbo.Orders o ON od.OrderID = o.OrderID
WHERE u.UserID = 15
ORDER BY od.OrderDetailsID;
╔════════════════╦═════════╦════════╗
║ OrderDetailsID ║ OrderID ║ UserID ║
╠════════════════╬═════════╬════════╣
║ 3915 ║ 40 ║ 15 ║
║ 100715 ║ 8 ║ 15 ║
18 221815 ║ 19 ║ 15 ║
║ 299915 ║ 100 ║ 15 ║
║ 368215 ║ 83 ║ 15 ║
║ 603815 ║ 39 ║ 15 ║
║ 630215 ║ 3 ║ 15 ║
║ 728515 ║ 86 ║ 15 ║
║ 972215 ║ 23 ║ 15 ║
║ 992015 ║ 21 ║ 15 ║
║ 1017115 ║ 72 ║ 15 ║
║ 1113815 ║ 39 ║ 15 ║
╚════════════════╩═════════╩════════╝

หากคำสั่งของแถวมีความจำเป็นและวิศวกรของคุณรู้ว่าคำสั่งนั้นมีความจำเป็นพวกเขาควรจะต้องการใช้ORDER BYคำสั่งเพียงอย่างเดียวเนื่องจากอาจทำให้พวกเขาต้องเสียค่าใช้จ่ายหากพวกเขามีข้อผิดพลาดที่เกี่ยวข้องกับคำสั่งที่ไม่ถูกต้อง

ตัวอย่างที่สองอาจเป็นคำแนะนำเพิ่มเติมโดยใช้OrderDetailsตารางจากด้านบนซึ่งเราไม่ได้เข้าร่วมตารางอื่น ๆ แต่มีข้อกำหนดง่าย ๆ ในการค้นหาแถวที่ตรงกับทั้งรหัสผู้ใช้และรหัสผู้ใช้เราเห็นปัญหา

เราจะสร้างดัชนีเพื่อสนับสนุนการสืบค้นตามที่คุณน่าจะทำในชีวิตจริงหากประสิทธิภาพนั้นสำคัญไม่ว่าจะเป็นอย่างไร

CREATE INDEX OrderDetailsOrderIDUserID ON dbo.OrderDetails(OrderID, UserID);

นี่คือแบบสอบถาม:

SELECT od.OrderDetailsID
FROM dbo.OrderDetails od
WHERE od.OrderID = 15
    AND (od.UserID = 21 OR od.UserID = 22)

และผลลัพธ์:

╔════════════════╗
║ OrderDetailsID ║
╠════════════════╣
║ 21421 ║
║ 5061421 ║
║ 7091421 ║
║ 691422 ║
║ 3471422 ║
║ 7241422 ║
╚════════════════╝

การเพิ่มส่วนORDER BYคำสั่งจะช่วยให้แน่ใจว่าเราจะได้รับการจัดเรียงที่ถูกต้องที่นี่เช่นกัน

ตัวอย่างเหล่านี้เป็นเพียงตัวอย่างง่ายๆที่ไม่รับประกันว่าแถวจะ "อยู่ในลำดับ" โดยไม่มีORDER BYคำสั่งที่ชัดเจน มีตัวอย่างอีกมากมายเช่นนี้และเนื่องจากรหัสเครื่องยนต์ DBMS มีการเปลี่ยนแปลงค่อนข้างบ่อยลักษณะการทำงานที่เฉพาะเจาะจงอาจเปลี่ยนแปลงตลอดเวลา


10

เป็นตัวอย่างที่ใช้งานได้จริงใน Postgres ลำดับปัจจุบันจะเปลี่ยนเมื่อคุณอัปเดตแถว:

% SELECT * FROM mytable;
 id | data 
----+------
  0 | a
  1 | b
  2 | c
  3 | d
  4 | e
  5 | f
  6 | g
  7 | h
  8 | i
  9 | j
(10 rows)

% UPDATE mytable SET data = 'ff' WHERE id = 5;
UPDATE 1
% SELECT * FROM mytable;
 id | data 
----+------
  0 | a
  1 | b
  2 | c
  3 | d
  4 | e
  6 | g
  7 | h
  8 | i
  9 | j
  5 | ff
(10 rows)

ฉันไม่คิดว่ากฎของการสั่งซื้อโดยปริยายที่มีอยู่นี้จะถูกบันทึกไว้ที่ใดก็ได้และอาจมีการเปลี่ยนแปลงได้โดยไม่ต้องแจ้งให้ทราบล่วงหน้าและไม่ใช่พฤติกรรมแบบพกพาในเครื่องมือ DB


มันเป็นเอกสาร: คำตอบของคำพูด ypercube เอกสารบอกเราว่าการสั่งซื้อที่ไม่ได้ระบุ
Lightness Races กับโมนิก้า

@LightnessRacesinOrbit ฉันต้องการเป็นเอกสารที่บอกเราอย่างชัดเจนว่ายังไม่ได้บันทึกไว้ ฉันหมายความว่ามันเป็นความจริงที่ว่าไม่มีสิ่งใดที่ไม่ได้ระบุไว้ในเอกสาร มันเป็นเรื่องที่ซ้ำซาก อย่างไรก็ตามฉันได้แก้ไขส่วนนั้นของคำตอบให้เจาะจงยิ่งขึ้น
JoL

3

ไม่ใช่ตัวอย่าง แต่ยาวเกินไปสำหรับความคิดเห็น

บนโต๊ะขนาดใหญ่ฐานข้อมูลบางส่วนจะทำการสแกนแบบขนาน interleaved:

หากแบบสอบถามสองรายการต้องการสแกนตารางเดียวกันและมาถึงเกือบจะในเวลาเดียวกันการสืบค้นแรกอาจเป็นส่วนหนึ่งผ่านตารางเมื่อการเริ่มต้นครั้งที่สอง

แบบสอบถามที่สองอาจได้รับระเบียนที่เริ่มต้นจากกลางตาราง (เนื่องจากแบบสอบถามแรกเสร็จสมบูรณ์) จากนั้นรับระเบียนจากจุดเริ่มต้นของตาราง


2

สร้างดัชนีคลัสเตอร์ที่มีคำสั่ง "ผิด" ID DESCยกตัวอย่างเช่นคลัสเตอร์บน สิ่งนี้มักจะส่งออกลำดับกลับกัน (แม้ว่าจะไม่รับประกันเช่นกัน)

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