Я закончил тем, что создал элементарную инфраструктуру общего назначения для кэширования результатов функции или представления SQL в таблицу.
Public Sub CreateCacheTable(ByVal SourceView As String, ByVal FieldList As String)
Dim CacheTable As String = GetCacheTableName(SourceView)
If Not TableExists(CacheTable) Then
Dim Sql As String = " Select ~FieldList~ Into ~CacheTable~ From ~SourceView~ ". _
Replace("~CacheTable~", CacheTable). _
Replace("~FieldList~", FieldList). _
Replace("~SourceView~", SourceView)
ExecuteNonQuery(cs, CommandType.Text, Sql)
End If
End Sub
Public Function GetCacheTableName(ByVal SourceView As String)
Dim Result As String = "_c_~SourceView~". _
Replace("~SourceView~", SourceView). _
Replace(".", "_"). _
Replace(",", "_"). _
Replace("[", ""). _
Replace("]", ""). _
Replace("(", ""). _
Replace(")", "")
Return Result
End Function
Public Sub CleanupCacheTables()
ExecuteNonQuery(cs, CommandType.StoredProcedure, "CleanupCacheTables")
End Sub
Когда страница загружается, я делаю это:
CleanupCacheTables()
CreateCacheTable(SourceView, FieldList)
Например, если SourceView равен DirectoryContactsByContact(123)
, создается таблица с именем _c_DirectoryContactsByContact_123
.
Вот SQL для CleanupCacheTables
:
Create Procedure CleanupCacheTables as
/* Finds all tables starting with _c_ that were created more than 30 minutes ago and drops them */
Declare @TableName nvarchar(255)
Declare CacheTableCursor Cursor for
Select
TableName=name
From SYS.OBJECTS
Where Type_Desc = 'USER_TABLE'
And Left(name,3)= '_c_'
And DateDiff(minute, create_date, GetDate())>30
Open CacheTableCursor
Fetch Next from CacheTableCursor into @TableName
While @@FETCH_STATUS = 0 Begin
Exec ('Drop Table ' + @TableName)
Fetch Next from CacheTableCursor into @TableName
End -- While
Close CacheTableCursor
Deallocate CacheTableCursor
Go
Это грубо: нет аннулирования, и, вероятно, оно не будет масштабироваться для большого количества одновременно работающих пользователей и / или очень больших наборов данных. Тем не менее, в моем случае это приводит к почти мгновенным результатам, когда пользователь вводит или выбирает критерии поиска, с очень небольшими издержками.