首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何存储一组模拟参数的排列,为存储和解析的效率进行优化?

如何存储一组模拟参数的排列,为存储和解析的效率进行优化?
EN

Database Administration用户
提问于 2015-10-02 00:35:44
回答 1查看 861关注 0票数 4

我将使用我在不久的将来编写的一个应用程序来运行一系列的模拟,而且我在设计数据库时遇到了困难。

这就是它的工作原理。每个模拟有6个可以改变的参数,每个参数都有10个选项。因此,我们有大约100万个排列,以某种方式存储在DB中。我认为最简单的方法是为每个参数设置一个列,并为我的主键(ExperimentID)增加一个列。然后,我可以直接访问给定实验的参数,只需做一个简单的

代码语言:javascript
复制
SELECT * FROM Parameters WHERE ExperimentID = (givenID)

每个参数将作为int存储在DB中,我的应用程序将其解释为运行时的必要参数。

一个更复杂的方法,但我认为更快,方法是利用二进制移动的速度。我不直接存储参数,而是将每个参数的信息存储在一个无符号int的4位中。实际上,我不知道in是如何存储在DB中的(以二进制方式存储),所以这是主要的延迟。

在这种情况下有什么建议吗?另外,我还没有这些列,所以如果我决定使用第一个选项,我将如何用一组参数的所有排列填充一个表?

EN

回答 1

Database Administration用户

发布于 2015-10-02 02:21:36

我喜欢将测试参数存储在一个INT列中的想法。考虑到这一点,我创建了下面的测试床,它可能有助于解释如何使用测试参数创建表,以及如何在以后提取这些值。

首先,我们创建了3个表,用于构造0-4、0-7和0-9集。

代码语言:javascript
复制
CREATE TABLE dbo.numbers4 
(
    num INT NOT NULL
);
CREATE TABLE dbo.numbers7 
(
    num INT NOT NULL
);
CREATE TABLE dbo.numbers9 
(
    num INT NOT NULL
);

在这里,我们填充表:

代码语言:javascript
复制
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值:

代码语言:javascript
复制
CREATE TABLE dbo.t
(
    TestID INT NOT NULL
        CONSTRAINT PK_t
        PRIMARY KEY CLUSTERED
        IDENTITY(1,1)
    , TestParms INT NOT NULL
);

在这里,我们从上面的3个临时表中填充该表:

代码语言:javascript
复制
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个不同的集合中:

代码语言:javascript
复制
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结果的示例如下:

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/116780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档