Neden İlk Yüzde 100'ü Seç kullanmalısınız?


82

Ben önce anlıyoruz SQL Server 2005 de dahil ederek, "hile" SQL Server, bir görünüm tanımında tarafından bir siparişin kullanımına izin vermek için verebilir TOP 100 PERCENTiçinde SEÇ maddesi. Ama hangi kullanımları miras diğer kod gördük SELECT TOP 100 PERCENT(kullanılan dinamik SQL ifadelerinin içinde ... ADO içinde ASP.NET uygulamalar, vs). Bunun için herhangi bir nedeni var mı? Sonuç, dahil edilmemekle aynı değilTOP 100 PERCENT mi?


5
belki devam eden bir ifade oluşturma vardır: "ÜST {0} YÜZDE SEÇİN ..."
Michael Petrotta

İlk cümleniz gizli sorumun cevabı oldu.
Muhammad Ashikuzzaman

En iyi 99.9999999 YÜZDESİ kullanıyorum ve her zaman işe yarıyor. Yeterince yakın. Beklenen kayıt sayısına bağlı olarak '9'ların sayısını ekleme eğilimindeyim. Daha fazla kayıt, daha fazla 9 ve her zaman işe yarar. SQL 2008'den SQL 2017'ye kadar kullandım.
pedi

Yanıtlar:


51

" Ara materyalizasyon (Google arama) " için kullanıldı

İyi makale: Adam Machanic: Ara maddeleşmenin sırlarını keşfetmek

Hatta daha temiz bir şekilde yapılabilmesi için bir MS Connect bile geliştirdi

Benim görüşüm "doğası gereği kötü değil", ancak% 100 emin olmadıkça kullanmayın. Sorun şu ki, sadece yaptığınız anda çalışıyor ve muhtemelen daha sonra değil (yama seviyesi, şema, dizin, satır sayıları vb.) ...

Çalışılan örnek

Bu başarısız olabilir çünkü şeylerin hangi sırayla değerlendirildiğini bilmiyorsunuz

SELECT foo From MyTable WHERE ISNUMERIC (foo) = 1 AND CAST(foo AS int) > 100

Bu da başarısız olabilir çünkü

SELECT foo
FROM
    (SELECT foo From MyTable WHERE ISNUMERIC (foo) = 1) bar
WHERE
    CAST(foo AS int) > 100

Ancak, bu SQL Server 2000'de yoktu. İç sorgu değerlendirilir ve bekletilir:

SELECT foo
FROM
    (SELECT TOP 100 PERCENT foo From MyTable WHERE ISNUMERIC (foo) = 1 ORDER BY foo) bar
WHERE
    CAST(foo AS int) > 100

Bunun hala SQL Server 2005'te çalıştığını unutmayın.

SELECT TOP 2000000000 ... ORDER BY...

İkinci sorgu neden başarısız oluyor? İç sorgu (zorunlu olarak) tam olarak değerlendirilmediğinden mi?
Kenny Evitt

Bu ikinci bağlantı, geçici tablolar oluşturmanın neden bazen çarpıcı performans iyileştirmelerine yol açtığını açıklıyor!
Kenny Evitt

41

TOP (100) YÜZDE, SQL Server'ın son sürümlerinde tamamen anlamsızdır ve (bir görünüm tanımı veya türetilmiş tablo durumunda karşılık gelen ORDER BY ile birlikte) sorgu işlemcisi tarafından göz ardı edilir.

Bir zamanlar bunun bir numara olarak kullanılabileceği konusunda haklısın, ama o zaman bile güvenilir değildi. Ne yazık ki, Microsoft'un grafik araçlarından bazıları bu anlamsız maddeyi ortaya koyuyor.

Bunun neden dinamik SQL'de görünebileceğine gelince, hiçbir fikrim yok. Bunun için bir neden olmadığı ve sonuç onsuz aynı olduğu konusunda haklısınız (ve yine, hem TOP hem de ORDER BY cümleleri olmadan bir görünüm tanımı veya türetilmiş tablo olması durumunda).


