我将使用我在不久的将来编写的一个应用程序来运行一系列的模拟,而且我在设计数据库时遇到了困难。
这就是它的工作原理。每个模拟有6个可以改变的参数,每个参数都有10个选项。因此,我们有大约100万个排列,以某种方式存储在DB中。我认为最简单的方法是为每个参数设置一个列,并为我的主键(ExperimentID)增加一个列。然后,我可以直接访问给定实验的参数,只需做一个简单的
SELECT * FROM Parameters WHERE ExperimentID = (givenID)每个参数将作为int存储在DB中,我的应用程序将其解释为运行时的必要参数。
一个更复杂的方法,但我认为更快,方法是利用二进制移动的速度。我不直接存储参数,而是将每个参数的信息存储在一个无符号int的4位中。实际上,我不知道in是如何存储在DB中的(以二进制方式存储),所以这是主要的延迟。
在这种情况下有什么建议吗?另外,我还没有这些列,所以如果我决定使用第一个选项,我将如何用一组参数的所有排列填充一个表?
发布于 2015-10-02 02:21:36
我喜欢将测试参数存储在一个INT列中的想法。考虑到这一点,我创建了下面的测试床,它可能有助于解释如何使用测试参数创建表,以及如何在以后提取这些值。
首先,我们创建了3个表,用于构造0-4、0-7和0-9集。
CREATE TABLE dbo.numbers4
(
num INT NOT NULL
);
CREATE TABLE dbo.numbers7
(
num INT NOT NULL
);
CREATE TABLE dbo.numbers9
(
num INT NOT NULL
);在这里,我们填充表:
INSERT INTO dbo.numbers4 (num)
SELECT TOP(5) (ROW_NUMBER() OVER (ORDER BY o.name)) - 1
FROM syscolumns o;
INSERT INTO dbo.numbers7 (num)
SELECT TOP(8) (ROW_NUMBER() OVER (ORDER BY o.name)) - 1
FROM syscolumns o;
INSERT INTO dbo.numbers9 (num)
SELECT TOP(10) (ROW_NUMBER() OVER (ORDER BY o.name)) - 1
FROM syscolumns o;这是我们将使用的表,用于存储结合6组数字的位移位INT值:
CREATE TABLE dbo.t
(
TestID INT NOT NULL
CONSTRAINT PK_t
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, TestParms INT NOT NULL
);在这里,我们从上面的3个临时表中填充该表:
DECLARE @p1 INT;
DECLARE @p2 INT;
DECLARE @p3 INT;
DECLARE @p4 INT;
DECLARE @p5 INT;
DECLARE @p6 INT;
SET @p1 = 0x1;
SET @p2 = 0x10;
SET @p3 = 0x100;
SET @p4 = 0x1000;
SET @p5 = 0x10000;
SET @p6 = 0x100000;
TRUNCATE TABLE dbo.t;
INSERT INTO dbo.t (TestParms)
SELECT (n1.num
+ n2.num * @p2
+ n3.num * @p3
+ n4.num * @p4
+ n5.num * @p5
+ n6.num * @p6)
FROM dbo.numbers4 n1
, dbo.numbers4 n2
, dbo.numbers7 n3
, dbo.numbers7 n4
, dbo.numbers9 n5
, dbo.numbers9 n6;下一部分将展示如何从单个INT列中将数字提取到6个不同的集合中:
DECLARE @p1 INT;
DECLARE @p2 INT;
DECLARE @p3 INT;
DECLARE @p4 INT;
DECLARE @p5 INT;
DECLARE @p6 INT;
SET @p1 = 0xF;
SET @p2 = 0xFF;
SET @p3 = 0xFFF;
SET @p4 = 0xFFFF;
SET @p5 = 0xFFFFF;
SET @p6 = 0xFFFFFF;
DECLARE @p1_shift INT;
DECLARE @p2_shift INT;
DECLARE @p3_shift INT;
DECLARE @p4_shift INT;
DECLARE @p5_shift INT;
DECLARE @p6_shift INT;
SET @p1_shift = 0x1;
SET @p2_shift = 0x10;
SET @p3_shift = 0x100;
SET @p4_shift = 0x1000;
SET @p5_shift = 0x10000;
SET @p6_shift = 0x100000;
SELECT t.TestID
, Param1 = (t.TestParms & @p1)
, Param2 = (t.TestParms & @p2) / @p2_shift
, Param3 = (t.TestParms & @p3) / @p3_shift
, Param4 = (t.TestParms & @p4) / @p4_shift
, Param5 = (t.TestParms & @p5) / @p5_shift
, Param6 = (t.TestParms & @p6) / @p6_shift
FROM dbo.t t;由于只有160,000行(您建议的排列数),这个表只需要2.6MB的存储空间(大约330个数据页),包括IDENTITY列,这可能是必需的,也可能不是必需的。
上述select结果的示例如下:

https://dba.stackexchange.com/questions/116780
复制相似问题