WHERE sorgusu, daha zorlu karşılaştırmalar (yani varchar) çalıştırmadan önce daha basit karşılaştırmaları (yani bit) denetler mi?


12

Bileşik bir WHEREcümle içeren bir sorgu yazarsanız , örneğin:

SELECT *
FROM MyTable
WHERE BitField = 1
    AND VarcharField = 'asdf'

ve bu bitkarşılaştırmanın dahil edilmesi, karşılaştırmanın hariç varchartutacağı alanları hariç tutar; bu bitalan karşılaştırmasının varlığı bana bir performans artışı sağlayacak mı?

Yanıtlar:


22

SQL'in bildirimsel bir dil olduğunu bilmek önemlidir. SELECTSorgu belirtir döndürülmesi gereken mantıksal sonuçlarını yazdı. Bu sonuçları döndürmek için etkili bir fiziksel strateji belirlemek veritabanı motoruna, özellikle sorgu iyileştiriciye bağlıdır.

Nihai fiziksel uygulama planı, optimize edicinin muhakeme yeteneklerine, soruna harcamak için hazırlandığı süreye, uygun erişim yöntemlerinin (öncelikle dizinler ve materyalize görünümler) kullanılabilirliğine, temsili istatistik bilgilerine ve belirli kod yoluna bağlı olacaktır. sorgu belirtimi, optimizasyon kodunu kullanır.

Genel olarak, veritabanı tasarımınız ilişkisel ise, iyi erişim yöntemleri ve doğru istatistiksel bilgiler sağlarsınız ve sorgu iyi yazılırsa, optimize edici normalde yazılı form hakkında çok fazla endişelenmenize gerek kalmadan makul bir fiziksel yürütme stratejisi bulur. sorgu belirtimi çok fazla.

Her zaman farklı (ama anlamsal olarak özdeş) sözdizimi kullanarak aynı mantık gereksinimini ifade etmenin fiziksel yürütme planını etkileyeceği durumlar olacaktır, ancak bu ikincil bir endişe olmalıdır. Yine, genel olarak, sorguyu yalnızca çalışma zamanı özellikleri kabul edilemezse, yukarıda belirtilen tüm temel hususlar ele alındığında farklı ifade etmeyi düşünün.

Basit konjonktür WHEREfıkralarının (söz konusu gibi) yazılı düzeninin fiziksel yürütme planını ölçülebilir herhangi bir şekilde etkilemesi aşırı derecede nadirdir . Kısacası, bu endişelenmek için zaman harcamanız gereken bir şey değildir. Önce veritabanı tasarımı, dizinler ve istatistiksel bilgileri edinin.

(! Nihayetinde) ekstra gereksiz koşulunu ekleyerek doğrudan soruya cevap vermek için olabilir performansını artırmakla kalmaz, daha etkin bir erişim yöntemi kullanımını sağlayan yalnızca - örneğin (saklayıcısında, VarcharField) sadece bir dizin varsa. (VarcharField) üzerinde zaten bir dizin olsaydı, sadece ek yükü eklerdi.

Bir uygulama detayı olarak, hayır, SQL Server veri türüne veya görünür hesaplama karmaşıklığına bağlı olarak karşılaştırma maliyetini dikkate almaz. Aslında, skaler operasyonların değerli küçük bir maliyeti vardır , ancak bu tamamen ayrı bir konuya yol açar.

İlgili sorular:

Mantıksal işleçler VEYA WHERE
SQL Server 2008'deki koşulların ve koşulların ve sabit ifadelerin ve sabit ifadelerin
Performansı etkileyen bitsel operatörler
Garip SQL İfadesi Davranışı


5

İkili bölümler (bit sütunu gibi) filtrelenmiş dizinler için iyi adaylar gibi görünür.

CREATE NONCLUSTERED INDEX MyTableWithBitFieldTrue
ON MyTable (VarcharField)
INCLUDE Id, <other columns you're selecting>
WHERE BitField = 1 ;
GO

Optimizasyonlarınızla ilgili açık olmak, kod tabanınızda veya SQL Server'da başkalarının değişikliklerinde kodunuzun daha sağlam olduğu anlamına gelir.

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.