Bu doğru değil; ayrıntılar için @ gbn yanıtındaki bu bağlantıya bakın.
Kenny Evitt

4
Başvurduğunuz bağlantı, SEÇİM ÜST (100) YÜZDESİ hakkında hiçbir şey söylemiyor .. ORDER BY, bu anlamsız. Bağlantı, SELECT TOP (2147483647) kullanımından bahsediyor .. ORDER BY. Şu anda, SQL Server iyileştiricisi SELECT TOP (100) YÜZDE .. ORDER BY, anlamsız olduğu için ortadan kaldıracaktır. Bu kombinasyon her zaman, TOP / ORDER BY olmadan SELECT ile aynı satır koleksiyonunu tanımlar. İyileştirici şu anda 2147483647'nin tüm satırları içerip içermediğini belirlemeye çalışmamaktadır, bu nedenle bu durumda TOP - ORDER BY kombinasyonunu ortadan kaldırmaz.
Steve Kass

2
Bağlantı aslında şunu belirtiyor TOP (100) PERCENT: "... ORDER BY ile birlikte TOP 100 YÜZDE kullanarak türetilmiş tablonun ara maddelemesini zorlamayı deneyebilirim, geçici tablo sans. Maalesef, SQL Server sorgu iyileştirici ekibi bunun olmadığına karar verdi. t iyi bir fikir ve optimize edici artık bu tür girişimleri yok sayıyor. " Aslında sizi destekliyor.
Kenny Evitt

Yapabilseydim olumsuz oyumu geri alırdım . [Cevabınızı düzenlerseniz, ona oy veririm.]
Kenny Evitt

1
Muhtemelen kafanız karıştı çünkü fikrimi değiştirdim; ilk yorumum yanlıştı; haklısın.
Kenny Evitt

23

... bir görünüm tanımında ORDER BY kullanımına izin verin.

Bu iyi bir fikir değil. Bir görünümde hiçbir zaman SİPARİŞ TARAFINDAN tanımlanmamalıdır.

ORDER BY performans üzerinde bir etkiye sahiptir - bir görünüm kullanmak, ORDER BY'ın açıklama planında ortaya çıkacağı anlamına gelir. Görünümün anlık sorgudaki herhangi bir şeyle birleştirildiği veya satır içi görünümde (CTE / alt sorgu faktörlemesi) başvurulan bir sorgunuz varsa - ORDER BY her zaman son ORDER BY'dan önce çalıştırılır (tanımlandığı varsayılarak). Sorgu TOP (veya MySQL / Postgres için LIMIT) kullanmadığında, nihai sonuç kümesi olmayan satırları sipariş etmenin bir yararı yoktur.

Düşünmek:

CREATE VIEW my_view AS
    SELECT i.item_id,
           i.item_description,
           it.item_type_description
      FROM ITEMS i
      JOIN ITEM_TYPES it ON it.item_type_id = i.item_type_id
  ORDER BY i.item_description

...

  SELECT t.item_id,
         t.item_description,
         t.item_type_description
    FROM my_view t
ORDER BY t.item_type_description

... kullanmaya eşdeğerdir:

  SELECT t.item_id,
         t.item_description,
         t.item_type_description
    FROM (SELECT i.item_id,
                 i.item_description,
                 it.item_type_description
            FROM ITEMS i
            JOIN ITEM_TYPES it ON it.item_type_id = i.item_type_id
        ORDER BY i.item_description) t
ORDER BY t.item_type_description

Bu kötü çünkü:

  1. Örnek, listeyi başlangıçta öğe açıklamasına göre sıralamak ve ardından öğe türü açıklamasına göre yeniden sıralamaktır. İlk tür kaynak israfı oluyor - yok olduğu gibi çalışan değil üzerinde çalışmakta olan ortalama:ORDER BY item_type_description, item_description
  2. Kapsülleme nedeniyle görünümün neye göre sıralandığı belli değil. Bu, farklı sıralama düzenleriyle birden çok görünüm oluşturmanız gerektiği anlamına gelmez ...

