ฉันจะค้นหามุมมองบันทึก 20 ล้านรายการนี้เร็วขึ้นได้อย่างไร


14

สำหรับฟังก์ชั่นการค้นหาฉันใช้มุมมองที่มีระเบียนจากตารางทั้งหมดที่ฉันต้องการค้นหา มุมมองมีเกือบ 20 ล้านบันทึก การค้นหามุมมองนี้ใช้เวลานานเกินไป

ฉันควรปรับปรุงการทำงานของมุมมองนี้ที่ไหน

คำจำกัดความคร่าวๆสำหรับมุมมองด้านล่าง ประกอบด้วยสิบสามตารางและรอบ ๆ สามสิบฟิลด์

CREATE VIEW [dbo].[v_AllForSearch]
AS
SELECT 
  FT.firstField AS [firstField]
, FT.fld_primary AS [fld_primary]
, FT.fld_thirdField AS [thirdField]
, FT.fld_fourthField AS [fourthField]           
, ISNULL(ST.[fld_firstSearchField],'') AS [firstSearchField]
, ISNULL(TT.[fld_thirdSearch],'') AS thirdSearch
, ISNULL(TT.[fld_fourthSearch],'')AS fourthSearch
, ISNULL(TT.[fld_fifthSearch],'')AS fifthSearch
, ISNULL(FRT.[fld_sixthSearch],'') As [sixthSearch]
, ISNULL(FRT.[fld_seventhSearch],'') AS [seventhSearch]
, ISNULL(FRT.[fld_eightSearch],'')AS [eightSearch]
, ISNULL(FIT.[fld_nineSearch],'') AS [nineSearch]
, ISNULL(SIT.[fld_tenthSearch],'')AS [tenthSearch]
, ISNULL(SET.[fld_eleventhSearch],'') AS [eleventhSearch]
, ISNULL(ET.[twelthSearch],'')AS [twelthSearch]
, ISNULL(NT.[thirteenthSearch],'')AS [thirteenthSearch]
, ISNULL(NT.[fourteenSearch],'') AS [fourteenSearch]
, ISNULL(NT.[fifteenSearch],'') AS [fifteenSearch]
, ISNULL(NT.[sxteenSearch],'')  AS [sxteenSearch]
, ISNULL(NT.[seventeenSearch],'') AS [seventeenSearch]
, ISNULL(NT.[eighteenSearch],'')AS [eighteenSearch]
, ISNULL(TT.[ninteenSearch],'') AS [ninteenSearch]
, ISNULL(ELT.[twentySearch],'') AS [twentySearch]
, ISNULL(ELT.[twentyOneSearch],'') AS [twentyOneSearch]
, ISNULL(TWT.[twentyTwoSearch],'') AS [twentyTwoSearch]
, ISNULL(THT.twentyThree,'') AS [twentyThree]
, ISNULL(THT.twentyFour,'') AS [twentyFour]
, ISNULL(THT.twentyFive,'') AS [twentyFive]
, ISNULL(THT.twentySix,'') AS [twentySix]
FROM 
      tblFirstTable AS FT         
      LEFT JOIN [tblSecondTable] AS ST 
            ON ST.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblThirdTable] AS TT 
            ON TT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblFourthTable] AS FRT 
            ON FRT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblFifthTable] AS FIT 
            ON FIT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblSixthTable] AS SIT 
            ON SIT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblSeventhTable] AS SET 
            ON SET.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblEighthTable] AS ET 
            ON ET.[fld_primary] = FT.[fld_primary] 
      LEFT JOIN [tblNinthTable] AS NT 
            ON NT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblELTnthTable] AS TT 
            ON TT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblEleventhTable] AS ELT 
            ON ELT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblTwelthTable] AS TWT 
                            ON TWT.[fld_id] = ELT.[fld_id]  
              LEFT JOIN [tblThirteenthTable] AS THT
            ON THT.[firstField]= FT.[firstField]
WHERE fld_Status ..

คำตอบ:


9

มุมมองคือแมโครที่ขยาย ดังนั้นหากมุมมองของคุณเข้าร่วม 2 ตารางแผนการดำเนินการจะแสดงตาราง 2 ตาราง มุมมองมีความโปร่งใส

