Select ifadesinde indeks nasıl kullanılır?


99

Çalışanlar tablosunda diyelim ki tablonun emp_namesütununda bir indeks (idx_name) oluşturdum .

Dizin adını seçme yan tümcesinde açıkça belirtmem gerekiyor mu yoksa otomatik olarak sorguları hızlandırmak için mi kullanılacak?

Select yan tümcesinde belirtilmesi gerekiyorsa, seçme sorgusunda dizin kullanmak için sözdizimi nedir?

Yanıtlar:


91

Çalışıp çalışmadığını görmek için dizini test etmek istiyorsanız, sözdizimi şöyledir:

SELECT *
FROM Table WITH(INDEX(Index_Name))

WITH ifadesi dizini kullanılmaya zorlayacaktır.


83
Bu gönderi soruyu cevaplamıyor. Cevap kısaca: sorguda dizin belirtmenize gerek yok. Otomatik olarak kullanılır (veya kullanılmaz). Ancak bunu zorlayabilirsiniz. Aşağıdaki diğer yayınlarda daha fazla ayrıntı (bunu ne zaman ve neden yapıyoruz).
Rast

34

İyi soru,

Genellikle DB motoru, oluşturduğu sorgu yürütme planlarına göre kullanılacak dizini otomatik olarak seçmelidir. Ancak, DB'yi belirli bir dizini kullanmaya zorlamak istediğinizde oldukça nadir durumlar vardır.

Sorunuzu yanıtlayabilmek için kullandığınız DB'yi belirtmeniz gerekir.

MySQL için, bunun nasıl yapılacağına dair Index İpucu Sözdizimi belgelerini okumak istiyorsunuz


30

Select ifadesinde indeks nasıl kullanılır?
bu yoldan:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

Ve bunu kontrol etmenin daha birçok yolu

Açıkça belirtmem gerekiyor mu?

  • Hayır, açıkça belirtmeye gerek yok.
  • DB motoru, @ Tudor Constantin cevabından oluşturduğu sorgu yürütme planlarına göre kullanılacak dizini otomatik olarak seçmelidir.
  • İyileştirici, dizininizin kullanımının sorgunuzun daha hızlı çalışmasını sağlayıp sağlamayacağına karar verecek ve eğer öyleyse, dizini kullanacaktır. @niktrl yanıtından

13

In genel dizini kullanarak ve sonra muhtemelen daha da imi aramaları gerçekleştirmek zorunda assumed maliyeti sadece tüm tabloyu taramak maliyetinden daha düşükse, endeks kullanılacaktır.

Sorgunuz şu biçimdeyse:

SELECT Name from Table where Name = 'Boris'

Ve 1000'de 1 satırda Boris adı var, neredeyse kesinlikle kullanılacak. Herkesin adı Boris ise, indeksin verilere erişmek için daha verimli bir strateji olması muhtemel olmadığından, muhtemelen bir tablo taramasına başvuracaktır.

Geniş bir masaysa (çok sayıda sütun) ve yaparsanız:

SELECT * from Table where Name = 'Boris'

Daha sonra, tablodan diğer sütunları almanın sadece adı aramaktan daha fazla zaman alacağına dair makul bir varsayımsa, tablo taramasını gerçekleştirmeyi yine de seçebilir. zaten çok sayıda satır.


9

İyileştirici, dizininizin kullanımının sorgunuzun daha hızlı çalışmasını sağlayıp sağlamayacağına karar verecek ve eğer öyleyse, dizini kullanacaktır.

RDBMS'nize bağlı olarak, ne yaptığınızı bilmediğiniz sürece önerilmese de, bir dizin kullanımını zorlayabilirsiniz.

Genel olarak tablo birleşiminde ve where deyimlerinde kullandığınız sütunları dizine eklemelisiniz.


5

Koşullarınız dahilinde dizinin uygulandığı sütunu kullanarak, otomatik olarak dahil edilecektir. Kullanmak zorunda değilsiniz, ancak kullanıldığında sorguları hızlandıracaktır.

SELECT * FROM TABLE WHERE attribute = 'value'

Uygun dizini kullanacaktır.


5

Genel olarak, bir tabloda bir dizin oluşturduğunuzda, veritabanı o tablodaki verileri ararken otomatik olarak bu dizini kullanır. Bununla ilgili hiçbir şey yapmanıza gerek yok.

Bununla birlikte, MSSQL'de, index hintbu sorguyu yürütmek için belirli bir dizinin kullanılması gerektiğini belirten bir belirtebilirsiniz. Bununla ilgili daha fazla bilgiyi burada bulabilirsiniz .

Index hintMySQL için de mevcut görünüyor . Tudor Constantine'e teşekkürler.


1

Dizin ipucu yalnızca Microsoft Dynamics veritabanı sunucuları için kullanılabilir. Geleneksel SQL Server için, 'Nerede' yan tümcenizde tanımladığınız filtreler, motoru herhangi bir ilgili indeksi kullanmaya ikna etmelidir ... Motorun yürütme planının bilgilerin nasıl okunacağını verimli bir şekilde tanımlayabilmesi koşuluyla (ister tam bir tablo taraması ister dizine alınmış bir tarama ) - yerleşik performans iyileştiricisinin bir parçası olarak ifadeyi düzgün bir şekilde yürütmeden önce ikisini karşılaştırmalıdır.

Ancak, optimize ediciyi aşağıdaki gibi bir şey kullanarak taramaya zorlayabilirsiniz:

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

Veya gibi bir şey kullanarak belirli bir dizini aramak için

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

Seçim senin. Hangi dizini kullanmak istediğiniz hakkında bir fikir edinmek için nesne panelinde tablonun dizin özelliklerine bakın. Filtrelerinizle eşleşmelidir.

En iyi sonuçlar için, en az sonucu ilk olarak döndürecek filtreleri listeleyin. Söylemekte haklı mıyım bilmiyorum, ancak sorgu filtreleri sıralı gibi görünüyor; Eğer sıralamanızı doğru yaparsanız, iyileştiricinin bunu sizin için tüm kombinasyonları karşılaştırarak yapması veya en azından karşılaştırmaya daha pahalı sorgularla başlamaması gerekir.

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.