SQL WHERE clause ได้รับการประเมินหรือไม่


142

นิพจน์บูลีนใน SQL คำสั่งที่มีการประเมินการลัดวงจรอยู่ ที่ไหน?

ตัวอย่างเช่น:

SELECT * 
FROM Table t 
WHERE @key IS NULL OR (@key IS NOT NULL AND @key = t.Key) 

ถ้า@key IS NULLประเมินว่าเป็นจริง@key ไม่ได้เป็น NULL และ @key = t.Keyประเมินหรือไม่

ถ้าไม่ทำไมล่ะ

ถ้าใช่มันรับประกันหรือไม่? มันเป็นส่วนหนึ่งของ ANSI SQL หรือเป็นฐานข้อมูลเฉพาะหรือไม่

ถ้าฐานข้อมูลเฉพาะ SqlServer ออราเคิล? MySQL?


ข้อ @key ไม่ใช่ Null ซ้ำซ้อนหรือไม่ @key IS NULL ประโยคบน LHS ดูแลสิ่งนี้ไม่ได้?
24654 spender

10
@splender - ขึ้นอยู่กับคำตอบของคำถาม
เกร็กคณบดี

@Greg: ฉันเห็นด้วยกับอะไรต่อมิอะไร ฉันไม่เห็นการขาดหรือการปรากฏตัวของการลัดวงจรทำให้เกิดความแตกต่าง หาก @key IS NULL ดังนั้น @key = t.Key จะส่งคืนค่าเท็จเสมอเช่น NULL! = NULL (นั่นคือเหตุผลที่เราใช้ IS NULL หลังจากนี้)
Michael Madsen

14
@Michael และ @spender - ประเด็นของคำถามคือเงื่อนไขที่สองประเมินหรือไม่ ประเด็นของคำถามไม่ได้เป็นคำสั่ง SQL นี้เฉพาะเขียนในตัวละครน้อยที่สุด ในตัวอย่างที่มีความซับซ้อนมากขึ้นอย่างไม่ต้องสงสัยมันจะเกิดอะไรขึ้นราวกับว่าประโยคสั้น ๆ อยู่ที่ไหนคุณสามารถเขียนสำนวนที่ผิดพลาดได้
Greg Dean

2
การลัดวงจรระยะสั้นหมายถึงการประเมินเงื่อนไขจากซ้ายไปขวา ให้เงื่อนไขเช่นWHERE a = 1 AND b = 2มันอาจจะมีประสิทธิภาพสำหรับโปรแกรมฐานข้อมูลเพื่อหาแถวทั้งหมดที่ b = 2 ก่อนจากนั้นกรองที่ a = 1 หากคุณขอการรับประกันจากนั้นเครื่องมือเพิ่มประสิทธิภาพจะไร้ประโยชน์
Salman

คำตอบ:


72

ANSI SQL Draft 2003 5WD-01-Framework-2003-09.pdf

6.3.3.3 ลำดับการประเมินกฎ

[ ... ]

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


4
การดำเนินการขึ้นอยู่กับ? ยิ่งใหญ่ เป็นการดีที่จะรู้เช่นกัน อย่างน้อยCASEก็ลัดวงจร
dakab

3
นี่ไม่ได้หมายความว่าการประเมินค่านิพจน์นั้นไม่ถูกต้องหรือไม่? "(0 = 0 OR NULL)" จะเป็น NULL เสมอหากคำศัพท์ทั้งหมดได้รับการประเมิน แต่เป็นจริงเสมอหากได้รับการประเมินจากซ้ายไปขวาและลัดวงจร
user48956

7
SQL เป็นภาษาที่ประกาศโดยทั่วไปแล้วมันเป็นการแสดงออกถึงตรรกะของการคำนวณโดยไม่ต้องอธิบายการควบคุมการไหลของมัน; รูปแบบใดที่ขัดแย้งกับรูปแบบที่จำเป็นของการประเมินการลัดวงจรและผลที่ตามมา
Jorge Garcia

