รหัสการจัดรูปแบบแบบสอบถาม SQL


17

ฉันควรทำลายแบบสอบถาม SQL ในบรรทัดที่แตกต่างกันหรือไม่ ตัวอย่างเช่นในโครงการที่ฉันกำลังดำเนินการเรามีแบบสอบถามที่ใช้คอลัมน์ 1600! 1600 + ตัวอักษรแท็บ ฉันเขียนข้อความค้นหาเช่นนี้:

   "SELECT bla , bla2 , bla FROM bla " . 
     "WHERE bla=333 AND bla=2" . 
      "ORDER BY nfdfsd ...";

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


การคัดค้านอาจเป็นการใช้คำพูดสอดแทรก (เครื่องหมายคำพูดคู่) และการต่อข้อมูล ( .) ซึ่งฉันได้เห็นโปรแกรมเมอร์บางคนตำหนิสำหรับค่าใช้จ่ายด้านประสิทธิภาพ
Bruce Alderson

3
ทุกอย่างจำเป็นต้องอยู่ใน 1 บรรทัด? สวัสดีแถบเลื่อนอ่านดีลาก่อน
mike30

1
@BruceAlderson เสียงเหมือนหนึ่งในบรรดาต้นปี 2000 "แม่บ้านค้นพบ 3 เคล็ดลับง่ายๆในการเพิ่มประสิทธิภาพ PHP ของคุณ" บทความ แฟล็กสีแดงจริงพร้อมเครื่องหมายคำพูดคู่และ / หรือการต่อข้อมูลจะเกิดขึ้นเมื่อคุณเริ่มแทรกตัวแปรโดยไม่ต้องหลบเลี่ยงพวกเขาอย่างถูกต้องเพื่อสร้างการโจมตี SQL injection
Sean McSomething

1
มีเครื่องมือ "ภายใน" ที่ใช้ในการประมวลผลไฟล์หรือไม่?
เอียน

ทำไมจึงยากที่จะเข้าใจว่าตราบใดที่คุณได้รับการจ่ายเงินให้กับรหัสคุณแสดงความสะอาดเขียนเรียบร้อยรหัสเรียบร้อย?
Tulains Córdova

คำตอบ:


33

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

SELECT bla 
     , bla2 
     , bla 
FROM   bla 
WHERE  bla=333 
  AND  bla=2
ORDER  BY nfdfsd
        , asdlfk;

(การแท็บและการจัดแนวไม่มีมาตรฐานที่นี่ แต่โดยปกติแล้วจุลภาคมักเป็นการนำหน้า)

แต่ถึงกระนั้นก็ไม่ได้สร้างความแตกต่างประสิทธิภาพ


5
ความคิดที่ดีนี้จะทำให้การเปลี่ยนแปลงเล็ก ๆ โดดเด่นอย่างมากในการควบคุมแหล่งที่แตกต่างกัน
Carson63000

การจัดรูปแบบแบบเดียวกับที่ฉันใช้แม้ว่าฉันมักจะใส่รายการที่เลือกทั้งหมดไว้ในบรรทัดเดียว (หรือหลายบรรทัดหากมีคอลัมน์จำนวนมาก)
Dean Dean

7
เลย์เอาต์ที่คล้ายกันที่นี่มีเพียงความแตกต่างในการเป็นคอมม่าชั้นนำเท่านั้น
DBlackborough

4
@ m.edmondson - การกระจายระหว่างเวอร์ชันในการควบคุมแหล่งที่มาเน้นการเปลี่ยนแปลงตามบรรทัดต่อบรรทัด ด้วยรูปแบบนี้แต่ละบรรทัดมีข้อมูลบิตเดียว - ชื่อคอลัมน์ชื่อตารางส่วนคำสั่งการรวมหรือคำสั่ง - ซึ่งหมายความว่า diff จะชี้ไปที่สิ่งที่เปลี่ยนแปลงไม่ใช่เพียงแค่บรรทัดที่มีหลายสิ่งและทำให้คุณ เพื่อหาสิ่งที่แตกต่าง
Jon Hopkins

2
รูปแบบนี้ยังทำให้ง่ายต่อการแสดงความคิดเห็นออกรายการเดียวในระหว่างการพัฒนาและใช้ตัดและวางเพื่อเปลี่ยนการสั่งซื้อ
Chris Nava

14

