小编Col*_*art的帖子

聚集索引上的列存储索引(在声明主键时创建) - SQL Server

创建聚集索引时,表本身成为按索引键排序的索引结构。

想象一下,现在我们在表 XPTO (a,b,c,d,e) 中有 5 列,“a”是主键,我们在表 XPTO 上创建一个列存储索引,其中包含列 (b,c)。

这个索引的结构是什么?与聚簇表相比有不同的结构吗?或者列存储是否有指向聚集表的指针(如其他非聚集索引)。

最后,同样的场景但是创建了所有属性的列索引,结构是什么?

sql-server clustered-index sql-server-2012 columnstore sql-server-2014

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

sp_GetAppLock 性能下降异常行为

昨天我们遇到了一个关键问题,其中一个 1 秒的存储过程开始需要几分钟才能执行。我目前还不知道业务逻辑,但是想了解使用sp_GetAppLock.

所以场景是:

调用存储过程usp_abc,无参数

存储过程中的代码如下所示:

BEGIN
BEGIN TRANSACTION

sp_getapplock @Resource = usp_abc, @LockMode = 'Exclusive'

with cte_1
( SELECT TOP 1 ID FROM tbl1 WHERE Status = 'OK')

UPDATE tbl1
SET Status = 'Complete'
WHERE ID = (SELECT ID FROM cte_1)

COMMIT TRAN

END
Run Code Online (Sandbox Code Playgroud)

这个存储过程是从同一个应用程序调用的,但是在来自两个不同应用程序服务器的负载平衡器上。存储过程不断执行,昨天因为积压,我们遇到了更多问题(每秒多次)。

我昨天在查询 sp_who2 时看到的是存储过程的执行被较早的执行阻止了。大约有 5 个 SPID 在做同样的事情。我追溯了第一个 SPID 以查看资源等待。它在SOS_SCHEDULER_YIELD和 APPLICATION:5.0 " usp_abc"之间波动- 基本上是它本身。

看起来它自己陷入了一个令人讨厌的循环,但有时执行确实完成了。在没有锁定的情况下自行运行更新时,它按预期运行亚秒。

一旦负载平衡器关闭并且请求来自单一来源,问题就在查询中消失了。

这不是我们的代码,但是我们想就如何阻止这种情况再次发生提出建议。据我所知,开发人员出于并发原因并可能避免死锁而将其设置到位。

然而,根据代码判断,在这种情况下,本机 sql 读取提交应该就足够了,因为它应该锁定正在更新的数据,这意味着不可能两次更新同一条记录。我认为这个查询不会出现死锁问题。

你怎么看?

sql-server locking

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

完全外连接产生的关系的键

完全外连接产生的关系的键是什么?如果没有key,怎么说关系代数在它的算子下是封闭的,每个算子的结果也是一个关系?

join relational-theory

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

为科学数据设计。具有数百列的数据表或具有通用值列和数百行 (EAV) 的数据表?

我正在尝试改进我最近开始工作的生物医学科学实验室的数据存储。现有的工作流程非常糟糕,涉及许多不同格式的 Excel 工作表,所有这些工作表都通过复制粘贴和错误宏的过程进行聚合。

我的目的是创建一个简单的 python 脚本,它将实验的所有数据聚合到 SQLite 数据库中,然后生成必要的 CSV/XLSX 输出。

我的问题是,对于我们实验的单次试验,我们最终在大约 10 个不同的时间点记录了大约 100 个变量。我最初的冲动是创建一个valuevariable表:

CREATE TABLE value (val_id INTEGER PRIMARY KEY, 
                    value TEXT, 
                    var_id INTEGER,
                    event_id INTEGER,
                    exp_id INTEGER,
                    FOREIGN KEY (var_id) REFERENCES variable(var_id),
                    FOREIGN KEY (event_id) REFERENCES event(event_id),
                    FOREIGN KEY (exp_id) REFERENCES experiemnt(exp_id)
);

CREATE TABLE variable (var_id INTEGER PRIMARY KEY,
                      var_name TEXT,
                       var_type TEXT
);

value:
val_id | value | var_id | ...
0      | 10    | 0
1      | "ROSC"| 5

variable: …
Run Code Online (Sandbox Code Playgroud)

schema database-design eav

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

页到 MB,多个和划分或只是划分?

当您使用诸如sys.database_files之类的东西时,它以 8 KB 页面为单位给出文件的大小,而与它进行比较的许多其他内容以 MB 为单位。

有多种方法可以将 8 KB 页面转换为 MB,查询的答案中提供了几种方法来报告磁盘空间分配和已用空间

最常见的两种是

  • 乘以 8 并除以 1024 (128000 * 8 / 1024 = 100)
  • 除以 128 (128000 / 128 = 100)

