2009-07-10 36 views
8

Nó có vẻ là khá chấp nhận rằng trong đó có chủ sở hữu schema trong truy vấn tăng hiệu suất db, ví dụ .:SQL Server và hiệu suất tên bảng đầy đủ

SELECT x FROM [dbo].Foo vs SELECT x FROM Foo.

Điều này có nghĩa vụ lưu một tra cứu, bởi vì SQL Server sẽ tìm kiếm một bảng Foo thuộc về người dùng trong ngữ cảnh kết nối.

Hôm nay tôi được cho biết rằng luôn luôn bao gồm tên cơ sở dữ liệu cải thiện hiệu suất cùng một cách, ngay cả khi bạn đang truy vấn cơ sở dữ liệu bạn đã chọn trong chuỗi kết nối của bạn:

SELECT x FROM MyDatabase.[dbo].Foo 

Có bất kỳ sự thật này? Điều này có ý nghĩa như một tiêu chuẩn mã hóa không? Có bất kỳ điều nào trong số này (kể cả ví dụ đầu tiên) dịch cho các lợi ích có thể đo lường không?

Chúng ta đang nói về một vài chu kỳ để tra cứu thêm từ điển trên máy chủ cơ sở dữ liệu so với SQL cồng kềnh hơn và nối thêm trên máy chủ web (hoặc máy khách khác)?

+2

Nếu nó tạo sự khác biệt, nó sẽ thêm vấn đề bảo trì vì tất cả truy vấn của bạn đều có tên cơ sở dữ liệu trong đó. Làm cho nó rất khó để đổi tên một cơ sở dữ liệu. – adrianbanks

+0

Phụ thuộc vào những gì bạn duy trì. Có tên đủ điều kiện bên trong quy trình cụ thể của tôi đảm bảo nó hoạt động chính xác theo cách giống nhau ngay cả khi được gắn vào một db khác trong môi trường thử nghiệm của tôi - trong trường hợp cụ thể của tôi, tôi muốn env thử nghiệm. để tạo ra kết quả 'sản xuất' theo như proc được lưu trữ.Có lẽ đây không phải là cách thực hành tốt nhất mà tôi nhận thấy, nhưng cảnh quan rộng lớn của các kho dữ liệu của chúng tôi không có các bộ phận đếm được sao chép hoàn toàn trong trạng thái sandbox'd sạch trong một số miền TEST riêng biệt, vì vậy, nhiều môi trường TEST/DEV của chúng tôi tốt nhất là hỗn hợp dữ liệu sản xuất và không có thật. – bkwdesign

Trả lời

11

Một điều cần lưu ý là rằng đây là một bộ sưu tập ràng buộc, không phải là một thực hiện một. Vì vậy, nếu bạn thực hiện cùng một truy vấn 1 triệu lần, chỉ lần thực thi đầu tiên sẽ 'nhấn' thời gian tìm kiếm, phần còn lại sẽ sử dụng lại cùng một gói và kế hoạch được đặt trước (tên đã được giải quyết cho id đối tượng).

+0

+1 Chính xác: nó giúp tiết kiệm chi phí biên dịch – gbn

1

Hãy dùng thử? Chỉ cần lặp qua một triệu truy vấn của cả hai và xem kết quả nào trước tiên.

Tôi đoán đó là tải trọng của giường tầng. Các nhà phát triển của MS SQL dành hàng triệu giờ nghiên cứu hiệu quả cho các thuật toán tìm kiếm và phương pháp lưu trữ chỉ để bị cản trở bởi người dùng không chỉ định tên bảng đầy đủ? Buồn cười.

0

Như Spencer đã nói - hãy thử, tất nhiên hãy đảm bảo bạn xóa bộ nhớ cache mỗi lần vì điều này sẽ ảnh hưởng đến kết quả của bạn.

http://www.devx.com/tips/Tip/14401

Tôi cũng sẽ ngạc nhiên nếu có bất kỳ sự khác biệt đáng kể nào.

1

Máy chủ SQL sẽ không tìm kiếm thêm nếu lược đồ mặc định giống nhau. Nó nên được bao gồm nếu nó không phải và đó là một truy vấn được sử dụng rất nhiều.

Tên cơ sở dữ liệu sẽ không có lợi cho hiệu suất truy vấn. Tôi nghĩ rằng điều này có thể được nhìn thấy với Kế hoạch thực hiện dự kiến ​​trong Management Studio.

4

Trong trường hợp này, cá nhân tôi sẽ thích khả năng đọc hơn khi tăng hiệu suất nhỏ mà điều này có thể gây ra, nếu có.

SELECT * FROM Foo 

vẻ dễ dàng hơn nhiều để quét hơn:

SELECT * FROM MyDatabase.[dbo].Foo 
Các vấn đề liên quan