我有一个针对SQL Server 2012集群中的数据库运行的测试套件。我希望这个测试套件运行得尽可能快。我愿意为性能牺牲一切耐用性和可用性保证。数据库在每次测试运行期间都会重新创建,因此它甚至不必在服务器重新启动后继续运行。
用ALTER DATABASE [dbname] SET RECOVERY SIMPLE
改变恢复模型没有明显的区别。
一个不错的选择似乎是DELAYED_DURABILITY
,但这在2014年是新的,因此我无法使用。
我该怎么做才能在这个集群上创建一个速度极快的数据库?我试着查找内存中的数据库,但找不到任何选项。集群不允许我在本地磁盘上创建数据库,坚持要求它必须位于集群磁盘上。
更新:该应用程序使用了高级SQL Server功能,所以我很可能一直使用MS SQL Server。数据库本身非常小,因为它是用于测试的(8MB mdf,1MB ldf)。集群节点是网络中速度最快的服务器,所以如果我可以将其中一个节点误用为内存中的数据库,那肯定是最快的。但是怎么做呢?
如果由于某种原因,您被困在集群sql server实例上,但不希望持久性,也许您可以在tempdb上运行应用程序。Tempdb可以放在本地存储上,以避免集群开销。
还要注意,存储在tempdb上的数据最初将保留在缓冲池中,缓冲池是RAM内存,并且只有在sql server引擎找到更好的内存空间时才会异步溢出到磁盘。
您可以通过编写所有数据库对象的脚本并使用文本编辑器将数据库名称替换为"tempdb"来实现此解决方案。然后执行此脚本在tempdb上创建所有对象。还要将运行应用程序的用户的初始目录设置为tempdb和/或编辑所需的连接字符串。请记住,每次重新启动实例时都会重新生成tempdb。因此,您将丢失所有数据和ddl更改。
这肯定是"牺牲每一个耐用性和可用性保证"的最大努力。
这样的东西能工作吗(文档)?
CREATE DATABASE Sales
ON
( NAME = Sales_dat,
FILENAME = 'R:saledat.mdf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5 )
其中R:
是RAM驱动器
如果您想在本地磁盘上创建数据库,可以通过在共享上创建数据库来绕过集群限制。
你必须创建一个共享文件夹,放在集群的本地磁盘上;然后用UNC补丁创建数据库(例如:\\share\DATA\DATA.mdf);2012年不应该对此有限制,2008年你必须使用Trace标志1807;
使用一种名为"连续连接-分离"的技术来快速生成几乎处于动态状态的数据库:
我打赌你知道如何分离数据库,但作为提醒,运行以下内容:
EXEC sp_detach_db
在这个阶段,SQL服务器假定您已经删除了它。现在,使用以下方法附加到已存在的文件:EXEC sp_attach_db@dbname=N'myD',@filename1=N'myCurrentPath',@filename 2=N'pathToNewFile'
好的。这很容易,但我正在附加数据库的这些新文件是如何创建的?通过一个非常小且非常简单的.NET CSharp控制台应用程序,它已经将.mdf和.ldf的内容一次性读取到内存中,并将其写入您选择的文件:
读取和写入新创建的数据文件
整个情况是如何引发的?如中所述,使用DDL触发器附加数据库触发器
附加数据库触发器
关键是附加到一个已经读取(一次)的现有文件-将[多次]写入内存[使用您选择的程序,例如CSharp],这样您就可以在没有额外开销的情况下附加数据库。