สิ่งนี้จะไม่นำไปใช้หากมุมมองถูกทำดัชนี / ปรากฏเป็นรูปเป็นร่าง อย่างไรก็ตามคุณจะไม่ถามคำถามนี้

แผนปฏิบัติการพูดว่าอย่างไร? DTA ดัชนีที่ขาดหายไปแบบสอบถาม DMV? แบบสอบถาม dmv ที่แพงที่สุด?


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

@ โจ: อาจเป็นไปได้ แต่จากนั้น OP จะไม่ขอความช่วยเหลือหากพวกเขารู้ถึงความแตกต่าง ...
gbn

คำถามคือแท็กสำหรับ MS SQL Server เพื่อให้มากกว่า "รูปธรรมมุมมอง" เราควรจะพูดคุยเกี่ยวกับ "มุมมองการจัดทำดัชนี";)
AndrewSQL

1
@AndrewSQL: ฉันทำ แต่เราควรให้ความสำคัญสำหรับรูปแบบของชีวิตที่ต่ำกว่า ...
GBN

6

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


1
แต่ฉันอยู่ภายใต้ความประทับใจที่ว่ามุมมองโดยทั่วไปไม่ได้รับประโยชน์อย่างมากจากดัชนี (... ตาม "ฉันได้รับการบอกจากคนที่ฉันรู้จัก")
jcolebrand

5
@ jcolebrand: มุมมองโดยทั่วไปได้รับการช่วยเหลืออย่างมากจากดัชนีขึ้นอยู่กับวิธีการใช้งาน เป็นหลักเมื่อใช้ในแบบสอบถามที่กำหนดพวกเขาจะได้รับประโยชน์ราวกับว่าใส่รหัสของพวกเขาลงในแบบสอบถามโดยตรง สำหรับมุมมองแบบง่าย + แบบสอบถามนี้หมายความว่าพวกเขาใช้ดัชนีเช่นเดียวกับแบบสอบถามแบบง่าย ๆ สำหรับมุมมอง / คิวรีที่ซับซ้อนยิ่งขึ้นมันขึ้นอยู่กับว่าผู้วางแผนคิวรีสามารถจัดเรียงใหม่และปรับงานให้เหมาะสม วิธีที่ดีที่สุดที่จะเห็นสิ่งนี้คือการเลือกชุดข้อมูลขนาดใหญ่และสร้างมุมมองและแบบสอบถามตัวอย่างที่ใช้และดูว่าแผนแบบสอบถามของ SSMS แสดงว่า QP ทำอะไรกับพวกเขา
David Spillett

6

นอกจากสิ่งที่คนอื่นพูด (WHERE clause, INDEX ที่อาจช่วยได้) ฉันขอแนะนำให้คุณอาจพิจารณามุมมองที่จัดทำดัชนีโดยสมมติว่าเป็นไปได้ที่จะสร้างดัชนีในมุมมอง ( รายละเอียด ) จากนั้นคุณอาจใช้คำใบ้ NOEXPAND ในการสอบถามของคุณ ( รายละเอียด )


รายละเอียดเหล่านี้ฟังดูเป็นสัญญาขอให้ฉันลองสิ่งเหล่านั้นและจะได้รับผลตอบแทน
Balu

4

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


0

สิ่งที่ฉันน่าจะทำคือแค่สร้าง 2 มุมมอง

  • มุมมองที่ 1 เป็นเพียงฟิลด์ที่ฉันต้องการค้นหา เพียงแค่เขตข้อมูลเหล่านั้น ฉันจะส่งคืน ID ฟิลด์ของแต่ละแถวพร้อมด้วยตารางที่คุณค้นหา ฉันทำสิ่งที่คล้ายกันโดยสร้างมุมมอง UNION ALL ที่ค้นหาหลายตาราง ฉันเพิ่งแน่ใจว่าได้ใส่รหัสประเภทและฟิลด์ข้อความฉันต้องการค้นหา

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

ฉันจะทำ UNION ALL โดยมี GROUP BY ที่ด้านล่างและฉันจะไม่ทำสิ่งที่เหลืออยู่นอกเข้าร่วม

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