“SARGable” kelimesi gerçekten ne anlama geliyor?


24

SQL Server kullanıcıları "sargable" terimini kullanır . "Sargable" için nesnel bir uygulama-agnostik zamansız tanım olup olmadığını merak ediyorum.

Örneğin, WHERE foo LIKE '%bar%'birçok kişi tarafından anlaşılamaz olduğu söylenir , ancak bazı RDBMS'ler bu tür sorgularda dizinler kullanabilir . O zaman "sarsılmaz değil" ne anlama geliyor?

Diğer referanslar


5
Sorunuzun SQL Server ile ilgili olmadığını, bunun yerine " sargable " terimini belirtmek isteyebilirsiniz . Sorunuz yalnızca "% wordhere%" arama tahminlerini işleyemediği için SQL Server'a başvururken, görünüşe göre diğer RDBMS'dir.
John aka hot2use

Yanıtlar:


31

"Sargable" terimi ilk olarak P. Griffiths Selinger ve ark. ACM tarafından yayınlanan 1979 tarihli "İlişkisel Veritabanı Yönetim Sisteminde Erişim Yolu Seçimi" başlıklı makalesinde . ACM üyesi olmayanlar için bu makalenin bir kopyası http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf

Terim bu paragrafta tanımlanmıştır:

Hem indeks hem de segment 1 taramaları isteğe bağlı olarak, RSI 2 arayanına geri gönderilmeden önce bir tupa uygulanan arama argümanları (veya SARGS) adı verilen bir dizi tahmin alabilir . Eğer demet tahminleri karşılarsa geri döner; aksi takdirde tarama, SARGS'yi tatmin eden veya segmenti veya belirtilen indeks değeri aralığını tüketen bir demet bulana kadar devam eder. Bu, RSS içinde verimli bir şekilde reddedilebilecek tuples için RSI çağrıları yapma yükünü ortadan kaldırarak maliyeti azaltır. Tüm tahminler SARGS haline gelebilecek formda değildir. Bir sargable yüklem "sütunu, karşılaştırma-operatör değeri" (form içine konabilir veya) şeklinde biridir. SARGS, bu tür tahminlerin ayrık normal formda bir boole ifadesi olarak ifade edilir.

Başka bir deyişle, anlaşılır bir yüklem, depolama motoru (erişim yöntemi) tarafından doğrudan tabloyu veya dizin kaydını gözlemleyerek çözülebilecek şekildedir. Tersine çevrilemez bir belirti, tersine, harekete geçmek için daha yüksek bir DBMS seviyesi gerektirir. Örneğin, sonucu her bir kaydın WHERE lastname = 'Doe'alanının içeriğine bakarak depolama motoru tarafından kararlaştırılabilir lastname. Öte yandan, WHERE UPPER(lastname) = 'DOE'bir fonksiyonun SQL motoru tarafından yürütülmesini gerektirir; bu, depolama motorunun ek CPU maliyetleri doğurarak değerlendirme için okuduğu tüm satırları (olası diğer, anlaşılabilir tahminlerle eşleşmeleri koşuluyla) SQL motoruna geri döndürmesi gerektiği anlamına gelir. .

Orijinal tanımdan anlaşılabilir durumların yalnızca dizin taramalarına değil, aynı zamanda "sütun karşılaştırma-işleç değeri" koşulları karşılandığı ve bu nedenle de olabileceği sürece tablo (Sistem R terminolojisindeki segment) taramalarına da uygulanabileceğini görebilirsiniz. depolama motoru tarafından değerlendirilir. Sistem R'nin bir torunu olan birçok yönden Db2'de bu durum aslında :

Endeks anlaşılabilir tahminler bir aramayı basamaklama için kullanılmaz, ancak seçildiyse dizinden değerlendirilir, çünkü yüklemde yer alan sütunlar dizin anahtarının bir parçasıdır. Bu tahminler ayrıca dizin yöneticisi tarafından değerlendirilir.

