Justin: I'm not sure you want to put the database update and memcached update into a Trigger. Keep in mind that the trigger runs in the same transaction as the original insert -- and the insert will not be completed until the Trigger completes. Given that issue -- you may actually see your time climb, rather than reduce time in SQL Server.
You can have a trigger update memcached by putting the actual memcached update in a Web Service, and then write a Table-Valued Function that is called by the Trigger to send a SOAP Message to the Web Service. This is a pretty difficult item to do, and requires the wonderfully manual process of putting the XMLSerialization Dll Assembly into the CLR -- it cannot be automatically published into the database like other CLR-based code. It also requires you to have a high level of trust with the Web service. Walt Crosby VP of Development Interval Data Systems, Inc. -----Original Message----- From: memcached@googlegroups.com [mailto:memcac...@googlegroups.com] On Behalf Of JustinSD Sent: Wednesday, March 03, 2010 11:25 PM To: memcached Subject: Re: How To Use Memcache With SQL 2008 Once again, thanks for all the awesome replies. Let me add a few things: Most users have notifications pending, they just choose not to view them, so the option of storing if a user has notifications won't help us much as most users have them and we need to display them. We are very heavy putting logic in T-SQL in terms of stored procedures and triggers. The problem, being, when notifications are created, they are actually created by a trigger. Also we mark notifications are viewed with a stored procedure. How then can a T-SQL trigger or stored procedure update memcache? Is that possible? It would be AMAZING if we could create and update memcache directly in T-SQL triggers and stored procedures. -- Justin On Mar 3, 7:16 pm, Mark Atwood <fallenpega...@gmail.com> wrote: > What you have here is you are polling an event queue every minute, > said event being a notification. Maybe you would be better served > actually using an event queuing system. There are a number of them in > the open source world that fit this use case pretty well, including > RabbitMQ and Resque. I don't know enough about the msft and .net > ecologies to know what exists in this space there. > > That said, there are a couple of things you could do using memcached. > > For example, if most of the time that query returns an empty set, you > could put into memcached a key called something like "has_notification/$USER_ID" > whenever a you insert something into the notification table for that > user, and then check the memcached for that key before doing the > select. That way you are not hammering your database looking for > notifications that don't exist. > > And/or you could actually put the notification type&text into the > memcached, under the keyname "notification/$USER_ID/$epochseconds", > and then do a multiget on each of the past 60 possible time values. > If you have more than one notification per second, this might not > work, but it may inspire a similar solution. > > For example, if notifications have some sort of short unique ID, you > could have a single key per user with a key name like > "notification/$USER_ID" and do a value append of each notification to > it as it happens, and then also have a key with a name like > "notification/$USER_ID/$NOTE_ID". Then retrieve the master entry, > which will give you a set of notification ids, and the then go back and mget each notification. > > With some careful use of CAS operations and automatic expiration, this > can work pretty well. > > But the meta answer is that memcached is not a magic "go faster" > button, you will need to start making real changes to your application > to use it. (And anyone anywhere who is trying to sell you a magic "go > faster" button is lying to you.) > > On Wed, Mar 3, 2010 at 5:35 PM, JustinSD <jkel...@fieldtechnologies.com>wrote: > > > > > > > Hello everyone, thanks a ton for all the replies. So let me give a > > concrete example of something we do. > > > I recently just ran a report in SQL 2008 and found the top query as > > far as total CPU time. The query basically pulls notifications for > > users every minute they are logged in. The query is specific to each > > user, so essentially something like: > > > SELECT notification_id, notification_type, notification_description > > FROM notifications WHERE user_id = 23243 AND viewed = 0; > > > So this seems like a good candidate for memcache, but do we then > > memcache a result for each user_id? Would we basically store the > > DataTable in memcache? Also wouldn't memcache needs to be refreshed > > when users get `new` notifications, and also when they view > > notifications? How is that handled? > > > Thanks. > > > On Mar 2, 5:45 am, "Walter Crosby" <wcro...@alum.mit.edu> wrote: > > > Justin: > > > > You really have to have just the right mix of static data in order > > > to > > make > > > this thing work for you. Some people have been able to come up > > > with architectures that save the queries with an MD5 Hash for > > > example, and > > then > > > look for similar hashes -- and take the results. That may or may > > > not > > work > > > for you, depending on the amount of time that you go after a > > > particular query -- basically, you have to do the same query over > > > and over again for the results to work in your favor. However, if > > > everytime you do the > > query, > > > you could potentially be bringing in new data, then you would have > > > to set the lifetime of the query relatively short. > > > > For example, in your database, you say you have geo-coodinates and > > > addresses. If you are doing reverse go-code lookups, like I was > > > doing in > > a > > > prior job, then this is a perfect way to use memcached, since most > > reverse > > > geo-code lookups have relatively poor performance. For example, I > > > was > > doing > > > less than 4 reverse geo-codes per second on a big server with a > > > Web > > Service. > > > Once I memcached-enabled the Web Service, I was able to achieve > > > 4-5 times the throughput, because I was able to cache for very > > > long periods of time the addresses associated with latitude and > > > longitude. My application was school bus tracking -- so the same > > > stops occurred at the same lat/long > > day > > > after day -- there was no need to keep reverse geo-coding from > > > scratch > > every > > > single day. Of course, the trick was a good algorithm, for which > > > I used > > Jim > > > Gray's Hierarchical Triangular Matrix method of lat/long encoding > > > -- a > > real > > > work of genius -- it worked like a charm... > > > > Maybe a better solution for you is the new StreamInsight Complex > > > Event Processing Software in SQL Server 2008 R2 -- seehttp:// > >www.microsoft.com/sqlserver/2008/en/us/R2-complex-event.aspx. Maybe > > > what you want to do is act on the data as it comes in -- sending > > > alerts > > and > > > messages to your users as the data flows -- that in turn could > > > reduce > > your > > > query overhead. > > > > It would be interesting to hear more about what you are trying to > > accomplish > > > -- there just might be a way to save you from impending doom with > > > this application. > > > > Walt Crosby > > > VP of Development > > > Interval Data Systems, Inc. > > > > -----Original Message----- > > > From: memcached@googlegroups.com > > > [mailto:memcac...@googlegroups.com] On > > > > Behalf Of JustinSD > > > Sent: Tuesday, March 02, 2010 2:44 AM > > > To: memcached > > > Subject: How To Use Memcache With SQL 2008 > > > > So currently have a decent sized web application running Windows > > > IIS, > > .Net > > > C#, and using SQL Server 2008. Basically we have approximately > > > 150,000 records inserted a day, and our users then search and filter that data. > > > Currently the table holding the data is just about 10 million > > > rows. Our database is becoming a huge bottleneck, and currently we > > > just keeping throwing memory and CPU at the problem, but I am > > > wondering if caching is going to help us. > > > > I am unclear though how storing key value pairs translates into > > > fetching complicated results from memory. For example we have > > > queries which return back datetime, event_id, latitude, longitude, > > > address, city, state, how > > does > > > that all fit into a key value pair? Are u storing objects? > > > > How would this work for us? Our content inst very static, i.e. > > > rows are inserted constantly, how would that work? > > > > So, just trying to get my head around it. Thanks greatly.