ฉันไม่ได้คิดอย่างนั้น @JorgeGarcia ฉันเดาว่าการประเมินการลัดวงจรจะบังคับให้คำสั่งในการปฏิบัติงานโดยปริยาย ฉันต่อสู้กับรหัสบางอย่างซึ่งนี่อาจเป็นต้นเหตุของปัญหาที่ละเอียดอ่อน ขอบคุณสำหรับความเข้าใจ
Carnot Antonio Romero

58

จากด้านบนการลัดวงจรไม่สามารถใช้ได้จริง

หากคุณต้องการฉันขอแนะนำคำสั่งกรณี:

Where Case when Expr1 then Expr2 else Expr3 end = desiredResult

Expr1ถูกประเมินเสมอ แต่เพียงหนึ่งในนั้นExpr2และExpr3จะถูกประเมินต่อแถว


3
ขึ้นอยู่กับการนำไปใช้ของ RDBMS ฉันถือว่า สำหรับ SQL Server เป็นอย่างน้อยมีข้อยกเว้นอย่างน้อยหนึ่งข้อที่จัดทำเป็นเอกสารเพื่อไม่แสดงพฤติกรรมนี้ (เช่นการลัดวงจร) CF CASE (Transact SQL) - หมายเหตุ ฉันยกกรณีนี้ในคำตอบนี้ฉันให้กับคำถามSQL - คำสั่งที่ชัดเจนของเงื่อนไขที่ไหน? .
TT

1
นิพจน์กรณีไม่ใช่คำสั่ง
jarlh

19

ฉันคิดว่านี่เป็นหนึ่งในกรณีที่ฉันเขียนราวกับว่ามันไม่ทำให้เกิดไฟฟ้าลัดวงจรด้วยเหตุผลสามประการ

  1. เพราะสำหรับ MSSQL มันไม่ได้รับการแก้ไขด้วยการดู BOL ในที่ที่เห็นได้ชัดดังนั้นสำหรับฉันมันทำให้มันคลุมเครือในทางบัญญัติ

  2. เพราะอย่างน้อยฉันก็รู้ว่าโค้ดของฉันจะใช้งานได้ และที่สำคัญกว่านั้นคือคนที่ตามฉันมาดังนั้นฉันจะไม่ตั้งพวกเขาให้กังวลคำถามเดียวกันซ้ำแล้วซ้ำอีก

  3. ฉันเขียนบ่อยพอสำหรับผลิตภัณฑ์ DBMS หลายตัวและฉันไม่ต้องการจำความแตกต่างหากฉันสามารถแก้ไขได้โดยง่าย


4
ข้อเสนอแนะที่ดี ไม่ตอบคำถาม แต่มันเป็นมุมมองที่เป็นประโยชน์อย่างยิ่ง ดังนั้น +1
Greg Dean

12

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

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


7

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


6
มันสำคัญสำหรับความเร็วในการทำงาน!
user4951

เพียงเพราะนั่นคือวิธีการทำงานในปัจจุบันไม่ได้หมายความว่ามันไม่สามารถเปลี่ยนแปลงได้ เราต้องแยกโมเดล / ซีแมนทิกส์ออกจากการใช้งาน แผนการดำเนินการถูกนำมาใช้ภายในเพื่อเพิ่มประสิทธิภาพการดำเนินการของแบบสอบถาม ... และความหมายของการลัดวงจรไม่เพียง แต่ขัดแย้งกับลักษณะการประกาศของ SQL แต่อาจ จำกัด การปรับให้เหมาะสมดังกล่าว อย่างไรก็ตามหากความหมายของการประเมินการลัดวงจรได้รับการสนับสนุนโดย DBMS การดำเนินการตามแผนปฏิบัติการจะเปลี่ยนไปเพื่อรองรับความหมายดังกล่าว
Jorge Garcia

3

ฉันมักจะใช้สิ่งนี้สำหรับพารามิเตอร์ที่เป็นตัวเลือก นี่เหมือนกับการลัดวงจรหรือไม่?

SELECT  [blah]
FROM    Emp
WHERE  ((@EmpID = -1) OR (@EmpID = EmpID))

สิ่งนี้ทำให้ฉันมีตัวเลือกในการผ่านใน -1 หรืออะไรก็ตามที่บัญชีสำหรับการตรวจสอบคุณลักษณะของตัวเลือก บางครั้งสิ่งนี้เกี่ยวข้องกับการเข้าร่วมในหลายตารางหรือควรมีมุมมอง

