小编ype*_*eᵀᴹ的帖子

不使用循环获取特定结果

我有一个表格,其中的数据对于单个用户来说是这样的

ID - 号码 - 子号码 - 姓名

1 101 201101 Jack
2 101 201102 Jack
3 101 201103 Jack
4 101 201107 Jack
5 101 201111 Jack
6 101 201112 Jack
7 101 201113 Jack
8 101 201161 Jack
9 101 201162 Jack
10 101 201163 Jack
11 101 201164 Jack
12 101 201165 Jack

我想得到这样的记录 without using any kind of loop.

号码 - 姓名 - 子号码

101 Jack (201101-201103, 201107, 201111-201113, 201161-201165)

目前我能够以这种形式获取记录

号码 - 姓名 - 子号码 …

sql-server-2005 sql-server

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

在文件流容器之间移动内容

我有一台运行 SQL Server 2012 的服务器,在一个表上有多个 Filestream 容器。

我需要通过创建一个新的文件流容器并移动数据来将现有的文件流容器之一拆分为两部分。

如何在文件流容器之间可靠地移动内容?

我将第一个容器设置为不再增长,但是如何在不写入全新表的情况下将文件移动到另一个容器?有没有办法做一个UPDATE会导致 SQL Server 再次将文件写入磁盘的语句?- 我曾想过附加一个额外的数据字节,然后将其删除,以使 SQL Server 将内容作为新文件写入,但有更好的方法吗?

sql-server sql-server-2012 filestream

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

具有多列的唯一索引/约束,一列可以为空

我的问题是是否有可能有由多列组成的唯一索引,其中一列可能包含NULL.

例子:命名“regulated_person” A表的数,包括列LAST_NAMEFIRST_NAMEBIRTH_DATEALIAS。的数据类型BIRTH_DATEdate,其他的则是 String/ VARCHARLAST_NAME,FIRST_NAME并且BIRTH_DATE不可为空,即它们需要值。ALIAS对于两个或更多人具有相同的名字/姓氏并且在同一天出生的情况,可作为决胜局。因为打破平局的情况并不常见,我想避免提供ALIAS值的需要,除非有必要。

作为后台,表的主键由自动增量生成器处理。唯一索引的目的是提供一个“业务键”,无需求助于主键即可识别行。我正在使用 MySQL 5.1.35 和 Hibernate ORM 版本。4.3.10.

欢迎任何有关除 MySQL 之外的服务器/数据库提供商的建议。

提前感谢您的任何指导,并提前为任何无意违反“论坛协议”的行为道歉,因为这是我第一次在任何地方提交问题。

mysql index null

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

帮助优化删除语句

使用 SQL Server 2012 Standard - 我正在根据另一个表的内容对一个表进行删除。这花费了相当长的时间(5 小时)并且对我来说似乎不是最佳选择,希望能提供一些优化语句的输入:

delete from [dbo].[tbl1]
where exists (
    select *
    from [dbo].[tbl2] t 
    where [dbo].[tbl1].[col1] = t.[col1]
    and [dbo].[tbl1].[col2] = t.[col2]
    and [dbo].[tbl1].[col3] = t.[col3]  
)
Run Code Online (Sandbox Code Playgroud)

各列如下:

tbl1.col1 varchar(10)
tbl1.col2 datetime
tbl1.col3 varchar(60)
tbl2.col1 varchar(10)
tbl2.col2 datetime
tbl2.col3 varchar(30)
Run Code Online (Sandbox Code Playgroud)

我意识到数据类型 col3不同,我知道这很糟糕,但这是否意味着无法使用索引?

每个表上都有一个非唯一聚集索引(此查询未涵盖)和两个表上的非聚集索引,涵盖 where 子句中包含的所有三列。

tbl1包含约 12 亿行,tbl2包含约 3000 万行。我预计将从中删除大约 3000 万行tbl1

任何帮助表示赞赏!

编辑:仅供参考,tbl1并且tbl2位于不同的文件组上,但位于同一个磁盘 (SAN) 上。另外,这里是执行计划:

执行计划

sql-server delete optimization sql-server-2012

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

如果表在多列上具有唯一约束,如何不“复制”表?