第二种更简单,只需要一个操作。但两者似乎都给出了相同的答案。

选择一种方法而不是另一种方法有充分的理由吗?

sql-server database-size

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

如何使用 format() 函数引用限定表名?

format我在使用下面示例中的函数正确引用表名时遇到一些问题。

CREATE OR REPLACE FUNCTION copy_table(_source_tbl regclass, _target_tbl text)
 RETURNS bool AS $func$
DECLARE query_str text; 
BEGIN
  query_str = format($fmt$ DROP TABLE IF EXISTS %1$I; CREATE TABLE %1$I AS (TABLE %s); $fmt$, _target_tbl, _source_tbl);
  EXECUTE query_str;
  RAISE NOTICE '%', query_str;
 RETURN True;
END $func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我的困境是我想引用输入表名称_target_tbl作为标识符(以避免 SQL 注入)。但是,给定完整的表名称ex.test1,这会导致架构部分ex.被视为表名称的一部分,并public."ex.test1"在默认public.架构中创建表,如下所示。

我应该如何在此处正确引用/格式化标识符?

=> SELECT copy_table('ex.test', 'ex.test1');
NOTICE:  table "ex.test1" does not exist, skipping
NOTICE:   DROP TABLE IF EXISTS "ex.test1"; CREATE TABLE …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql postgresql-10

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

一张大桌子 vs 几张小桌子

请注意,下面的示例只是一个示例,我的场景要复杂得多,而且我尝试对其进行建模的方式确实很有意义

假设我正在我的一个应用程序中为审计事件创建一个表 - 所以所有的“event_created”、“user_created”等等。该表包含几列,其中一些是其他表的外键。随着时间的推移,这个单个表可以增长到数百万条记录。

从性能的角度来看,对所有这些事件使用单个表还是对每种事件使用单独的表并在单独的表上操作是更快、更高效?还是差别不大?为每种事件创建一个单独的表可能听起来很愚蠢,但您需要相信我,在我的现实世界场景中,这真的很有意义。

postgresql database-design physical-design

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

PL/SQL 函数接收一个数字并返回其二进制格式

我正在尝试编写一个函数来接收一个数字并返回其二进制格式。这是我迄今为止开发的内容,它可以用于输入:4,8,16 但它不会为其他数字返回正确的二进制格式。我找不到问题,我想知道你是否能找到问题?

create or replace function Show_Binary(i_Number in Number) Return Varchar2 
  AS

     V_Binary varchar2(50) := '';
     i_Number2 Number := i_Number;
       Begin
         While i_Number2>=2 LOOP

          V_Binary := V_Binary || Remainder(i_Number2, 2);
          i_Number2 := i_Number2 / 2;

       End LOOP;
          V_Binary := V_Binary || TO_CHAR(i_Number2);
          select reverse (V_Binary) into V_Binary from dual;
      return (V_Binary);
   End;
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g plsql

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

作为 INSERT INTO ... RETURNING 的结果包括未插入的行

我正在使用 PostgreSQL 11。我想有条件地将值插入表中,同时插入的结果包括null未导致插入的输入的每一行。

例如

CREATE TABLE all_sums (sum INTEGER);
SELECT
    CASE WHEN a_sum IS NULL THEN null
         ELSE (SELECT sum FROM (INSERT INTO sums (sum) VALUES (sum) RETURNING sum))
    END
FROM
    (SELECT a + b FROM (VALUES (1, null), (null, 2), (2, 3)) AS row (a, b))
AS a_sum;
Run Code Online (Sandbox Code Playgroud)

应该导致表格all_sums看起来像:

all_sums: sum
         ------
           5
         (1 row)
Run Code Online (Sandbox Code Playgroud)

但查询的输出应该是:

 null
 null
 5
------
(3 rows)
Run Code Online (Sandbox Code Playgroud)

此示例因语法错误而失败:

ERROR:  syntax error at or near "INTO"
Run Code Online (Sandbox Code Playgroud)

有什么方法可以实现所需的查询输出?


(对于上下文:我这样做的原因是因为还有进一步的查询依赖于知道插入是否发生在特定行上。

这是通过将我的查询从每行一个转换为每列一个来更有效地从文件中插入一些数据的努力的一部分。不过,我不是在寻找其他提高插入速度的技巧,如果不可能,我很高兴在这一点上结束。)

postgresql insert subquery case postgresql-11

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

是否可以将 SQL Server Developer Edition 安装为主要开发服务器?

是否可以在 Windows 服务器环境中安装 SQL Server 开发版作为开发服务器?每个开发人员都将拥有相同 SQL Server 版本的本地副本,并将连接到此开发服务器以进行数据/对象同步。

此外,如果您可以参考此产品的完整说明的链接。

sql-server installation

4
推荐指数
2
解决办法
321
查看次数