คำแนะนำในการวินิจฉัยแบบสอบถามที่ช้า“ บางครั้ง”


20

ฉันมีกระบวนงานที่เก็บไว้ซึ่งส่งคืนผลลัพธ์จากมุมมองที่จัดทำดัชนีผ่านดัชนีครอบคลุม โดยปกติแล้วจะทำงานเร็ว (~ 10ms) บางครั้งสามารถทำงานได้ถึง 8 วินาที

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

declare @p2 dbo.IdentityType
insert into @p2 values(5710955)
insert into @p2 values(5710896)
insert into @p2 values(5710678)
insert into @p2 values(5710871)
insert into @p2 values(5711103)
insert into @p2 values(6215197)
insert into @p2 values(5710780)

exec ListingSearch_ByLocationAndStatus @statusType=1,@locationIds=@p2

นี่คือ SPROC:

ALTER PROCEDURE [dbo].[ListingSearch_ByLocationAndStatus]
    @LocationIds IdentityType READONLY,
    @StatusType TINYINT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT      -- lots of fields
    FROM        [dbo].[ListingSearchView][a] WITH (NOEXPAND)
    INNER JOIN  @LocationIds [b] ON [a].[LocationId] = [b].[Id]
    WHERE       [a].[StatusType] = @statusType
    OPTION (RECOMPILE);