มีประโยชน์มากไม่แน่ใจว่าได้ทำงานพิเศษให้กับเครื่องยนต์ db หรือไม่


2

สำหรับ SQL Server ฉันคิดว่ามันขึ้นอยู่กับรุ่น แต่ประสบการณ์ของฉันกับ SQL Server 2000 คือว่ามันยังประเมิน @key = t.Key แม้เมื่อ @key เป็นโมฆะ มันไม่ทำการลัดวงจรที่มีประสิทธิภาพเมื่อทำการประเมิน WHERE clause

ฉันเคยเห็นคนแนะนำโครงสร้างเช่นตัวอย่างของคุณเป็นวิธีการทำแบบสอบถามที่ยืดหยุ่นที่ผู้ใช้สามารถป้อนหรือไม่ป้อนเกณฑ์ต่างๆ การสังเกตของฉันคือ Key ยังคงมีส่วนร่วมในแผนแบบสอบถามเมื่อ @key เป็นโมฆะและหาก Key ได้รับการจัดทำดัชนีแล้วจะไม่ใช้ดัชนีอย่างมีประสิทธิภาพ

เคียวรีแบบยืดหยุ่นชนิดนี้ที่มีเกณฑ์แตกต่างกันอาจเป็นกรณีที่ SQL ที่สร้างขึ้นแบบไดนามิกเป็นวิธีที่ดีที่สุดในการไป ถ้า @key นั้นเป็นโมฆะคุณก็ไม่ต้องใส่มันเข้าไปในคิวรีเลย


2

เพิ่งสะดุดกับคำถามนี้และพบรายการบล็อกนี้แล้ว: http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/

เซิร์ฟเวอร์ SQL นั้นสามารถเพิ่มประสิทธิภาพการสืบค้นได้ทุกที่ที่เธอเห็นว่าเหมาะสมดังนั้นในตัวอย่างที่ให้ไว้ในบล็อกโพสต์คุณไม่สามารถพึ่งพาการลัดวงจรได้

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


1

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

ตัวดำเนินการบูลีนไบนารีเป็น comutative ความหมาย:

a AND b == b AND a
a OR  b == b OR  a
a XOR b == b XOR a

ดังนั้นจึงไม่มีการรับประกันสำหรับการประเมินผล ลำดับของการประเมินจะถูกกำหนดโดยเครื่องมือเพิ่มประสิทธิภาพข้อความค้นหา

