Şema Değişiklikleri
- Siparişte al --- Kod, verileri almanın yolu olarak sütun # alıyorsa, şemadaki bir değişiklik sütun numaralarının yeniden ayarlanmasına neden olur. Bu uygulamayı bozacak ve kötü şeyler olacak.
- Ada göre al --- Kod, adı gibi sütun alıyorsa
foo
ve sorgudaki başka bir tablo bir sütun eklerse foo
, bu işleme şekli doğru foo
sütunu almaya çalışırken sorunlara neden olabilir .
Her iki durumda da, bir şema değişikliği verilerin çıkarılmasıyla ilgili sorunlara neden olabilir.
Ayrıca, kullanılan bir sütunun tablodan kaldırılıp kaldırılmadığını göz önünde bulundurun . select * from ...
Sonuç kümesinin dışına veri çekme çalışırken hala hatalar dışarı ama çalışır. Sütun sorguda belirtilirse, sorgu yerine sorunun ne ve nerede olduğu net bir indiciation vererek dışarı hata olacaktır.
Veri ek yükü
Bazı sütunlarda, bunlarla ilişkili önemli miktarda veri bulunabilir. Geri seçildiğinde tüm veriler *
çekilir . Evet, işte size seçtiğiniz 1000 satırda, ihtiyacınız olan 4 megabaytlık ek veriye ihtiyaç duymuyorsunuz, ancak yine de tel üzerinden iletiliyor.varchar(4096)
Şema değişikliği ile ilgili olarak, tabloyu ilk oluşturduğunuzda bu varchar orada bulunmayabilir, şimdi orada.
Niyet iletilemedi
Geri dönüp *
20 sütun aldığınızda ancak bunlardan yalnızca 2'sine ihtiyacınız olduğunda, kodun amacını iletmezsiniz. select *
Birini yapan sorguya bakarken bunun önemli kısımlarının ne olduğunu bilmiyor. Sorguyu, bu sütunları ekleyerek daha hızlı hale getirmek için bu diğer planı kullanmak üzere değiştirebilir miyim? Bilmiyorum çünkü sorgunun döndürdüğü şeyin amacı net değil.
Şema değişikliklerini biraz daha keşfetmek için bazı SQL kemanlarına bakalım .
İlk olarak, ilk veritabanı: http://sqlfiddle.com/#!2/a67dd/1
DDL:
create table one (oneid int, data int, twoid int);
create table two (twoid int, other int);
insert into one values (1, 42, 2);
insert into two values (2, 43);
SQL:
select * from one join two on (one.twoid = two.twoid);
Ve geri almak sütunlar vardır oneid=1
, data=42
, twoid=2
, ve other=43
.
Şimdi, bir numaralı tabloya bir sütun eklersem ne olur? http://sqlfiddle.com/#!2/cd0b0/1
alter table one add column other text;
update one set other = 'foo';
Ve aynı sorgudan benim sonuçlar önceki gibidir oneid=1
, data=42
, twoid=2
, ve other=foo
.
Tablolardan birindeki bir değişiklik select *
, 'diğerini' bir int'ye bağlamanızın bir anda değerini kaybeder ve bir hataya neden olur ve nedenini bilmiyorsunuz.
Eğer öyleyse, SQL deyiminiz
select
one.oneid, one.data, two.twoid, two.other
from one join two on (one.twoid = two.twoid);
Birinci tabloda yapılan değişiklik verilerinizi bozmazdı. Bu sorgu değişiklikten önce ve değişiklikten sonra aynı çalışır.
indeksleme
Bunu yaptığınızda select * from
, tüm satırları çekiyorsunuzdur ve koşullara uyan tüm tabloları oluşturur. Gerçekten umursamadığın masalar bile. Bu, daha fazla veri aktarılması anlamına gelse de, yığında daha fazla gizlenen başka bir performans sorunu var.
Endeksler. (SO ile ilgili: index ifadesinde select ifadesi nasıl kullanılır? )
Çok sayıda sütunu geri çekiyorsanız, veritabanı planı en iyi duruma getiricisi bir dizini kullanmayı göz ardı edebilir çünkü tüm bu sütunları yine de almanız gerekecek ve dizini kullanmanız ve ardından sorgudaki tüm sütunları getirmeniz gerekecek tam bir masa taraması yapmak için olurdu.
Eğer sadece bir kullanıcının soyadını seçiyorsanız (çok fazla yaptığınız ve üzerinde bir indeksin bulunduğu), veritabanı sadece bir indeks taraması yapabilir ( sadece wiki endeksi taramasından sonra , mysql tam tablo taramasından vs dizin taraması , Yalnızca Dizine Tara: Tablo Erişimini Önlemek ).
Mümkünse sadece indekslerden okuma hakkında bir miktar optimizasyon var. Her indeks sayfasında bilgi daha hızlı çekilebilir, çünkü daha az çekiyorsunuz - bunun için diğer tüm sütunları çekmiyorsunuz select *
. Bir indeks taramasının sadece sonuçları 100 kat daha hızlı sırayla döndürmesi mümkündür (kaynak: Seç * kötüdür ).
Bu tam dizin taramasının harika olduğunu söylemiyor, hala tam tarama - ancak tam tablo taramasından daha iyi. select *
Performansa zarar veren tüm yöntemleri kovalamaya başladığınızda yenilerini bulmaya devam edersiniz.
İlgili okuma