(หมายเหตุ: ฉันเพิ่ม OPTION (RECOMPILE)เพิ่งคำใบ้เมื่อไม่นานมานี้หลังจากได้รับคำแนะนำ แต่ก็ไม่ได้ช่วยอะไร

นี่คือดัชนีครอบคลุม (หมายเหตุ: มุมมองยังมีดัชนีคลัสเตอร์ListingIdซึ่งเป็นค่าเฉพาะ)

CREATE NONCLUSTERED INDEX [IX_ListingSearchView_ForAPI] ON [dbo].[ListingSearchView]
(
    [LocationId] ASC,
    [StatusType] ASC
)
INCLUDE ( -- all the fields in the query) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO

ฉันใส่ profiler trace ด้วยสถิติของ showplan XML

นี่คือหนึ่งช้า (6 วินาที) และแผนที่เกี่ยวข้อง: ป้อนคำอธิบายรูปภาพที่นี่

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

ต่อไปนี้เป็นส่วนขยายของแผนราคาถ้าช่วยได้: ป้อนคำอธิบายรูปภาพที่นี่

นี่คือสคีมาเต็มรูปแบบของตารางมุมมอง / สำรองหากสิ่งนั้นช่วยได้: https://pastebin.com/wh1sRcbQ

หมายเหตุ:

  • ดัชนีมีการดีแฟรกต์สถิติล่าสุด
  • แต่เดิมคำค้นหานั้นตรงกับมุมมอง แต่ฉันย้ายไปที่ SPROC เพื่อพยายามช่วยให้มีเสถียรภาพ ไม่ได้ช่วย
  • การเพิ่มWITH OPTION (RECOMPILE);คำใบ้ (ใช้งานไม่ได้ดังนั้นไม่สามารถดมพารามิเตอร์ได้หรือไม่)
  • บางครั้งแบบสอบถามอื่น ๆ ในระบบก็ทำงานช้าและพวกเขาก็ไม่มีปัญหาที่ชัดเจนในแผนของพวกเขา
  • อาจจะล็อค? ไม่แน่ใจว่าจะยืนยันได้อย่างไร

ความคิดใด ๆ เกี่ยวกับสิ่งที่ฉันสามารถลองต่อไป

ขอบคุณ


1
ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท ทุกคน:โปรดใช้สิ่งอำนวยความสะดวกเพื่อการอภิปรายเพิ่มเติมของคำถามนี้
พอลไวท์พูดว่า GoFundMonica

การเชื่อมโยงให้ได้แบบสอบถาม working.proc ตรงไปตรงมามีความแตกต่างอย่างมากระหว่างจำนวนที่เกิดขึ้นจริงและประมาณแถวซึ่งเป็นพื้นที่ของ concern.I คิดว่าปัญหาอยู่ในมุมมอง query.I คิด data.It ไม่เพียงพอควรจะใกล้เคียง
KumarHarsh

คุณได้ลองเรียกใช้ WhoIsActive (โดย Adam Machanic) ในขณะที่แบบสอบถามกำลังทำงานอยู่หรือไม่ whoisactive.comมันมีข้อมูลเกี่ยวกับการรองานซึ่งจะชี้ให้คุณไปในทิศทางที่ถูกต้อง
MJH

คุณได้กำจัดบางสิ่งบางอย่างภายนอกฐานข้อมูลที่เป็นสาเหตุของสิ่งนี้หรือไม่ อาจมีบางแอปพลิเคชั่นอื่นที่ทำให้เกิดการซิงโครไนซ์ IO กับที่เก็บข้อมูลที่ใช้ร่วมกับ DB หรือไม่
Johan

คำตอบ:


2

ฉันไม่คิดว่าการใช้OPTION (RECOMPILE)เป็นวิธีที่มีประสิทธิภาพในการกำจัดความเป็นไปได้ของการดมพารามิเตอร์

การดมพารามิเตอร์เกิดขึ้นเมื่อ SQL สับสนเกี่ยวกับการสืบค้นเฉพาะและคิดว่าเป็นสิ่งใหม่เพราะเห็นพารามิเตอร์ใหม่ ช้าเพราะใช้เวลาเพิ่มในการสร้างแผนการดำเนินการใหม่

ตัวเลือกทั้งหมดนั้นคือบังคับให้ SQL สร้างแผนใหม่ทุกครั้งที่เหมือนกันมาก แต่คุณอาจต้องการพิจารณาเพิ่มพารามิเตอร์เริ่มต้นโดยใช้คำใบ้นี้:

OPTION(OPTIMIZE FOR(@LocationIds='xx',@StatusType='xx'))

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


1

อาจพยายามบังคับคำสั่งซื้อดังนั้นคุณอาจเริ่มต้นด้วยตารางที่เล็กกว่า (ตัวแปร) นั่นเป็นเรื่องยากด้วยมุมมองแม้ว่า ...

    SELECT  -- lots of fields
    FROM    @LocationIds [b] WITH (NOEXPAND)
            INNER JOIN  [dbo].[ListingSearchView][a] WITH (NOEXPAND) 
                ON [a].[LocationId] = [b].[Id]
    WHERE   [a].[StatusType] = @statusType
    OPTION (FORCE ORDER);

หรือคุณสามารถบังคับให้เข้าร่วมลูปถ้านั่นเป็นวิธีที่คุณต้องการรวมตัวแปรตารางเข้ากับมุมมองซึ่งจะบังคับให้ลำดับ ...

    SELECT  -- lots of fields
    FROM    @LocationIds [b] WITH (NOEXPAND)
            INNER LOOP JOIN  [dbo].[ListingSearchView][a] WITH (NOEXPAND) 
                ON [a].[LocationId] = [b].[Id]
    WHERE   [a].[StatusType] = @statusType
    --leaving this here so you don't get an annoying warning 
    OPTION (FORCE ORDER);

0

เขียนชื่อของขั้นตอนการจัดเก็บใน Query Editor จากนั้นเลือก Store proc ชื่อ & จากนั้นเลือกแผนดำเนินการแสดงผลโดยประมาณหรือคลิก (Ctrl + L) ด้านล่างของภาพนี้

ภาพแสดงแผนดำเนินการโดยประมาณ

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

ดังนั้นฉันจึงใช้วิธีนี้ในการวินิจฉัยการค้นหาที่ทำงานช้า และยังมีแบบสอบถามหรือวิธีการมากมายที่คุณสามารถใช้ได้

แผนการดำเนินการโดยมีรายละเอียด


-1

หากคุณคิดว่าปัญหาอยู่ในการบล็อกฉันจะแนะนำให้คุณใช้ระดับการแยกธุรกรรมในแง่ดีอ่านคำมั่นสัญญาที่มุ่งมั่น (โปรดทราบว่าสิ่งนี้จะทำให้ค่าใช้จ่ายใน tempDB ของคุณ)

อ้างอิง: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server

มันเป็นปัญหาที่ไม่ได้อยู่ในการอ่าน / เขียนบล็อกคุณสามารถลองเพิ่มดัชนีในมุมมองของคุณ (ตัวเลือกที่ดีที่สุดของดัชนีขึ้นอยู่กับการเลือกข้อมูลของคุณ)

CREATE NONCLUSTERED INDEX IX_ListingSearchView (LocationID, StatusType) INCLUDE (other columns...)

1
ดัชนีที่คุณแนะนำนั้นมีอยู่แล้วIX_ListingSearchView_ForAPI(ดูสคริปต์ในคำถาม)
พอลไวท์พูดว่า GoFundMonica

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

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

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