Stored Procedure ส่งคืนผลลัพธ์ที่ซ้ำกันโดยที่ sql ไม่ทำงานโดยตรง

เรามีขั้นตอนการจัดเก็บใน SQL Server 2005 พร้อมด้วยแบบสอบถามแบบใช้เลือกข้อมูลเดี่ยวที่ซับซ้อน เมื่อเร็วๆ นี้ในสภาพแวดล้อมเดียว เราสังเกตเห็นว่าสำหรับชุดย่อยเล็กๆ ของผลลัพธ์ที่ส่งคืนโดย proc ที่เก็บไว้ มีบันทึกที่ซ้ำกัน เมื่อเรารันการสืบค้น sql โดยตรง เราได้ชุดบันทึกที่ถูกต้องโดยไม่มีการซ้ำกัน ขั้นตอนการจัดเก็บใช้มุมมองและการรวมจำนวนมาก (การรวมภายใน/การรวมด้านซ้าย) ทฤษฎีหนึ่งที่ฉันมีก็คือ กระบวนการจัดเก็บกำลังใช้แผนการดำเนินการที่แคชไว้ เนื่องจากเราได้แก้ไขมุมมองบางส่วนเมื่อเร็วๆ นี้ แต่ฉันไม่มีความเชี่ยวชาญด้าน SQL เพียงพอที่จะแน่ใจในสิ่งนั้น ใครมีความคิดบ้างไหม?

ขอบคุณสำหรับความช่วยเหลือของคุณอาชิช


person Ashish    schedule 05.08.2011    source แหล่งที่มา
comment
คุณต้องให้ข้อมูลเพิ่มเติม มีการกำหนดค่าระดับการแยกใน proc หรือไม่ คุณช่วยโพสต์โค้ดตัวอย่างได้ไหม   -  person JNK    schedule 05.08.2011
comment
ฉันว่าคุณกำลังเห่าต้นไม้ผิดโดยคิดว่ามันเป็นแผนการดำเนินการที่แคชไว้ คุณควรโพสต์ SQL ให้มากที่สุดเท่าที่จะเป็นไปได้ในคำถามของคุณและให้คนอื่นตรวจสอบสิ่งนั้น   -  person Al W    schedule 05.08.2011
comment
คุณแน่ใจว่าคุณใช้พารามิเตอร์ประเภทเดียวกันทุกประการเมื่อคุณเรียกใช้แบบสอบถามโดยตรง คุณกำลังประกาศตัวแปรประเภทเดียวกันกับพารามิเตอร์ sp และใช้งานเมื่อรันโดยตรงหรือเพียงแค่ฮาร์ดโค้ดค่า?   -  person alun    schedule 05.08.2011
comment
ฉันไม่เคยเห็นสิ่งที่คุณพูดถึง บ่อยครั้งคำตอบที่ง่ายที่สุดคือคำตอบที่ถูกต้อง ข้อมูลของคุณเปลี่ยนแปลงระหว่างการดำเนินการครั้งแรกและครั้งที่สองหรือไม่? บางทีคุณอาจมีการดำเนินการที่เพิ่มระเบียน คิวรีของคุณดำเนินการแล้วแถวถูกลบซึ่งทำให้เกิดรายการซ้ำ   -  person Paul Mendoza    schedule 06.08.2011


คำตอบ (2)


ผลลัพธ์ที่แตกต่างกันอาจเกิดจากการตั้งค่าการเชื่อมต่อที่แตกต่างกัน (เช่น ansi_nulls, arith_abort เป็นต้น)

person MaD    schedule 27.08.2011

เรียกใช้sp_recompileในกระบวนงานที่เก็บไว้เพื่อล้างแคชของกระบวนงานสำหรับกระบวนงานที่เก็บไว้นั้น

หากต้องการล้างแคชของขั้นตอนทั้งหมดให้ดำเนินการ

DBCC ฟรีโปรแคช

นี่คือตัวอย่างของการคอมไพล์ใหม่หากคุณต้องการใส่ไว้ในสคริปต์ที่นำมาใช้ซ้ำได้:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/****** Object:  Maintenance - StoredProcedure [Sample].[SampleSearch]    Script Date: 07/28/2011 14:15:15 ******/
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'Sample' AND ROUTINE_NAME = 'Sampleearch'))
BEGIN
    PRINT 'Marking procedure [Sample].[SampleSearch] for recompile'
    EXEC sp_recompile 'Sample.SampleSearch'
    PRINT 'Finished marking procedure [Sample].[SampleSearch] for recompile'
END

GO

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

person Jon Raynor    schedule 05.08.2011