6

ORDER BYMadde yoksa TOP 100 PERCENTgereksizdir. (Bahsettiğiniz gibi, bu görüşlerle ilgili 'numara' idi)

[Umarım optimizasyon uzmanları bunu optimize eder.]


5

Devraldığım ve ÜST 100 YÜZDE SEÇİMİ kullanan başka bir kod gördüm

Bunun nedeni basit: Enterprise Manager yardımcı olmaya çalışır ve kodunuzu bunu sizin için içerecek şekilde biçimlendirirdi. Gerçekten hiçbir şeye zarar vermediğinden çıkarmaya çalışmanın hiçbir anlamı yoktu ve bir dahaki sefere değiştirmeye gittiğinizde EM tekrar takacaktı.


4

Sebep yok ama ilgisizlik sanırım.

Bu tür sorgu dizeleri genellikle bir grafik sorgu aracı tarafından oluşturulur. Kullanıcı birkaç tabloyu birleştirir, bir filtre, sıralama düzeni ekler ve sonuçları test eder. Kullanıcı sorguyu bir görünüm olarak kaydetmek isteyebileceğinden, araç ÜST 100 YÜZDE ekler. Bu durumda, kullanıcı SQL'i kendi koduna kopyalar, WHERE cümlesini parametreleştirir ve bir veri erişim katmanındaki her şeyi gizler. Akıl dışı, gözden uzak.


1

Lütfen aşağıdakileri deneyin, sizin için çalışacağını umuyoruz.

      SELECT TOP
              ( SELECT COUNT(foo) 
                  From MyTable 
                 WHERE ISNUMERIC (foo) = 1) * 
                  FROM bar WITH(NOLOCK) 
              ORDER BY foo
                 WHERE CAST(foo AS int) > 100
               )

1

Hata her şeyi söylüyor ...

Msg 1033, Seviye 15, Durum 1, Prosedür TestView, Satır 5 ORDER BY yan tümcesi, TOP, OFFSET veya FOR XML belirtilmediği sürece görünümlerde, satır içi işlevlerde, türetilmiş tablolarda, alt sorgularda ve ortak tablo ifadelerinde geçersizdir.

Kullanmayın TOP 100 PERCENT, kullanın TOP n, burada N bir sayıdır

İLK 100 YÜZDE (bilmediğim nedenlerle) SQL Server VIEW (2012 sonrası sürümler) tarafından göz ardı edildi, ancak MS'in sözdizimi nedenleriyle onu sakladığını düşünüyorum. TOP n daha iyidir ve bir görünümün içinde çalışır ve bir görünüm başlangıçta kullanıldığında bunu istediğiniz şekilde sıralar, ancak dikkatli olun .


0

Sonuçta bir değişken kullanabileceğinizi tahmin ediyorum, ancak bir görünümde ORDER BY parçasını almanın yanı sıra, örtük olarak "ÜST 100 YÜZDE" belirterek bir fayda görmeyeceksiniz:

declare @t int
set @t=100
select top (@t) percent * from tableOf

2
Soru Why use Select Top 100 PercentYüzde için değişken bir sayı elde etmek değil.
bummi

0

Bunu deneyin, hemen hemen kendisini açıklıyor. Aşağıdaki durumlar dışında ORDER BY ile görünüm oluşturamazsınız ...

CREATE VIEW v_Test
         AS
           SELECT name
             FROM sysobjects
         ORDER BY name
        GO

Msg 1033, Seviye 15, Durum 1, Prosedür TestView, Satır 5 ORDER BY yan tümcesi, TOP, OFFSET veya FOR XML belirtilmediği sürece görünümlerde, satır içi işlevlerde, türetilmiş tablolarda, alt sorgularda ve ortak tablo ifadelerinde geçersizdir.

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.