Thay đổi lược đồ
- Tìm nạp theo thứ tự --- Nếu mã đang tìm nạp cột # làm cách để lấy dữ liệu, một thay đổi trong lược đồ sẽ khiến các số cột điều chỉnh lại. Điều này sẽ làm rối ứng dụng và những điều xấu sẽ xảy ra.
- Tìm nạp theo tên --- Nếu mã đang tìm nạp cột theo tên như
foo
và một bảng khác trong truy vấn sẽ thêm một cột foo
, cách xử lý này có thể gây ra sự cố khi cố gắng lấy đúng foo
cột.
Dù bằng cách nào, một sự thay đổi lược đồ có thể gây ra vấn đề với việc trích xuất dữ liệu.
Xem xét thêm nếu một cột đang được sử dụng được xóa khỏi bảng. Các select * from ...
vẫn hoạt động nhưng lỗi ra khi cố gắng để kéo dữ liệu ra khỏi tập hợp kết quả. Nếu cột được chỉ định trong truy vấn, truy vấn sẽ báo lỗi thay vì đưa ra một dấu hiệu rõ ràng về vấn đề là gì và ở đâu.
Chi phí dữ liệu
Một số cột có thể có một lượng dữ liệu đáng kể liên quan đến chúng. Chọn trở lại *
sẽ kéo tất cả dữ liệu. Đúng, đây là varchar(4096)
trên 1000 hàng mà bạn đã chọn cung cấp cho bạn thêm 4 megabyte dữ liệu mà bạn không cần, nhưng được gửi qua đường dây.
Liên quan đến thay đổi lược đồ, varchar đó có thể không tồn tại ở đó khi bạn lần đầu tiên tạo bảng, nhưng bây giờ nó ở đó.
Không truyền đạt ý định
Khi bạn chọn trở lại *
và nhận 20 cột nhưng chỉ cần 2 cột, bạn không truyền đạt được ý định của mã. Khi nhìn vào truy vấn mà select *
người ta không biết phần quan trọng của nó là gì. Tôi có thể thay đổi truy vấn để sử dụng gói khác thay thế để làm cho nó nhanh hơn bằng cách không bao gồm các cột này không? Tôi không biết vì mục đích của những gì truy vấn trả về không rõ ràng.
Hãy xem xét một số câu đố SQL khám phá các lược đồ đó thay đổi nhiều hơn một chút.
Đầu tiên, cơ sở dữ liệu ban đầu: 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);
Và các cột mà bạn nhận lại được oneid=1
, data=42
, twoid=2
, và other=43
.
Bây giờ, điều gì xảy ra nếu tôi thêm một cột vào bảng một? http://sqlfiddle.com/#!2/cd0b0/1
alter table one add column other text;
update one set other = 'foo';
Và kết quả của tôi từ cùng một truy vấn như trước đây là oneid=1
, data=42
, twoid=2
, và other=foo
.
Một thay đổi trong một trong các bảng sẽ phá vỡ các giá trị của a select *
và đột nhiên ràng buộc 'khác' của bạn với một int sẽ gây ra lỗi và bạn không biết tại sao.
Nếu thay vào đó, câu lệnh SQL của bạn là
select
one.oneid, one.data, two.twoid, two.other
from one join two on (one.twoid = two.twoid);
Việc thay đổi bảng một sẽ không làm gián đoạn dữ liệu của bạn. Truy vấn đó chạy giống nhau trước khi thay đổi và sau khi thay đổi.
Lập chỉ mục
Khi bạn làm một, select * from
bạn đang kéo tất cả các hàng tạo thành tất cả các bảng phù hợp với các điều kiện. Ngay cả các bảng bạn thực sự không quan tâm. Trong khi điều này có nghĩa là nhiều dữ liệu được chuyển đi, có một vấn đề hiệu suất khác ẩn sâu hơn trong ngăn xếp.
Chỉ số. (liên quan đến SO: Làm thế nào để sử dụng chỉ mục trong câu lệnh select? )
Nếu bạn đang lấy lại nhiều cột, trình tối ưu hóa kế hoạch cơ sở dữ liệu có thể bỏ qua việc sử dụng một chỉ mục bởi vì bạn vẫn sẽ cần tìm nạp tất cả các cột đó và sẽ mất nhiều thời gian hơn để sử dụng chỉ mục và sau đó tìm nạp tất cả các cột trong truy vấn hơn là chỉ cần thực hiện quét bảng hoàn chỉnh.
Nếu bạn chỉ chọn, giả sử họ của người dùng (bạn làm rất nhiều và có chỉ mục trên đó), cơ sở dữ liệu có thể thực hiện quét chỉ mục ( chỉ mục wiki chỉ quét , quét toàn bộ bảng mys mys so với toàn bộ quét chỉ mục , Quét chỉ mục : Tránh truy cập bảng ).
Có khá nhiều tối ưu hóa về việc chỉ đọc từ các chỉ mục nếu có thể. Thông tin có thể được kéo nhanh hơn trên mỗi trang chỉ mục vì bạn cũng lấy ít thông tin hơn - bạn không kéo theo tất cả các cột khác cho select *
. Có thể một chỉ mục chỉ quét để trả về kết quả theo thứ tự nhanh hơn 100 lần (nguồn: Chọn * là xấu ).
Điều này không nói rằng quét chỉ mục đầy đủ là tuyệt vời, nó vẫn là quét toàn bộ - nhưng tốt hơn quét toàn bộ bảng. Một khi bạn bắt đầu theo đuổi tất cả những cách select *
gây tổn hại đến hiệu suất, bạn tiếp tục tìm ra những cách mới.
Đọc liên quan