2010-05-20 18 views
5

Bir SQL Server "birleştirme" sürekli olarak herhangi bir sıra sırasını korur mu (yani, sol tablodaki veya sağdaki tablo)?İç tablo başka bir masala birleştirildiğinde geçici tablo satırlarının sırasını nasıl koruruz?

Psuedocode:

create table #p (personid bigint); 
foreach (id in personid_list) 
    insert into #p (personid) values (id) 
select id from users inner join #p on users.personid = #p.id 

varsayalım ben kişi girişine karşılık gelir kimlikleri listesi var. Bu kimliklerin her biri sıfır veya daha fazla kullanıcı hesabına karşılık gelebilir (her bir kişi birden fazla hesaba sahip olabileceğinden).

Kullanıcı tablosundan sütunları hızlı bir şekilde seçmek için, geçici bir tabloyu kullanıcı kimlikleriyle doldurur, ardından iç kısım kullanıcı tablosuyla birleştirir.

Birleştirmedeki sonuçların sırasının, temp tablosuna eklendikçe ids sırasına uygun olduğundan emin olmak için etkili bir yol arıyorum, böylece döndürülen kullanıcı listesi aynı sıradadır girildiği gibi kişi listesi olarak. "İç kullanıcıları katılmak #p" kullanılarak

  1. sol tablonun sipariş kimliği boş değil kullanıcılara nerede katılmak sol #p" kullanılarak
  2. korunur durumda:

    aşağıdaki alternatifleri kabul ettik ", bir sol birleştirmenin düzeni koruduğu ve iç birleştirmenin" oluşturma tablosu (rownum int, personid bigint) "kullanılarak

  3. olmadığı durumlarda, temp tablosu doldurulduğunda artan bir satır numarası eklenmesi, sonuçların sipariş edilmesi tarafından bir "SQL Server eşdeğeri" kullanılarak
  4. birleştirmesinde DB2

Şu anda seçeneği 3 kullanıyorum ve o inşaat ... ama zaten sipariş etti şey maddesi tarafından sipariş kullanma fikrini nefret mevcuttur "maddesi [tabloadı] emriyle sırası. Geçici tablo satırları sokulmuş sırayı koruyan ya da nasıl katılmak çalışır ve hangi sırayla sonuçları çıkıp mı diye bilmiyorum

DÜZENLEME:.

Ben seçeneğiyle 3 ile gitmek varsayarsak, Sipariş vermek için bir alan var ... SQL Server'ın siparişi korumada en az miktarda işi yapmasına yardımcı olacak birleştirme formu var mı? Demek istediğim, örneğin, tablodaki alanların cetvelle hangi sırada olduğuna bakmak ve bu tabloyu birleştirirken ilk önce bu tablodan çıkar, böylece sonuç kümesinin sırası kabaca ya da tamamen o tablonun siparişiyle çakışır. zaten istenilen sırada olması durumunda?

cevap

3

Açık bir şekilde bir order by yan tümcesiyle sipariş vermediğiniz sürece, SQL setleri hiçbir zaman sipariş verilmez.

yapın: SQL setleri sipariş asla çünkü açıkça bir order by bunları sipariş sürece, sipariş edilecek müteakip seçme anlamına gelmediğini, sırayla eklemek kullanımın oldukça

create table #p (personid bigint); 

insert into #p (personid) values (id) 
select id from users 
ORDER BY <something like users.name>; 

select * from #p 
ORDER BY <something like users.name>; 

Not fıkra.

Yazmalısın:

hızla kullanıcıların tablosundan seçme sütunlar, ben kişi kimlikleri ile geçici bir tablo doldurmak için, daha sonra iç kullanıcıların tabloyla katılın.Kokan bir şey "optimize"

select * form users where users.id in (1, 2, 3, 6, 9, ...); 

zamanından önce muhtemelen konum: çoğu durumda yılında, listedeki bir kullanarak, sadece users doğrudan seçmek için hızlı olacağımı

Not optimizasyona ihtiyaç var. RDBMS'ler (genellikle) verimli olacak şekilde yazılmıştır ve büyük olasılıkla şans eseri olarak sıralanan bir şeyi ayırmak için fazladan bir iş yapacaktır. Optimize edilmeye ihtiyaç duyulana kadar işlevsellik üzerinde yoğunlaşın. (Son birkaç ayını neredeyse sadece çok büyük (~ yarım milyar sıralı OLTP) veri kümeleri üzerinde SQL'i optimize eden biri olarak söylüyorum, çünkü çoğu zaman bu doğru.)

+0

Binlerce kimlik var. Bu işlem (arama sonuçları dahil), bu yüzden bahsettiğiniz formun bir seçim dizesini birleştiremiyorum. Ayrıca, erken optimizasyon diye bir şey yoktur. Ya kodları daha hızlı çalıştırıyorsun ya da yapmıyorsun, ya da bunu geliştirmek için çok tembelsin ya da bunu yapacak kadar akıllısın. Geçici tabloyu, önbelleğe alınabilen ve yeniden kullanılabilen yeniden kullanılabilir parametreli bir ekleme ifadesiyle doldurmakla iyiyim. – Triynko

+0

Diğer bir şey ise ... ID'lerin eklendiğinde (kişinin ad bileşenlerine göre sıralanması) AN SİPARİŞİ vardır, ancak böyle bir emrin sayısal kimlikleriyle hiçbir ilgisi yoktur ve bu nedenle SQL Server için açık bir sırada değildir. bu yüzden "fazladan fazla çalışma" ile sipariş veremezler (tekrar insan masalarına katılmalı ve isim bileşenlerine yeniden sıralamak zorunda kalacaklar). Hala üçüncü bir seçeneğimi bir rownum sütunu kullanarak düşünüyorum ve sipariş vermek, görünüşte keyfi bir düzeni (en azından SQL Server'ın bakış açısıyla) korumanın en iyi yoludur. – Triynko

+0

Başka bir şey ... bir büyük sorgu dizesi yerine temp tablosunu doldurmak için bir döngü kullanma kararı, performanstan daha fazla doğruluk derecesidir (basit önbelleğe alınmış sorgu en iyi performansı gösterse ve ekleri birer birer yürütürse bile), çünkü Tek bir dize, yeterince büyük bir kümede, komut metni veya toplu iş için bazı sınırlara erişilebileceği (örneğin, 65536 * paket boyutu (4096 byte)?) bir risk vardır; silmeden önce temp tablosunda deyim ekleyin. – Triynko

İlgili konular