ในภาษาที่มีวัตถุอาจมีสถานการณ์ที่คุณสามารถเขียนนิพจน์บูลีนที่สามารถประเมินได้ด้วยการประเมินการลัดวงจรเท่านั้น การสร้างโค้ดตัวอย่างของคุณมักใช้ในภาษาดังกล่าว (C #, Delphi, VB) ตัวอย่างเช่น:

if(someString == null | someString.Length == 0 )
  printf("no text in someString");

ตัวอย่าง C # นี้จะทำให้เกิดข้อยกเว้นถ้า someString == nullเพราะจะได้รับการประเมินอย่างสมบูรณ์ ในการประเมินการลัดวงจรมันจะทำงานทุกครั้ง

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

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

หากการใช้ SQL ใช้การประเมินการลัดวงจรหวังว่าจะสามารถเพิ่มความเร็วในการเรียกใช้คิวรีได้เท่านั้น


1
ใช่ตัวดำเนินการบูลีนเป็นแบบสลับคำ ฉันไม่คิดว่าวัตถุ (หรือไม่) มีส่วนเกี่ยวข้องกับมัน
Greg Dean

1

ฉันไม่รู้เกี่ยวกับการลัดวงจร แต่ฉันเขียนมันเป็นคำสั่ง if-else

if (@key is null)
begin

     SELECT * 
     FROM Table t 

end
else
begin

     SELECT * 
     FROM Table t 
     WHERE t.Key=@key

end

นอกจากนี้ตัวแปรควรอยู่ทางด้านขวาของสมการเสมอ สิ่งนี้ทำให้มันเป็นเรื่องยาก

http://en.wikipedia.org/wiki/Sargable


1
ใครช่วยยืนยันเกี่ยวกับตัวแปรทางด้านขวาได้ไหม ด้วยเหตุผลบางอย่างฉันมีเวลายากที่จะเชื่อ
Greg Dean

searchoracle.techtarget.com/expert/KnowledgebaseAnswer/ ไม่สามารถหาอะไรได้อีกแล้วตอนนี้
DForck42

ตามที่ฉันเข้าใจบทความ มันกำลังพูดถึงฟังก์ชั่นเกี่ยวกับชื่อคอลัมน์ที่ไม่สามารถถูกขายได้ ซึ่งฉันเข้าใจ อย่างไรก็ตามฉันคิดว่า (A = @a) หรือ (@a = A) มีความสำคัญ
Greg Dean

ฉันอาจจะผิด. อาจเป็นคำถามที่ดีหากยังไม่มี
DForck42

1

ด้านล่างการทดสอบที่รวดเร็วและสกปรกบน SQL Server 2008 R2:

SELECT *
FROM table
WHERE 1=0
AND (function call to complex operation)

สิ่งนี้จะส่งกลับทันทีโดยไม่มีการบันทึก มีพฤติกรรมการลัดวงจรชนิดใด

จากนั้นลองทำสิ่งนี้:

SELECT *
FROM table
WHERE (a field from table) < 0
AND (function call to complex operation)

รู้ว่าไม่มีบันทึกจะตอบสนองเงื่อนไขนี้:

(a field from table) < 0

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

หวังว่านี่จะช่วยพวก


1
ฉันเดาว่าแบบสอบถามแรกคือ "ลัดวงจร" ในเวลารวบรวมก่อนดำเนินการตามแผนเริ่มจริง
Louis

1

นี่คือตัวอย่างเพื่อพิสูจน์ว่าMySQL ทำการทำงานในส่วนคำสั่ง WHERE circuiting :

http://rextester.com/GVE4880

สิ่งนี้จะรันเคียวรีต่อไปนี้:

SELECT myint FROM mytable WHERE myint >= 3 OR myslowfunction('query #1', myint) = 1;
SELECT myint FROM mytable WHERE myslowfunction('query #2', myint) = 1 OR myint >= 3;

ข้อแตกต่างระหว่างสิ่งเหล่านี้คือลำดับของตัวถูกดำเนินการในเงื่อนไขหรือ

myslowfunctionจงหลับเป็นเวลาหนึ่งวินาทีและมีผลข้างเคียงของการเพิ่มรายการในตารางบันทึกทุกครั้งที่เรียกใช้ นี่คือผลลัพธ์ของสิ่งที่บันทึกไว้เมื่อเรียกใช้คิวรีสองข้อด้านบน:

myslowfunction called for query #1 with value 1
myslowfunction called for query #1 with value 2
myslowfunction called for query #2 with value 1
myslowfunction called for query #2 with value 2
myslowfunction called for query #2 with value 3
myslowfunction called for query #2 with value 4

ข้างต้นแสดงให้เห็นว่าฟังก์ชั่นช้าจะถูกดำเนินการมากขึ้นเมื่อมันปรากฏขึ้นที่ด้านซ้ายของเงื่อนไขหรือเมื่อตัวถูกดำเนินการอื่นไม่เป็นจริงเสมอ (เนื่องจากการลัดวงจร)


4
อืมคุณอาจหมายถึงว่า"นี่คือตัวอย่างเพื่อพิสูจน์ว่า MySQL ทำการทำงานในส่วนคำสั่ง WHERE ประโยคลัดในตัวอย่างนี้ :"
TT

1
แน่นอน - มันเป็นเพียงข้อพิสูจน์ว่าสามารถเกิดขึ้นได้
Steve Chambers

0

ใช้เวลาเพิ่มอีก 4 วินาทีในตัววิเคราะห์คิวรีดังนั้นจากสิ่งที่ฉันเห็นถ้ายังไม่ได้ย่อ ...

SET @ADate = NULL

IF (@ADate IS NOT NULL)
BEGIN
    INSERT INTO #ABla VALUES (1)
        (SELECT bla from a huge view)
END

มันคงจะดีถ้ามีวิธีรับประกัน!


-2

เป็นที่ชัดเจนว่าเซิร์ฟเวอร์ MS Sql สนับสนุนทฤษฎี Short circuit เพื่อปรับปรุงประสิทธิภาพโดยหลีกเลี่ยงการตรวจสอบที่ไม่จำเป็น

ตัวอย่างการสนับสนุน:

SELECT 'TEST'
WHERE 1 = 'A'

SELECT 'TEST'
WHERE 1 = 1 OR 1 = 'A'

ตัวอย่างแรกจะส่งผลให้เกิดข้อผิดพลาด 'การแปลงล้มเหลวเมื่อแปลงค่า varchar' A 'เป็นประเภทข้อมูล int'

ในขณะที่สองทำงานได้อย่างง่ายดายตามเงื่อนไข 1 = 1 ประเมินเป็น TRUE และทำให้สภาพที่สองไม่ได้ทำงานเลย

เพิ่มเติมอีก

SELECT 'TEST'
WHERE 1 = 0 OR 1 = 'A'

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

หมายเหตุ: ฉันสูญเสียเงื่อนไขความผิดพลาดเพียงเพื่อปรับปรุงสภาพอากาศที่ดำเนินการหรือสั้น - วงจรหากผลการค้นหาในข้อผิดพลาดหมายถึงเงื่อนไขอื่น ๆ ที่สั้น - วงจรอื่น ๆ

คำอธิบายอย่างง่าย

พิจารณา,

WHERE 1 = 1 OR 2 = 2

เนื่องจากเงื่อนไขแรกได้รับการประเมินเป็นTRUEมันไม่มีความหมายในการประเมินเงื่อนไขที่สองเนื่องจากการประเมินในสิ่งที่ค่าจะไม่ส่งผลกระทบต่อผลทั้งหมดดังนั้นจึงเป็นโอกาสที่ดีสำหรับ Sql Server เพื่อประหยัดเวลาดำเนินการ Query โดยข้ามการตรวจสอบเงื่อนไขที่ไม่จำเป็น .

ในกรณีของ"OR"หากเงื่อนไขแรกถูกประเมินเป็นTRUEโซ่ทั้งหมดที่เชื่อมต่อด้วย"OR"จะถือว่าเป็นการประเมินว่าเป็นจริงโดยไม่ต้องประเมินผู้อื่น

condition1 OR condition2 OR ..... OR conditionN

ถ้า condition1 ถูกประเมินเป็น true ให้พักเงื่อนไขทั้งหมดจนกว่า conditionN จะถูกข้าม ในคำทั่วไปที่กำหนดTRUEแรกเงื่อนไขอื่น ๆ ทั้งหมดที่เชื่อมโยงโดย OR จะถูกข้าม

พิจารณาเงื่อนไขที่สอง

WHERE 1 = 0 AND 1 = 1

เนื่องจากเงื่อนไขแรกได้รับการประเมินเป็นFALSEโดยไม่มีความหมายในการประเมินเงื่อนไขที่สองเนื่องจากการประเมินในสิ่งที่ค่าจะไม่ส่งผลกระทบต่อผลลัพธ์เลยดังนั้นโอกาสที่ดีสำหรับ Sql Server ที่จะประหยัดเวลาดำเนินการ Query โดยการข้ามการตรวจสอบเงื่อนไขที่ไม่จำเป็น .

ในกรณีของ"AND"ถ้าเงื่อนไขแรกถูกประเมินเป็นFALSEโซ่ทั้งหมดที่เชื่อมต่อกับ"AND"จะถือว่าเป็นการประเมินเป็น FALSE โดยไม่ต้องประเมินผู้อื่น

condition1 AND condition2 AND ..... conditionN

ถ้า condition1 ถูกประเมินเป็นFALSEให้พักเงื่อนไขทั้งหมดจนกว่าconditionNจะถูกข้าม ในคำทั่วไปที่กำหนดFALSEแรกเงื่อนไขอื่น ๆ ทั้งหมดที่เชื่อมโยงโดยและจะถูกข้าม

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


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