ความหมายของประสิทธิภาพของการใช้ OPENQUERY ในมุมมอง


15

โปรดดูคำถามนี้ใน stackoverflow:

ฉันใช้ไดรเวอร์ EasySoft ODBC เพื่อเชื่อมโยงอินสแตนซ์ของ SQL Server 2008 R2 Express ไปยัง Interbase และฉันประสบปัญหาในการรับข้อมูลเมตาจากเซิร์ฟเวอร์ระยะไกล จากการมองหาบนเครือข่าย sugestions หลักทั้งหมดพูดถึงการใช้ OPENQUERY แทนไวยากรณ์เซิร์ฟเวอร์ที่เชื่อมโยงสี่ส่วน

EG วิธีการปัจจุบันของฉัน (มีปัญหา) คือ ...

CREATE VIEW [LIVE].[vwPRDETS]
AS

SELECT *
FROM [LBLIVE]...[PRDETS] WITH (NOLOCK)

แต่ในบางตารางฉันได้รับข้อผิดพลาดเมื่อเรียกดู ...

ข่าวสารเกี่ยวกับ 7353 ระดับ 16 สถานะ 1 บรรทัด 1 ตัวให้บริการ OLE DB "MSDASQL" สำหรับเซิร์ฟเวอร์ที่เชื่อมโยง "LBLIVE" ที่ให้ข้อมูลเมตาที่ไม่สอดคล้องกัน มีการระบุคอลัมน์พิเศษในระหว่างการดำเนินการที่ไม่พบในเวลารวบรวม

นอกจากนี้บางมุมมองที่ฉันไม่สามารถสร้างได้เพราะฉันได้รับสิ่งต่อไปนี้ ...

ข่าวสารเกี่ยวกับ 7315 ระดับ 16 สถานะ 1 บรรทัด 1 ตัวให้บริการ OLE DB "MSDASQL" สำหรับเซิร์ฟเวอร์ที่เชื่อมโยง "LBLIVE" ประกอบด้วยหลายตารางที่ตรงกับชื่อ "" SYSDBA "" AUDIT_LBABKP "

แม้ว่าจะมีเพียงตารางเดียวที่กล่าวมา

วิธีการอื่นในการค้นหาเน็ตดูเหมือนจะเป็นเหมือน ...

SELECT *
FROM OPENQUERY(<linked sevrer>, 'SELECT <column list> FROM MyTable')

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

มันเป็นเรื่องที่ข้ามและจะรัก POV ของ DBA

คำตอบ:


20

สรุป

ปล่อยให้เซิร์ฟเวอร์ที่เชื่อมโยงทำเท่าที่จะทำได้
เป็นไปไม่ได้ที่ SQL Server จะปรับการสืบค้นบนเซิร์ฟเวอร์ที่เชื่อมโยงให้เหมาะสมแม้กระทั่ง SQL Server อื่น

ยาว

ปัจจัยสำคัญคือที่ทำงานของแบบสอบถาม

ในกรณีนี้มันเป็น SELECT เล็ก ๆ น้อย ๆ ดังนั้นแถวทั้งหมดจากตารางจะถูกส่งลงสาย มันไม่สำคัญ

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

ตัวอย่างเช่นกรณีที่ 2 ที่นี่ควรมีประสิทธิภาพมากกว่า

SELECT *
FROM OPENQUERY(<linked server>, 
            'SELECT <column list> FROM MyTable') T1
     JOIN
     SomeLocalTable T2 ON ...
WHERE T1.foo = 'bar'

SELECT *
FROM OPENQUERY(<linked server>, 
           'SELECT <column list> FROM MyTable WHERE foo = ''bar''')
     JOIN
     SomeLocalTable T2 ON ...

ข้อ จำกัด ของ OPENQUERY คือคุณไม่สามารถกำหนดพารามิเตอร์ได้ดังนั้นคุณต้องใช้ SQL แบบไดนามิกเพื่อเพิ่ม WHERE clauses และอื่น ๆ

sp_serveroptionประสิทธิภาพการทำงานของเซิร์ฟเวอร์ที่เชื่อมโยงได้รับผลกระทบจาก การตั้งค่าcollation compatibleบอกว่ามันทั้งหมด

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

นั่นคือพยายามอย่าให้ SQL Server ประมวลผลข้อมูลในเครื่อง

หมายเหตุ: ในfoo = 'bar'ตัวอย่างที่ 2 ของฉันด้านบนตัวกรองจะถูกส่งไปยังเซิร์ฟเวอร์ที่เชื่อมโยงเพราะมันเป็นเพียงค่าคงที่สตริงไปยัง SQL Server WHERE clause จริงในตัวอย่างแรกอาจถูกส่งจากระยะไกลหรือไม่ก็ได้

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


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