2009-03-11 7 views
6

Tôi muốn ghi nhớ các kết quả chức năng cho hiệu suất, nghĩa là lưu trữ một bộ nhớ cache được lập chỉ mục trên các đối số hàm. Lần đầu tiên tôi gọi một hàm, bộ nhớ cache sẽ không có bất cứ điều gì cho các đối số đầu vào, vì vậy nó sẽ tính toán nó và lưu trữ nó trước khi trả về nó. Các cuộc gọi tiếp theo chỉ sử dụng bộ nhớ cache.Kết quả chức năng lưu trong bộ nhớ cache trong SQL Server 2000

Tuy nhiên, có vẻ như SQL Server 2000 có quy tắc tùy ý ngu ngốc về các hàm là "xác định". Các lệnh INSERT, UPDATE và các thủ tục lưu trữ thông thường đều bị cấm. Tuy nhiên, các thủ tục được lưu trữ mở rộng được cho phép. Làm thế nào là xác định này? Nếu phiên khác sửa đổi trạng thái cơ sở dữ liệu, đầu ra của hàm sẽ thay đổi anyways.

Tôi đang bị điên. Tôi đã nghĩ rằng tôi có thể làm cho bộ nhớ đệm trong suốt cho người dùng. Điều này có thể không? Tôi không có quyền để triển khai các thủ tục được lưu trữ mở rộng.

EDIT:

Giới hạn này vẫn còn trong năm 2008. Bạn không thể gọi RAND, vì Chúa ơi!

Bộ nhớ cache sẽ do tôi triển khai trong DB. Cache là bất kỳ lưu trữ dữ liệu sử dụng cho bộ nhớ đệm ...

EDIT:

Không có trường hợp các đối số tương tự với một chức năng sẽ mang lại kết quả khác nhau, bên ngoài thay đổi đối với dữ liệu cơ bản. Đây là một nền tảng BI, và những thay đổi duy nhất đến từ ETL được lên lịch, lúc đó tôi sẽ TRUNCATE bảng cache.

Đây là các tính toán chuỗi thời gian chuyên sâu I/O, theo thứ tự của O (n^4). Tôi không có nhiệm vụ thay đổi bảng hoặc chỉ mục cơ bản. Ngoài ra, rất nhiều chức năng này sử dụng cùng chức năng trung gian và bộ nhớ đệm cho phép các chức năng đó được sử dụng.

UDF không thực sự xác định, trừ khi chúng giải thích các thay đổi trong trạng thái cơ sở dữ liệu. Vấn đề ở đây là gì? Bộ đệm ẩn của SQL Server? (Ironic.) Nếu SQL Server là bộ đệm ẩn, thì nó phải hết hạn khi thay đổi các bảng được ràng buộc lược đồ. Nếu chúng bị ràng buộc lược đồ, thì tại sao không ràng buộc các bảng mà hàm sửa đổi? Tôi có thể thấy lý do tại sao procs không được phép, mặc dù đó chỉ là cẩu thả; chỉ cần lược đồ liên kết procs. Và, BTW, tại sao cho phép procs được lưu trữ mở rộng? Bạn không thể theo dõi những gì những người làm để đảm bảo quyết định !!! Argh !!!

EDIT:

Câu hỏi của tôi là: Có cách nào để uể oải kết quả chức năng bộ nhớ cache trong một cách mà có thể được sử dụng trong một cái nhìn?

+0

Xin lỗi, không rõ ràng với tôi từ bài đăng gốc mà bạn đã tạo bộ nhớ cache "từ đầu". Làm thế nào bạn có ý định đối phó với các trường hợp có cùng chức năng, với cùng các đối số, nên trả về các kết quả khác nhau? –

+0

câu hỏi của bạn là gì? –

Trả lời

2

Xác định nghĩa là các đầu vào giống nhau trả về cùng một đầu ra độc lập với thời gian và cơ sở dữ liệu.

Máy chủ SQL (mọi phiên bản) không lưu vào bộ nhớ đệm của UDF - Tôi tin rằng nó sẽ tránh gọi UDF hai lần trên một hàng, nhưng đó là nó.

Một mẹo nhỏ tôi đã sử dụng là (Tôi nghĩ rằng tôi đăng nó ở đây trên SO):

Refactor UDF nếu bạn có thể để có hiệu quả một tập hợp con rời rạc có thể sử dụng các giá trị trả lại cho một tập hợp các đầu vào. Đối với các phép tính số, đôi khi có thể tái cấu trúc lại logic để trả về một hệ số hoặc tỷ lệ được nhân với bên ngoài UDF thay vì nhân với bên trong UDF từ một giá trị được truyền vào.

Gọi UDF qua hàng rào DISTINCT và lưu kết quả vào bảng tạm thời.Nếu bạn chỉ gọi UDF với 100.000 bộ thông số trên một tập hợp hàng 17.000.000, thì đây là rất hiệu quả hơn nhiều.

THAM GIA bảng tạm thời (về cơ bản chuyển đổi từ logic dựa trên mã sang logic dựa trên bảng) để nhận giá trị.

Bảng này có thể được sử dụng lại khi cần thiết hoặc thậm chí được lưu giữ.

Ngoài bảng có thể được thực hiện bằng cách LEFT JOIN đầu tiên để tìm các mục bị lưu trong bộ nhớ cache bị thiếu.

Điều này phù hợp với cả UDF và bảng UDF. Tôi chủ yếu sử dụng nó cho các UDF bảng có giá trị. Có một hotfix để SQL Server 2005 được cho là để giải quyết hiệu suất UDF - Tôi đang chờ đợi trên các DBAs để kiểm tra nó trước khi triển khai để sản xuất.

+0

Trước hết, điểm của bộ nhớ cache là để laz lazily. Populating một bảng với nhiều thất bại mục đích. Thứ hai, tất cả các phương pháp tiếp cận này là di chuyển bộ nhớ đệm ra khỏi UDF. Tại sao không chỉ sử dụng bỏ qua UDF và sử dụng một proc? Cuối cùng, các hàm có thể được sử dụng trong các khung nhìn, trong đó có các procs lợi thế thì không. – alyssackwan

+0

Tôi hoàn toàn điền tất cả và chỉ các kết quả UDF tiềm năng. Một số sẽ được gọi nhiều lần, không được gọi là 0 lần. Nó không phải là một bộ nhớ cache - đó là một precalc. Khoản tiết kiệm có thể đo lường trực tiếp bằng sự khác biệt trong các cuộc gọi UDF thực sự được thực hiện để điền bảng tra cứu. Sự cân bằng là lưu trữ. –