it-swarm.asia

هل تم تحسين طرق العرض عندما أضيف إليها عبارة WHERE؟

هل يحدث فرقا إذا قمت بتصفية عرض داخل أو خارج العرض؟

على سبيل المثال ، هل هناك فرق بين هذين الاستعلامين؟

SELECT Id
FROM MyTable
WHERE SomeColumn = 1

أو

SELECT Id
FROM MyView
WHERE SomeColumn = 1

ويتم تعريف MyView على أنه

SELECT Id, SomeColumn
FROM MyTable

وهل الجواب مختلف إذا كان الجدول المصدر موجودًا على خادم مرتبط؟

أنا أسأل لأنه يجب علي الاستعلام عن جدول كبير (44mil rows) مرتين من خادم مرتبط ، والحصول على تجميع للنتائج. أريد أن أعرف ما إذا كان ينبغي عليّ إنشاء ملفين شخصيين للوصول إلى البيانات ، واحد لكل طلب بحث ، أو إذا كان بإمكاني الإفلات من خلال عرض واحد وبند WHERE.

30
Rachel

يجب ألا ترى أي اختلاف على الإطلاق في الخطط أو الأداء بين هذين الخيارين. عندما يتم الاستعلام عن العرض ، يتم توسيعه إلى استعلام مقابل الجدول الأساسي ، مما يعني أنه سيتم استخدام نفس البحث أو المسح.

الآن ، اعتمادًا على نوع البيانات والانتقائية لـ MyColumn ، إذا أردت إنشاء فهرس تمت تصفيته في الجدول الأساسي (عند الانتقال إلى SQL Server 2008+) ، فقد تحصل على أداء أفضل ، ولكن هذا مرة أخرى لا تكون مختلفة عن طريق العرض أو بدونه.

14
Aaron Bertrand

في ما يلي مثال سريع يوضح أنه لا يجب أن يكون هناك فرق. قاعدة البيانات هي قاعدة البيانات AdventureWorks.

تعريفان للعرض:

create view Person.vContactWhere
as

    select *
    from person.Contact
    where ContactID = 24

go

create view Person.vContactNoWhere
as

    select *
    from person.Contact

go

سيكون هنا الاستعلام الأول ، مع تضمين البند WHERE في تعريف العرض:

select *
from person.vContactWhere

هنا خطة التنفيذ:

enter image description here

والاستعلام الثاني ، باستخدام عبارة WHERE ليس في تعريف العرض ، ولكن في استعلام SELECT:

select *
from person.vContactNoWhere
where ContactID = 24

هنا خطة التنفيذ:

enter image description here

كما ترى من خطط التنفيذ هذه ، فهي متطابقة مع نتائج متطابقة. لا أعرف موقفًا يؤدي فيه هذا النوع من المنطق/التصميم إلى إخراج نتائج مختلفة. لذا سأكون على استعداد للقول أنك بأمان في كلتا الحالتين ، واذهب مع التفضيلات الشخصية (أو إجراءات المتجر).

6
Thomas Stringer

بناءً على ماذاأناقراءة ، ستستخدم SQL طريقة عرض قياسية مثل استعلام فرعي عند تحديد خطة التنفيذ.

لذا باستخدام مثال الاستعلام الخاص بي ،

SELECT Id
FROM MyView
WHERE SomeColumn = 1

حيث MyView يعرف بأنه

SELECT Id, SomeColumn
FROM MyTable

يجب أن تولد نفس خطة التنفيذ

SELECT Id
FROM 
(
    SELECT Id, SomeColumn
    FROM MyTable
) as T
WHERE SomeColumn = 1

ولكن قد تختلف خطة التنفيذ هذه عما سيتم إنشاؤه

SELECT Id
FROM MyTable
WHERE SomeColumn = 1

لست متأكدًا مما إذا كانت هذه الإجابة هي نفسها بالنسبة إلى طرق العرض المفهرسة

2
Rachel