小编And*_*y M的帖子

页眉中的 ObjID

我正在阅读这篇文章:存储引擎内部:页面剖析

我有一个数据库MyDB,数据库中有一个表MyTable

我有以下问题:

  1. 如果我这样做:

    (1) 使用以下查询查找表的对象 ID:

    Use MyDB;
    select sys.objects.name, sys.objects.object_id from sys.objects where (name = 'MyTable');
    
    Run Code Online (Sandbox Code Playgroud)

    (2) 然后使用以下命令查找分配给的所有页面MyTable

    dbcc ind(MyDB, 'MyTable', -1);
    
    Run Code Online (Sandbox Code Playgroud)

    (3)然后在结果表中,我选择其中一个数据页(页类型= 1),并使用以下命令:

    DBCC TRACEON(3604);
    DBCC PAGE (MyDB, 1, 17386, 3);
    
    Run Code Online (Sandbox Code Playgroud)

    那么在步骤(3)的转储内容(页头)中, m_objIdAllocUnitId.idObj)字段应该等于步骤(1)中获得的对象ID。那是对的吗?

    以及这是否适用于用户表和系统基表,例如sys.syscolpars基表?

    根据我的测试,以上两个结论都是正确的。

  2. 元数据:ObjectId 是什么意思?在文章中, 'metadata: objectId' <> m_objId。但是从我自己的测试来看,'metadata: objectId' 总是等于m_objId. 为什么?原始文章没有清楚地解释元数据。

我使用的是 SQL Server 2005、2008、2008 R2、2012 和 2014

sql-server metadata

5
推荐指数
1
解决办法
238
查看次数

Postgres 更新限制

我很好奇 Postgres 是否有任何可以限制为 ID 保留的行数的地方。

例如,假设我有一个 users 表和 login_coordinates 表。每次用户登录时,最新的坐标都会输入到用户表中的一列,并插入到 login_coordinates 表中。

我只想保留最后 10 条记录,并删除所有用户的 login_coordinates 表中的第 11 条(最旧)记录。

用户

   user_id            | current_coordinates        |    
----------------------+----------------------------+
    1                 | aaaa.bbbbb, aaaaa.bbbbbb   |    
    2                 | zzzz.xxxxxx, xxxxx.xxxcxx  |    
    3                 | dddd.xxxxxx, xxxxx.xxxcxx  |  
Run Code Online (Sandbox Code Playgroud)

登录坐标

  coordinates_id      | old_login_coordinates      |        user_id           |
----------------------+----------------------------+--------------------------+
    1                 | aaaa.bbbbb, aaaaa.bbbbbb   |     1                    |
    2                 | xxxxx.xxxxxx, xxxxx.xxxcxx |     1                    |
    3                 | xxxxx.xxxxxx, xxxxx.xxxcxx |     1                    |
Run Code Online (Sandbox Code Playgroud)

是否有任何将记录限制为每个用户 10 个坐标标识的东西,总是删除最旧的记录?

我正在使用 PostgreSQL 9.5。

postgresql database-design postgresql-9.5

5
推荐指数
1
解决办法
1228
查看次数

如何让mysqldump使用/*!40101 SET character_set_client = utf8mf4 */;?

当我使用 mysqldump 导出 mysql 数据库时,它总是产生一个 dump.sql 包含

...some other things...
/*!40101 SET character_set_client = utf8*/;
...some other things...
Run Code Online (Sandbox Code Playgroud)

这是我使用的 mysqldump 命令:

mysqldump -u root -p databaseName -R -E --single-transaction --default-character-set=utf8mb4 > dump.sql
Run Code Online (Sandbox Code Playgroud)

mysql数据库的字符集是utf8mb4而不是utf8,字符相关的变量是:

...some other things...
/*!40101 SET character_set_client = utf8*/;
...some other things...
Run Code Online (Sandbox Code Playgroud)

为什么mysqldump总是添加 /*!40101 SET character_set_client = utf8*/而不是 /*!40101 SET character_set_client = utf8mb4*/

如果/*!40101 SET character_set_client = utf8*/使用会发生什么?

我们可以使用mysqldump/*!40101 SET character_set_client = utf8mb4*/吗?

mysql mysqldump

5
推荐指数
1
解决办法
6691
查看次数