แบบสอบถามที่มี 1,600 คอลัมน์ดูเหมือนว่าต้องการการตรวจสอบที่จริงจังโดย DBA ที่ดี

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

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

Re: มันเป็นการฝึกเขียนโค้ดที่ไม่ดี แทบจะไม่ได้! เป็นการปฏิบัติที่ดีมาก ไม่มีเหตุผลที่ดีที่ฉันรู้ที่จะใช้แบบสอบถามที่ยาวและเหตุผลที่ดีมากมายที่จะจัดรูปแบบใหม่ อย่างที่ฉันได้พูดไปแล้ว DBA ที่มีทักษะอาจต้องทำงานกับมัน


3
เห็นด้วยทุกอย่างลงมาอ่านง่ายจริงๆ ประสิทธิภาพ ฯลฯ ไม่ได้รับผลกระทบจากสิ่งนี้เลยมันเป็นแค่ความสวยงาม
Christian

ยอมรับว่าการแสดงนั้นไม่สามารถเป็นข้อโต้แย้งที่ดีได้
มนุษย์ดีบุก

ฉันไม่รู้ .. แค่บอกให้ฉันเก็บไว้ในบรรทัดเดียวอาจเป็นเพราะพวกเขาทำ
GorillaApe

พวกเขาอาจจะกลัวที่จะสัมผัสถ้ามันเป็น "รหัส" ดั้งเดิม ถอยห่างออกไปอย่างช้าๆและทุกอย่างจะเรียบร้อย
มนุษย์ดีบุก

รหัสสด ...
GorillaApe

8

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


6

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

ตัวอย่าง:

$a = SQL<<<
    SELECT a, b, c, d
    FROM Foo f
    WHERE f.a = ?
SQL;

เมื่อทำงานกับข้อความค้นหาหลายสิบบรรทัด (หรือหลายร้อย) ทั้งการเยื้องและช่องว่างทำให้ข้อความทำงานได้


1
สำหรับ PHP nowdocsนั้นเป็นแบบหลากหลายที่อ้างถึงเดี่ยว (เช่นไม่มีการทดแทนตัวแปร)
Alan Pearce

4

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

หากเป็นภาษาที่รวบรวมก็ไม่ควรสร้างความแตกต่างเลย - หนึ่งในการปรับแต่งแรกที่คอมไพเลอร์จะทำคือการเชื่อมต่อสตริงตัวอักษรเข้าด้วยกันโดยอัตโนมัติ

สำหรับไวยากรณ์คุณควรพิจารณาย้ายแบบสอบถามนอกรหัสของคุณ - เก็บไว้ในไฟล์ทรัพยากร. sql แยกต่างหากและให้ซอฟต์แวร์ของคุณอ่านไฟล์นั้น ใช้คำสั่งที่เตรียมไว้สำหรับตัวแปรหากไม่ใช่เคียวรีที่สร้างขึ้นแบบไดนามิก (เช่นคำสั่งที่เพิ่ม ฯลฯ ขึ้นอยู่กับพารามิเตอร์บางอย่าง) หากมันถูกสร้างขึ้นแบบไดนามิกคุณสามารถเพิ่มตัวแปรทดแทนของคุณเองโดยใส่พารามิเตอร์เพิ่มเติมได้ทุกที่และทุกเวลาที่ต้องการ

สำหรับคอลัมน์ 1600 ฉันขอแนะนำให้สร้างมุมมองอย่างจริงจังแทนที่จะเป็น

SELECT column1, column2, .... column1600 from X where Y

คุณจะได้รับ

SELECT * จาก viewX WHERE y

กระชับมากขึ้นในรหัสของคุณเอง


+1 และฉันจะลองทำแบบสอบถามเป็นกระบวนงานที่เก็บไว้
Larry Coleman

1

ฉันมักจะใช้รูปแบบที่วางโดย @glasnt เพื่อแก้ไขปัญหาการสืบค้นที่ซับซ้อน แต่มักจะมีการสืบค้นในบรรทัดเดียว

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

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

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

ประโยชน์ที่ชัดเจนสำหรับสิ่งนี้เนื่องจากอาจเกี่ยวข้องกับคุณคือข้อความค้นหาของคุณซับซ้อนน้อยกว่าและอ่านง่าย - ง่ายต่อการจัดการ (ไม่ใช่> 1600 คอลัมน์) และเร็วกว่า ชนะแน่นอนทุกรอบ

หวังว่าจะช่วย :)

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