Veriye uygun tahminler, dizin yöneticisi tarafından değerlendirilemeyen, ancak Veri Yönetim Hizmetleri (DMS) tarafından değerlendirilebilen tahminlerdir. Tipik olarak, bu tahminler tek bir satırın bir temel tablodan erişimini gerektirir. Gerekirse, DMS yüklemi değerlendirmek için gereken sütunları alır,

SQL Server-konuşmalı anlaşılabilir tahminlerde yalnızca dizin aramaları kullanılarak çözülebilenler olması, muhtemelen depolama motorunun tablo taramaları sırasında bu tür tahminleri uygulayamaması tarafından belirlenir.

Sarsılabilir ve sarsılmaz tahminler bazen sırasıyla "aşama 1" ve "aşama 2" tahminleri olarak tanımlanır (bu aynı zamanda Db2 terminolojisinden de gelir ). Aşama 1 tahminleri, tablo veya dizin kayıtları okunurken en düşük sorgu işleme düzeyinde değerlendirilebilir. Aşama 1 koşullarıyla eşleşen satırlar (varsa) bir sonraki değerlendirme aşamasına (aşama 2) gönderilir.


1 - R Sistemindeki segment, bir tablonun tuple'lerinin fiziksel olarak depolanmasıdır; bir segment taraması, diğer DBMS'lerde bir tablo taramasına eşdeğerdir.

2 - RSI - RSS 3 Arabirimi, bir tuple yönelimli sorgu arabirimi. Bu tartışmayla ilgili arabirim işlevi, bir sonraki satır eşleşen sorguyu döndüren İLERİ'dir.

3 - RSS veya Araştırma Depolama Sistemi, R Sisteminin depolama alt sistemi.


"doğrudan tablo veya dizin kaydını gözlemlemek" ne anlama geliyor? Kesinlikle = UPPER()bir işlev çağrısıdır, ama memcmpkendi başına da öyle. memcmpASCII varsayan ve durumu görmezden gelen bir yazı yazmak nispeten kolay olacaktır (sadece ikinci kemere bakın). Bu onu SARGABLE yapar mı? Ayrıca @ Ypercube örneğine bakınız, dba.stackexchange.com/questions/162263/…
Evan Carroll

4
@EvanCarroll Depolama motoru dışında uygulanan veritabanı işlevlerine başvurmadan (örn. Sorgu işlemcisi / yürütme motoru / ifade hizmeti içinde) doğrudan tabloya veya dizin kaydına bakmak anlamına gelir. Ypercube örneğinde, sorgu SARGable olmayan aramanın SARGable terimleriyle ifade edileceği şekilde planlayıcı / iyileştirici tarafından önceden işlenir.
Paul White Reinstate Monica

Ne yok "Tablo veya dizin kaydının bakarak doğrudan" demek? Bunun "tabloyu veya dizin kaydını doğrudan gözlemleyerek" nasıl açıklandığından emin değilim . Mı x=0SARGable? Ne hakkında -0 = +0, ' ' = ''veya uzaysal eşitlik? Kesinlikle SARGable olan bir şeye örnek ne olurdu? Derken "depolama motoru dışında uygulanan veritabanı fonksiyonları başvurmaksızın" Eğer Ypercube en örnekte dahil ediyoruz DATE()depolama motorun içinde yer almaktadır. Neden SARGable tek başına değil?
Evan Carroll

2
@EvanCarroll Referans verilen makaleyi okumak için biraz zaman ayırın ve belki de bundan sonra bu cevabı tekrar deneyin. Burada konuyla ilgili sorularınız varsa, onlara sorabilirsiniz. Bu DATE()gerçek (SQL Server) fonksiyonu değil, ama (tahmin) Bay Cube bir tür dönüşüm için steno geçiş olduğunu unutmayın. İsterseniz bunu sohbetle de tartışabiliriz .
Paul White eski durumuna Monica

18

