我正在研究数据虚拟化解决方案。用户可以编写自己的 SQL 查询作为我所做查询的过滤器。我不想每次从数据库中选择一些东西时都运行这个过滤器查询(它可能是一系列复杂的连接)。
我的想法是在脚本级别使用 # temp 表并保持连接处于活动状态。然后将从中选择此#temp 表,但仅在用户更改过滤器时才更新。我的想法是我实际上可以从存储过程中使用它,并且表的范围仅限于该连接。
我从建议使用动态 sql 和 ## 以连接进程 ID 命名的全局临时表的人那里得到这个想法,以便使每个连接都有一个唯一的全局临时表。这是为了克服跨存储过程共享临时表的问题。但这似乎有点笨拙。
我用下面的代码做了一个快速测试,似乎工作正常
-- Run script at connection open from some app
SELECT * INTO #test
FROM dataTable
-- Now we can use stored procedures with #test table
EXECUTE selectFromTempTable
EXECUTE updateTempTable @sqlFilterString
EXECUTE selectFromTempTable
我能看到的唯一真正的问题是连接必须保持活动状态,持续时间可能是几个小时。一个用户可以同时运行多个连接。单个数据库服务器上的用户数最多为 20。如果这是一个大问题,我可以做到这一点,以便应用程序可以根据需要关闭和打开它们,这样每个用户一次只能打开 1 个连接。甚至可能在不使用时关闭它,并在需要时重新打开,延迟必须等待查询运行。
这是不好的做法吗?或因不运行过滤器查询而扼杀任何性能优势?这是在 SQL Server 2008 及更高版本上。