将单个传感器值与校正因子组合成一个整体值

对于学校项目,我们试图根据 5 个传感器(3x O3、1x 温度、1x 湿度)的组合来计算(校正)臭氧值。

我们在项目的其余部分使用 MySQL 和 PHP。

该表Measurements具有以下结构:

id (int(11))
time (datetime)
value (float)
measured_value (float)
sensor (tinytext)
unit (tinytext)
measurement_short_type (tinytext)
stream_id int(11)
Run Code Online (Sandbox Code Playgroud)

所以一个示例行看起来像这样:

ID    Time                 value  measured_value  sensor  unit   measurement_short_type  stream_id
----  -------------------  -----  --------------  ------  -----  ----------------------  ---------
3324  2016-05-21 11:00:34  0      193             O3r     KOhms  O3                      6511
Run Code Online (Sandbox Code Playgroud)

如您所见,我们有 2 列,value(float) 和measured_value(float)。

为了value根据单个传感器数据(存储在 中measured_value)计算正确的最终数据,我们需要对每个数据点应用与此类似的公式:

Corrected value[datetime] = ("6511".measured_value[datetime] * -0.106830613)
                          + ("6512".measured_value[datetime] * 0.065201457)
                          + …
Run Code Online (Sandbox Code Playgroud)

mysql-5.5 datetime

5
推荐指数
1
解决办法
35
查看次数

对大表进行分区并没有提高性能,为什么?

在 SQL Server 2014 中,我每周对我的一个大表进行分区,并定义了一个滑动窗口方案,将最早一周的数据切换到存档数据库,并为下周创建一个新分区。

这是结果:

在此处输入图片说明

这是针对 AVL 系统(车辆跟踪)的。我在PositionDate ( datetime )上进行了分区。我们所有的查询在 WHERE 子句中都有PositionDate,在许多情况下,我们在 WHERE 子句中也有VehicleId。所以我在VehicleId ( int )上创建了两个对齐的索引:

  • 一对(PositionDate,VehicleId) ;
  • 一个就只是(VehicleId)

但是在其 WHERE 子句中包含VehicleId 的每个查询中,这两个非聚集索引都没有使用(根据查询计划)。

我现在有一个性能问题。

我比较了分区表和非分区表之间的查询计划,如下所示:

Select * from MyNonPart_Table Where PositionDate between '2016-05-01' AND '2016-06-01'

Select * from PartitinedTable Where PositionDate between '2016-05-01' AND '2016-06-01'
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,我看到第一个查询花费了 30%,但第二个查询花费了 70%。

我有一个文件组,其中包含两个用于分区表的文件。

我的问题:

  1. 每个分区中的行数是否大于分区的最佳行数?如果我按天分区并保留最近 60 天的数据,这会帮助我提高性能吗?

  2. 我的非聚集索引是否定义明确,或者我应该删除它们?我们在所有查询的 WHERE 子句中都有PositionDate,在其中许多查询中都有VehicleId

  3. 我是否在这种情况下滥用分区?如果我在非分区表上定义良好的索引并将最旧的数据(超过 2 个月)移动到存档表,这对我的情况是否有效?

我的索引的 DDL:

ALTER …
Run Code Online (Sandbox Code Playgroud)

index sql-server partitioning

5
推荐指数
2
解决办法
2679
查看次数

根据开始和结束时间每小时拆分持续时间

我有一个表,用于注册设备的状态。状态有开始时间和结束时间。但现在我想知道每个小时的状态是什么。如果从 15:20 到 17:10 的状态是“Operating”,我想看到它在一天的第 16 个小时运行 40 分钟,第 17 个小时运行 60 分钟,第 18 个小时运行 10 分钟当天。

这就是我现在所拥有的:

Shift_date 状态 Start_timestamp End_Timestamp
---------- --------- --------------- ---------------
5/20/2017 运营 5/20/2017 8:21 5/20/2017 10:40
5/21/2017 延迟 5/20/2017 10:40 5/20/2017 11:10
5/22/2017 运营 5/20/2017 11:10 5/20/2017 13:50

这就是我要的:

Shift_date 小时状态持续时间(分钟)
---------- ---- --------- ----------
5/20/2017 1 .. ..
2017 年 5 月 20 日 ..... ..
5/20/2017 9 运营 39
5/20/2017 10 运营 60
5/20/2017 11 运营 40
5/20/2017 11 延迟 20
5/20/2017 …

sql-server-2008 sql-server

5
推荐指数
2
解决办法
1万
查看次数

ORA-04091: 表 ExpenseTable 正在发生变化,触发器/函数可能看不到它

我有两个表和一个触发器,并且正在ProjectsTable像这样插入值:

CREATE TABLE ProjectsTable
(
  ProjectID     NUMBER(6) NOT NULL,
  ProjectName   VARCHAR2(200) NOT NULL,
  Cost      NUMBER(10,2),
  ExpenseTotal  NUMBER(10,2),
  CostRemaining     NUMBER(10,2),
  PRIMARY KEY (ProjectID)
);

CREATE TABLE ExpenseTable
(
  ID            NUMBER(6) NOT NULL,
  ProjectID     NUMBER(6) NOT NULL,
  ExpenseAmount NUMBER(10,2),
  ExpenseDate   NUMBER(4),
  CONSTRAINT fk
  FOREIGN KEY (ProjectID)
  REFERENCES ProjectsTable(ProjectID)  
); 

CREATE TRIGGER ExpenseSum AFTER INSERT ON ExpenseTable FOR EACH ROW
BEGIN
    UPDATE ProjectsTable P
    SET ExpenseTotal = 
    (SELECT SUM(ExpenseAmount) from ExpenseTable
    where ExpenseTable.ProjectID= P.ProjectID)
    where P.ProjectID = :New.ProjectID;
END;
/

INSERT …
Run Code Online (Sandbox Code Playgroud)

trigger oracle oracle-11g insert

5
推荐指数
1
解决办法
4680
查看次数

是否可以在断开连接后刷新 PgAdmin 4 查询而不重新启动新查询?

有时我将 PgAdmin 会话单独放置一段时间,当我回来发出查询时,会收到错误

Server closed the connection unexpectedly. 
        This probably means the server terminated abnormally
        before or while processing the request.
******* Error **********
Run Code Online (Sandbox Code Playgroud)

所以,我知道我只需要重新连接,但似乎我必须关闭查询窗口并重新连接并打开一个新的查询窗口才能正常工作。

是否可以重新连接并使用相同的查询窗口?

有人建议我在错误出现后再次单击执行按钮,PgAdmin 将重新连接实例并执行查询。然而,这是行不通的。无论我尝试重新执行多少次,PgAdmin 都不会重新连接。

postgresql pgadmin-4

5
推荐指数
1
解决办法
5550
查看次数

如何恢复此 SQL 语句中的 MUST_CHANGE?

我执行了

SELECT N'ALTER LOGIN ' + QUOTENAME(name) 
  + N' WITH PASSWORD = N'''' MUST_CHANGE, CHECK_POLICY = ON;' 
  FROM sys.sql_logins 
  --WHERE is_policy_checked = 0;
Run Code Online (Sandbox Code Playgroud)

但我不想要MUST_CHANGE登录选项。

这个查询实际上改变了什么还是只是一个简单的选择?

sql-server t-sql

5
推荐指数
1
解决办法
795
查看次数

没有前 n 个字符的子串

我正在开发一个 SQL Server 2016 存储过程,我想获取varchar(38)列的最后一个字符。

我知道总会有至少 18 个字符,我不知道列的确切长度,因为它是可变的。

我想我可以得到列的长度并做一个减法来使用SUBSTRING,但我不能这样做,因为我正在这样做:

set @externalCodes = (
    select Serial, AggregationLevel
      from ExternalCode where ProductionOrderId = @productionOrderId
    for json path
Run Code Online (Sandbox Code Playgroud)

我正在生成一个 JSON,但我不知道如何获取Serial选择中每列的长度。

我的问题是:如何在不知道长度的情况下从没有前 18 个字符的字符串中获取子字符串?

一种解决方案可能是:

SUBSTRING(Serial, 18, 38)
Run Code Online (Sandbox Code Playgroud)

并且它总是返回从 18 到字符串末尾的子字符串,即使字符串的长度不是 38。

sql-server t-sql substring sql-server-2016

5
推荐指数
2
解决办法
2万
查看次数