我有一个非常大的表 (35GB),它在四个列的组合中是独一无二的。

该表不是很宽,它唯一的四列是较大的列(以字节为单位)。最终结果是保持表唯一的索引是 21GB。这不是索引大小随时间膨胀的结果,而是索引创建后立即的大小。

我根本不需要优化插入速度,因为插入每月只会分批进行一次。一旦插入,任何行都不会进行任何更新。

我正在运行 PostgreSQL 9.5.0。

有没有办法不复制如此大的数据库部分来强制执行唯一约束?可能使用聚集索引之类的东西?

全表说明:

CREATE TABLE medi_cal_base_eligibility (
    client_index_number text NOT NULL,
    medi_cal_date date NOT NULL,
    eligibility_date date NOT NULL,
    aidcode text,
    responsible_county text,
    status text,
    cardinal smallint NOT NULL,
    id SERIAL PRIMARY KEY
);
Run Code Online (Sandbox Code Playgroud)

索引:

"medi_cal_base_eligibility_pkey" PRIMARY KEY, btree 
    (id)
"medi_cal_base_eligibility_uq_dates_cin_cardinal" UNIQUE CONSTRAINT, btree 
    (eligibility_date, client_index_number, medi_cal_date, cardinal)
Run Code Online (Sandbox Code Playgroud)

postgresql index-tuning postgresql-9.5

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

OFFSET ... 在第二页取重叠结果

使用时OFFSET ... FETCH,我得到了……有趣的结果。

这里有两个 sqlfiddles 来说明我的问题。

http://sqlfiddle.com/#!6/71ac1/4http://sqlfiddle.com/#!6/71ac1/8

第一个小提琴是第一页,而第二个是...第二页。

是未分页的结果。

首先,分页结果与未分页结果的顺序不同。我想我对此很酷,因为无论如何我都不会显示未分页的结果。

但是,尽管我指定的偏移量为 0,但由于某种原因,它决定将它们按输入的相反顺序放置,但它跳过了前 3 个。

在第二页上,我看到了出现在第一页上的结果。


尽管在本示例中是人为设计的,但它们都具有相同的值这一事实在我在现实生活中处理的特定查询中是现实的。这是一个表格,用户选择按 排序date

sql-server offset-fetch

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

“最小”键是什么意思?

我正在为我的数据库考试复习一些过去的论文,它问:

指定 R 的所有最小键

R(A,B,C,D,E)
A ? B
CD ? E
E ? A
B ? D
Run Code Online (Sandbox Code Playgroud)

我不确定最小键是什么意思,我试过在谷歌上搜索它,但它只提供了最小的超级键。它是否仅意味着最短的候选键:CD、CA、CE、CB?

我很困惑,因为在每个问题中他都使用了不同的名称,据我所知,最小超级键是候选键?

normalization

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

为什么我的查询一起运行比单独运行时花费的时间更长?

我有一系列遵循一般模式的更新语句:一次更新聚合来自另一个表(或有时是多个表)的值,下一次更新根据聚合值生成排名。对于总共 46 个更新语句,此过程重复 23 次。每个更新对独立运行需要 30-40 秒,但是当我通过 PgAdmin 将它们作为单个事务一起运行时,它需要一个多小时,而不是我期望的基于单个查询时间的约 15 分钟。(上次尝试时,我最终停止执行并单独运行它们。)

如果我通过 psql 在文件中运行相同的更新集,则该过程将在预期的 15 分钟时间内完成。

查询计划器是否有一些怪癖会根据在单个事务中运行的大量更新语句来更改执行计划?鉴于 psql 和 PgAdmin 之间的不同行为,我认为这与查询打包执行的方式有关,但我不太熟悉,无法了解其中的区别。

有没有办法编写我的代码,以便在通过 PgAdmin 作为单个事务运行时提高性能?

我在 Ubuntu 16.04 上使用 PostgreSQL 9.5。

以下是代码中的两个示例对联:

-- bike_driver_aggressive
UPDATE  generated.crash_aggregates
SET     bike_driver_aggressive = (
            SELECT  COUNT(*)
            FROM    crashes_bike2 c
            WHERE   c.int_id = crash_aggregates.int_id
            AND     c.aggressive_driverfault
        );
