SQL Server Sorgu Deposu - 'Geçici' sorgu nedir?


10

SQL Server Sorgu Deposu'na derin bir dalış yapıyorum ve sık sık 'ad-hoc' sorgularına başvurular görüyorum. Ancak, Query Store'un geçici bir sorguyu ne belirlediğini görmedim. Ben parametreleri olmadan bir sorgu veya sadece bir kez yürütülen bir sorgu olarak çıkarım olabilir yerler gördüm. Bunun için resmi bir tanım var mı? Genel olarak demek istemiyorum. Yani Query Store ile ilgili.

Örnek olarak, bu sayfa geçici sorguları sorgu deposundan kaldırma örneğini gösterir, ancak kullandığı ölçüt yalnızca bir yürütme sayısıdır. Bu geçici bir sorgunun garip bir tanımı gibi görünüyor. BTW, sayfaya giderseniz 'Geçici sorguları sil' ifadesini arayın.



@SqlWorldWide - Sorumu yeniden yazdım. Genel olarak demek istemiyorum. Yani Query Store ile ilgili.
Randy Minder

Sorgu deponuz nasıl yapılandırılır - tümü veya otomatik?
Kin Shah

@Kin - Otomatik olarak ayarlandı
Randy Minder

Yanıtlar:


8

Biraz araştırma yaptıktan sonra, bu soruyu cevaplamak için Microsoft'un belgelerinden somut ve tatmin edici bir kaynak bulamadım. Adhoc / ad-hoc / ad hoc'un birçok iyi üçüncü taraf açıklaması ve tanımı var, ancak bu sorunun özgüllüğü için kaynağa yakın olan birinin ideal olduğunu düşünüyorum.

Bu SO yazısı gibi genel (ancak yine de doğru) tanımları taşımak (teşekkürler SqlWorldWide), belgelerin konuyla ilgili söylediklerine bakarsak, tanımın yürütme sayısına dayanarak bahsettiklerinizle aynı fikirde olur , Gerçeği alabileceğimiz noktaya kadar düşünüyorum.

Geçici iş akışları için optimizasyon makalesinde ,

Bu seçenek 1 olarak ayarlandığında, tam bir derlenmiş plan yerine bir toplu iş ilk kez derlendiğinde, Veritabanı Altyapısı küçük bir derlenmiş plan saplama saklar. Bu, plan önbelleğinin yeniden kullanılmayan derlenmiş planlarla dolmasına izin vermeyerek bellek baskısını hafifletmeye yardımcı olur. Derlenmiş plan saplaması, Veritabanı Motorunun bu geçici grubun daha önce derlendiğini, ancak yalnızca derlenmiş bir plan saplamasını sakladığını tanımasına izin verir, bu nedenle bu toplu işlem tekrar çağrıldığında (derlendi veya yürütüldüğünde), Veritabanı Motoru toplu işlemi derler ... ve derlenen planın tamamını plan önbelleğine ekler.

Dolayısıyla, geçici sorgu sunucusu yapılandırma seçeneği, ad hoc'un tanımı olarak tek bir yürütmenin tanımını da kullanır. Sorgu yürütülmeye devam ederse ve aynı planı oluşturursa, artık bu şekilde ele alınmaz.

Sorgu Deposu için En İyi Uygulamalar makalesi de bununla uyumludur,

Farklı query_hash değerlerinin sayısını sys.query_store_query'deki toplam girdi sayısı ile karşılaştırın. Oran 1'e yakınsa, geçici iş yükünüz farklı sorgular oluşturur.

Bu, elbette, önceden saklı yordamlar olarak kullanılmayan, parametreleştirilmiş vb.

Tüm bunlara dayanarak, bir sorgunun aşağıdaki durumlarda geçici olarak ele alındığını söyleyebiliriz:

  • Parametrelendirilmemiş
  • Programlı olarak veritabanında saklanmaz (saklanan proc, işlev, tetikleyici vb.)
  • Aynı sorgu yalnızca bir kez yürütülür VEYA Aynı sorgu birden çok kez yürütülür, ancak sonraki her yürütme için farklı bir sorgu planı oluşturur.

4

Geçici sorgular için, sys.query_store_query belgelerinde belirtildiği gibi DMV'deki object_id sütunu sys.query_store_query0 olacaktır :

nesne_kimliği :

Sorgunun parçası olduğu veritabanı nesnesinin kimliği (saklı yordam, tetikleyici, CLR UDF / UDAgg vb.). Sorgu bir veritabanı nesnesinin bir parçası olarak yürütülmezse (geçici sorgu).

Bunu açıkça "bu gibi ifade olmasa bile, bu değere bağlı olarak anlık sorgular belirleyebilir tanım reklama-hoc sorguları ". :)


0

Geçici terimi, yalnızca bir kez yürütülen sorguları belirtmek için kullanılır. Bu, "Geçici iş yükleri için en iyi duruma getir" veritabanı ayarı için kullanılan tanımla tutarlıdır.

Geçici sorguları silmeyle ilgili başvurduğunuz bağlantı bu özel tanımı "Geçici sorguları sil: Bu yalnızca bir kez yürütülen ve 24 saatten eski sorguları siler."


0

Geçici gelen sys.dm_exec_cached_plans DMV en objtypedocs.microsoft.com sütun.

Adhoc: Geçici sorgu. Uzak yordam çağrıları yerine osql veya sqlcmd kullanılarak dil olayları olarak gönderilen Transact-SQL'i ifade eder.

Bu sütunun bir kullanımı, birden fazla plana sahip Sorgular durumunda birden fazla planın neden olup olmadığını görmek içindir Adhoc.

    SELECT  DISTINCT 
        QCP.objtype
        ,MultipleQ.PlanCount
        ,qStat.query_hash
        ,sText.text AS QueryText
FROM ( 
        SELECT query_hash,
               COUNT(query_hash) AS PlanCount
        FROM sys.dm_exec_query_stats
        GROUP BY query_hash
    ) AS MultipleQ
INNER JOIN sys.dm_exec_query_stats qStat ON MultipleQ.query_hash = qStat.query_hash
INNER JOIN sys.dm_exec_cached_plans  QCP
    ON QCP.plan_handle = qStat.plan_handle
CROSS APPLY sys.dm_exec_sql_text(qStat.sql_handle) AS sText
CROSS APPLY sys.dm_exec_query_plan(qStat.plan_handle) AS qp
WHERE PlanCount > 1
ORDER BY MultipleQ.PlanCount DESC

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.