İfadedeki tür dönüşümü sorgu planı seçiminde “CardinalityEstimate” 'ı etkileyebilir mi?


10

Geçmiş verileri bölümlenmiş görünümlerde depolayan bir arşiv veritabanı tutuyorum. Bölümleme sütunu bir tarih saatidir. Görünümün altındaki her tablo bir aylık veri depolar.

Her tablodaki olayları datetime sütununda bir kontrol kısıtlamasıyla kısıtlarız. Bu, optimize edicinin olay tarih / saat sütununda filtrelenen sorgular için aranan tabloları sınırlamasına olanak tanır.

Denetim kısıtlamalarının adları SQL Server tarafından üretildi, bu yüzden adlarına bakarak ne yaptıklarını bilmek zor.

Kısıtlama adlarının 'CK_TableName_Partition' biçiminde olmasını istiyorum.

Bu sorguyu kullanarak ve sql_text sütunundan veri kopyalayarak yeniden adlandırma komut dosyası oluşturabilir. WHERE deyimi, adları SQL Server tarafından oluşturulmuş gibi görünen denetim kısıtlamalarıyla eşleşir:

SELECT
  checks.name AS check_name,
  tabs.name AS table_name,
  skemas.name AS schema_name,
  cols.name AS column_name,
  N'
EXECUTE sys.sp_rename
  @objname = N''' + skemas.name + N'.' + checks.name + N''',
  @newname = N''CK_' + tabs.name + N'_Partition'',
  @objtype = ''OBJECT'';' AS sql_text
FROM sys.check_constraints AS checks
INNER JOIN sys.tables AS tabs ON
  tabs.object_id = checks.parent_object_id
INNER JOIN sys.schemas AS skemas ON
  skemas.schema_id = tabs.schema_id
INNER JOIN sys.columns AS cols ON
  tabs.object_id = cols.object_id AND
  cols.column_id = checks.parent_column_id
WHERE checks.name LIKE (
  N'CK__' + SUBSTRING(tabs.name, 1, 9) +
  N'__' + SUBSTRING(cols.name, 1, 5) +
  N'__' + REPLACE(N'xxxxxxxx', N'x', N'[0-9A-F]') COLLATE Latin1_General_BIN2
)
ORDER BY table_name;

Çıktı şöyle görünür:

check_name  table_name  schema_name column_name sql_text
CK__tbAcquisi__Acqui__5C4299A5  tbAcquisitions_201301   Archive AcquisitionDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbAcquisi__Acqui__5C4299A5',  @newname = N'CK_tbAcquisitions_201301_Partition',  @objtype = 'OBJECT';
CK__tbAcquisi__Acqui__76026BA8  tbAcquisitions_201302   Archive AcquisitionDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbAcquisi__Acqui__76026BA8',  @newname = N'CK_tbAcquisitions_201302_Partition',  @objtype = 'OBJECT';
CK__tbAcquisi__Acqui__7D6E8346  tbAcquisitions_201303   Archive AcquisitionDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbAcquisi__Acqui__7D6E8346',  @newname = N'CK_tbAcquisitions_201303_Partition',  @objtype = 'OBJECT';
...
CK__tbRequest__Reque__60132A89  tbRequests_201301   Archive RequestDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbRequest__Reque__60132A89',  @newname = N'CK_tbRequests_201301_Partition',  @objtype = 'OBJECT';
CK__tbRequest__Reque__1392CE8F  tbRequests_201302   Archive RequestDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbRequest__Reque__1392CE8F',  @newname = N'CK_tbRequests_201302_Partition',  @objtype = 'OBJECT';
CK__tbRequest__Reque__1AFEE62D  tbRequests_201303   Archive RequestDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbRequest__Reque__1AFEE62D',  @newname = N'CK_tbRequests_201303_Partition',  @objtype = 'OBJECT';

Sorgunun sonucu doğru gibi görünüyor ve sunucu hızlı bir şekilde yürütüyor.

Ancak, yürütme planının kök düğümünde bir uyarı var:

İfadedeki tür dönüşümü (CONVERT_IMPLICIT (nvarchar (128), [o]. [Ad], 0)), sorgu planı seçiminde "CardinalityEstimate" 'ı etkileyebilir

Bu bağlamda bunun anlamı nedir? Böyle karmaşık bir filtre optimizatörü karıştırıyor mu? Endişelenmem gereken bir şey mi?


2
COLLATE Latin1_General_BIN2İfadeyi yapar checks.nameunsargable. Özel sorgunuz için, kardinalite tahminlerinde ne kadar fark yaratacağı konusunda emin değilsiniz.
Martin Smith

2
İkili varsayarsak COLLATEaralığı ifade çalışması için sadece orada doğru bir yerini alabilir N'[0-9A-F]')ile N'[0123456789ABCDEF]'ve bırakCOLLATE Latin1_General_BIN2
Martin Smith

Yanıtlar:


16

Sorgunun sonucu doğru gibi görünüyor ve sunucu hızlı bir şekilde yürütüyor.

Ancak, yürütme planının kök düğümünde bir uyarı var:

İfadedeki tür dönüşümü (CONVERT_IMPLICIT (nvarchar (128), [o]. [Ad], 0)), sorgu planı seçiminde "CardinalityEstimate" 'ı etkileyebilir

Bu bağlamda bunun anlamı nedir? Böyle karmaşık bir filtre optimizatörü karıştırıyor mu? Endişelenmem gereken bir şey mi?

Uyarı bilgi amaçlıdır. Sorgunuz yavaş çalışıyorsa veya kardinalite tahminlerinin yanlış olduğunu fark ederseniz, uyarı size olası bir nedeni nerede arayacağınız konusunda bilgi verir.

Uyarı, harmanlama değişikliği için kullanılan örtük dönüşüm tarafından tetiklenir. Harmanlamayı kullanmak, doğru sonuçları almanın en kolay yoluysa, olduğu gibi bırakmaktan çekinmeyin. Alternatif olarak, neden gerekli olduğu hakkında daha fazla açıklarsanız, birileri size tavsiyede bulunur.

Bir yana, REPLACEile değiştirilebilir:

REPLICATE(N'[0-9A-F]', 8);

(Bu cevap soruya yapılan yorumların bir özetidir.)

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.