WITH ranks AS (
    SELECT  int_id,
            rank() OVER (ORDER BY bike_driver_aggressive DESC) AS rank
    FROM    crash_aggregates
)
UPDATE  generated.crash_aggregates
SET     bike_driver_aggressive_rank = ranks.rank
FROM    ranks
WHERE   crash_aggregates.int_id = ranks.int_id; …
Run Code Online (Sandbox Code Playgroud)

postgresql pgadmin execution-plan postgresql-9.5

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

可以用三级 B 树索引的最大记录数是多少?B+树?

我正在学习动态树结构组织以及如何设计数据库。

考虑具有以下特征的 DBMS:

  • 大小为 2048 字节的文件页
  • 12 字节的指针
  • 56 字节的页头

二级索引定义在 8 字节的页面上。可以用三级 B 树索引的最大记录数是多少?并且具有三级 B+树?

以下是这些树的两个示例:

B树

B+树

我的尝试

B+树

我读过那个

B+树比B树。因为除了最后一个之外,每个叶节点中只有表示为k最高键的集合存储在非叶节点中,组织为 B 树。关系 DBMS 内部,第 5 章:动态树结构组织,第 46 页

因此有一个区别,我们存储在 B 树的节点中的东西存储在 B+ 树的叶子中。因此,在我看来,它是(m-1) hm是顺序,h是高度),因为每个节点最多包含另一个节点的 (m-1) 个键。但这与字节数无关。

然而我在上面提到的书中找到了下表:

树的最小最大高度根据页面的大小

因此它会是 20 3.7条记录吗?

B树

对于他们来说,只要有一些值存储在节点中,我就必须除以节点数。而我被困在那里。

index tree database-size btree max

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

间隙和岛屿 - 寻找最近的岛屿

我正在处理以下场景,其中我的时间数据属于island 和 gaps。每隔一段时间,我需要根据事件发生的时间将落入现有间隙内的事件与其最近的岛屿相关联。

为了演示,假设我有以下定义我的时间段的数据:

在此处输入图片说明

这个数据是除了哪个ID之间存在间隙连续的27,对于所述时间段2017-07-26 00:03:00通过2017-07-26 00:07:00

为了确定最近的岛屿,我目前将差距分为两个时期,如下所示:

在此处输入图片说明

如果我有一个属于这个差距的事件,GapWindowStart/End时间将决定我需要将事件与哪个岛相关联。因此,例如,如果我有一个发生在 的事件2017-07-26 00:03:20,我会将该事件与 ID 相关联,2相反,如果我有一个事件发生在 ,2017-07-26 00:05:35我会将该事件与 ID 相关联7

最有效的方法,我已经能够编写我的方法,迄今为止,是组装使用的空白伊茨克奔甘的从SQL Server MVP深海潜水书第3解决方案通过ROW_NUMBER窗口函数,然后每一个分裂的差距CROSS APPLY作用的语句就像一个简单的UNPIVOT操作。

这是我用来组装最近的岛屿集的方法的db<>fiddle计划。

确定最近的岛屿后,我使用事件的事件时间来确定与所述事件相关联的最近岛屿。因为这些岛屿全天都在变化,所以我无法制作静态主表,而是必须在遇到事件时在运行时构建所有内容。

这是一个db<>fiddle 计划,显示应该针对随机事件时间使用什么 NearestIsland 值。

对于通常会落入间隙的给定事件,是否有更好的方法来找出最近的岛屿?例如,是否有更有效的方法来识别间隙或更有效的方法来识别最近的岛屿?我什至以最好的逻辑方式来解决这个问题吗?这个问题没有什么重要的,但我总是试图弄清楚是否有一种“更好”的方法来解决问题,我认为这个问题有助于一些创造力,所以我很想看到其他高性能的选择。

我目前使用的环境是 SQL 2012,但我们很快就会迁移到 SQL 2016 环境,所以我几乎可以接受任何东西。

第二个 db<>fiddle 链接的代码如下:

-- Creation of Test Data
CREATE TABLE #tmp
( …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 gaps-and-islands sql-server-2016

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