فهم تلميحات الاستعلام
تلميحات الاستعلام هي خيارات أو استراتيجيات يمكن تطبيقها لفرض معالج الاستعلام لاستخدام عامل تشغيل معين في خطة التنفيذ لعبارات SELECTأو INSERTUPDATEأو أوDELETE. تتجاوز تلميحات الاستعلام أي خطة تنفيذ قد يحددها معالج الاستعلام لاستعلام معين باستخدام العبارة OPTION .
في معظم الحالات، يحدد محسن الاستعلام خطة تنفيذ فعالة استنادا إلى الفهارس والإحصائيات وتوزيع البيانات. نادرا ما يحتاج مسؤولو قاعدة البيانات إلى التدخل يدويا.
يمكنك تغيير خطة تنفيذ الاستعلام عن طريق إضافة تلميحات الاستعلام إلى نهاية الاستعلام. على سبيل المثال، إذا أضفت OPTION (MAXDOP <integer_value>) إلى نهاية استعلام يستخدم وحدة معالجة مركزية واحدة، فقد يستخدم الاستعلام وحدات معالجة مركزية متعددة (التوازي) اعتمادا على القيمة التي تختارها. أو يمكنك استخدام OPTION (RECOMPILE) للتأكد من أن الاستعلام ينشئ خطة مؤقتة جديدة في كل مرة يتم تنفيذها.
--With maxdop hint
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (MAXDOP 2)
GO
--With recompile hint
SELECT City
FROM Person.Address
WHERE StateProvinceID=15 OPTION (RECOMPILE)
GO
على الرغم من أن تلميحات الاستعلام قد توفر حلا مترجما لمختلف المشكلات المتعلقة بالأداء، يجب تجنب استخدامها في بيئة الإنتاج للأسباب التالية.
- يمكن أن يؤدي وجود تلميح استعلام دائم على الاستعلام إلى تغييرات قاعدة البيانات الهيكلية التي قد تكون مفيدة لذلك الاستعلام غير قابل للتطبيق.
- لا يمكنك الاستفادة من الميزات الجديدة والمحسنة في الإصدارات اللاحقة من SQL Server إذا قمت بربط استعلام بخطة تنفيذ معينة.
ومع ذلك، هناك العديد من تلميحات الاستعلام المتوفرة على SQL Server، والتي تستخدم لأغراض مختلفة. دعونا نناقش بعض منها أدناه:
FAST <integer_value>— يسترد أول <عدد integer_value> من الصفوف أثناء متابعة تنفيذ الاستعلام. يعمل بشكل أفضل مع مجموعات البيانات الصغيرة والقيمة المنخفضة لتلميح الاستعلام السريع. مع زيادة عدد الصفوف، تصبح تكلفة الاستعلام أعلى.OPTIMIZE FOR—يوفر إرشادات لمحسن الاستعلام بأنه يجب استخدام قيمة معينة لمتغير محلي عند تجميع استعلام وتحسينه.USE PLAN—يستخدم محسن الاستعلام خطة استعلام محددة بواسطة السمة xml_plan .RECOMPILE— ينشئ خطة مؤقتة جديدة للاستعلام ويتجاهلها مباشرة بعد تنفيذ الاستعلام.{ LOOP | MERGE | HASH } JOIN—يحدد تنفيذ كافة عمليات الربط بواسطةLOOP JOINأوMERGE JOINأوHASH JOINفي الاستعلام بأكمله. يختار المحسن استراتيجية الانضمام الأقل تكلفة من بين الخيارات إذا قمت بتحديد أكثر من تلميح صلة واحد.MAXDOP <integer_value>—يتجاوز الحد الأقصى لدرجة قيمة التوازي لsp_configure. يتجاوز الاستعلام الذي يحدد هذا الخيار أيضا Resource Governor.
يمكنك أيضا تطبيق تلميحات استعلام متعددة في نفس الاستعلام. يستخدم HASH GROUP المثال التالي تلميحات الاستعلام و FAST <integer_value> في نفس الاستعلام.
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO
لمعرفة المزيد حول تلميحات الاستعلام، راجع تلميحات (Transact-SQL).
تلميحات مخزن الاستعلام
توفر تلميحات مخزن الاستعلام طريقة بسيطة لتشكيل خطط الاستعلام دون تعديل التعليمات البرمجية للتطبيق.
تكون تلميحات مخزن الاستعلام مفيدة عندما لا يقوم محسن الاستعلام بإنشاء خطة تنفيذ فعالة، وعندما لا يتمكن المطور أو DBA من تعديل نص الاستعلام الأصلي. في بعض التطبيقات، قد يكون نص الاستعلام مشفرا أو يتم إنشاؤه تلقائيا.
لاستخدام تلميحات Query Store، تحتاج إلى تحديد Query_id Query Store لبيان الاستعلام الذي ترغب في تعديله من خلال طرق عرض كتالوج Query Store أو تقارير Query Store المضمنة أو Query Performance Insight لقاعدة بيانات Azure SQL. ثم قم بتنفيذ sp_query_store_set_hints مع سلسلة تلميح query_id والاستعلام التي ترغب في تطبيقها على الاستعلام.
يوضح المثال التالي كيفية الحصول على query_id لاستعلام معين ثم استخدامه لتطبيق RECOMPILE تلميحات و MAXDOP على الاستعلام.
SELECT q.query_id, qt.query_sql_text
FROM sys.query_store_query_text qt
INNER JOIN sys.query_store_query q
ON qt.query_text_id = q.query_text_id
WHERE query_sql_text like N'%ORDER BY CustomerName DESC%'
AND query_sql_text not like N'%query_store%'
GO
--Assuming the query_id returned by the previous query is 42
EXEC sys.sp_query_store_set_hints @query_id= 42, @query_hints = N'OPTION(RECOMPILE, MAXDOP 1)'
GO
هناك بعض السيناريوهات حيث يمكن أن تساعد تلميحات Query Store في مشكلات الأداء على مستوى الاستعلام.
- إعادة تحويل استعلام في كل تنفيذ.
- الحد من الحد الأقصى لدرجة التوازي لعملية تحديث إحصائي.
- استخدم صلة التجزئة بدلا من ربط التكرارات الحلقية المتداخلة.
- استخدم مستوى التوافق 110 لاستعلام معين مع الاحتفاظ بقاعدة البيانات عند التوافق الحالي.
لمزيد من المعلومات حول تلميحات Query Store، راجع تلميحات Query Store.