Benim için SARGable, SQL Server'ın arama tahminlerinizi kullanarak bir dizin araması yapabileceği anlamına gelir.

DBMS bir dizinin "avantajından yararlanabileceğini" söyleyemezsiniz, çünkü anlaşılmaz bir yüklemle SQL Server kümelenmemiş bir dizini taramaya son verebilir.


Bunu eleme bölümlerine de genişletirim
David דודו Markovitz

9

Göre Pro SQL Server Internals Dmitri Korotkevitch tarafından :

ABL Arama Argusu yüklemesi, SQL SERVER'in bir dizin mevcutsa dizin arama işlemini kullanabildiği bir deyimdir.

SARGable yüklemi, SQL sunucusunun işlemek için tek değer veya dizin anahtarı değerleri aralığını izole edebildiği bir yüklemdir

: SARGable yüklemler şu operatörleri içerir =, >, >=, <, <=, IN, BETWEEN, ve LIKE( ön ek eşleşmesi durumunda )

Sigara SARGable operatörler şunlardır: NOT, NOT IN, <>, ve LIKE( değil önek eşleştirme ), hem de masaya karşı işlevlerin veya hesaplamaların kullanımı ve veri türü oluşturulan endeks yerine getirmemesi tip dönüşümleri.

Örnek :

WHERE name like 'SARGable%'
WHERE name like '%non-SARGable%'

Demo :

DROP TABLE dbo.Testing;
GO

CREATE TABLE Testing (
    WeirdDatatype   int NOT NULL,
    SomethingElse   char(200)
);

CREATE NONCLUSTERED INDEX IDX_ALWAYS_SARGable
    ON dbo.Testing( SomethingElse);

CREATE NONCLUSTERED INDEX IDX_NOT_ALWAYS_SARGable
    ON dbo.Testing(SomethingElse);

INSERT INTO dbo.Testing
        ( WeirdDatatype, SomethingElse )
SELECT TOP 1000 m.message_id, CONVERT(char(200), m.text)
FROM sys.messages AS m;

Şimdi koşuyoruz:

SELECT *
FROM dbo.Testing AS t
WHERE  t.WeirdDatatype = 1001;
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE 'Line%'
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE '%Line%'
     AND t.WeirdDatatype = 1001;

Sonuçlar:

[1]

SARGable sorgusunun özelliklerine bakalım (Dizin Araması)

resim açıklamasını buraya girin

Sorgu iyileştirici, bir başlangıç ​​ve bitiş dizininde bir sınır tanımlayabilir. Sorgulanacak bir arama argümanı var.

Şimdi SARGable olmayan sorgu:

resim açıklamasını buraya girin

'% Non ..%' yükleminin başlangıcında, sorgu optimize edicinin dizinde bir başlangıç ​​ve bitiş veya aralık tanımlamasına izin vermediğini görebilirsiniz. Şimdi tüm tabloyu aramalıdır (tarama).


Peki yine, daha sonra destekleyen bir dizin oluşturulursa, WHERE name like '%non-SARGable%'bu durum anlaşılır mı? Ve eğer öyleyse, belirli bir uygulama dezavantajı hakkında konuşmuyor muyuz? IE., "SQL Server 2016 itibariyle anlaşılmaz değil" dememeliyiz
Evan Carroll

1
SQL Server sürümlerinde her şey mümkün olsa da. Bir dizinin devrilme noktasını yüklemin başlangıcında bir joker karakter göz önünde bulundururken, sorgu optimize edicisinin bir dizin içindeki bir dizi aralığı tanımlaması çok zor olur. Böylece bir tarama ve yüklem kullanmaya SARGable olmayan yüklem denir.
Vic Work

2
Tabii ki uygulamaya özel. WHERE DATE(datetime_column) = '2001-01-01'Örneğin, yeni SQL Server sürümlerinde (2008+ sanırım) "sargable" (dizin araması yapacak) ancak daha eski sürümlerde değil.
ypercubeᵀᴹ
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.