标签: sql-server

In-Memory Table 的性能比基于磁盘的表差

我在 SQL Server 2014 中有一个表,如下所示:

CREATE TABLE dbo.MyTable
(
[id1] [bigint] NOT NULL,
[id2] [bigint] NOT NULL,
[col1] [int] NOT NULL default(0),
[col2] [int] NOT NULL default(0)
)
Run Code Online (Sandbox Code Playgroud)

(id1,id2) 是 PK。基本上,id1 是一个标识符,用于对一组结果(id2、col1、col2)进行分组,其 pk 是 id2。

我正在尝试使用内存表来摆脱现有的基于磁盘的表,这是我的瓶颈。

  • 表中的数据写入->读取->删除一次。
  • 每个 id1 值都有几个(数十/数百)数千个 id2。
  • 数据在表中存储的时间很短,例如 20 秒。

对该表执行的查询如下:

-- INSERT (can vary from 10s to 10,000s of records):
INSERT INTO MyTable
  SELECT @fixedValue, id2, col1, col2 FROM AnotherTable

-- READ:
SELECT id2, col1
FROM MyTable INNER JOIN OtherTbl ON MyTable.id2 = OtherTbl.pk
WHERE …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2014 memory-optimized-tables

10
推荐指数
1
解决办法
4226
查看次数

将多个数据库备份到同一时间点

通常,当我们开始备份时,我们不允许提交更改,否则将无法访问数据库。我的意思是数据库将处于单用户模式,但我想开始备份并释放数据库以供使用。此外,一旦我开始备份,我不希望将正在进行的更改写入备份文件。我想知道如何在 Microsoft SQL Server 2012 中实现这一点。请帮助我。

好吧,让我先解释一下我的问题。目前我将数据库设置为单用户模式,直到备份完成。这种模式将有助于我在备份过程中避免数据更改的目的。但是我的应用程序与多个数据库相关联(每个数据库相互关联,并且有每个月不断创建的 var dbs)。因此,备份所有这些数据库已成为乏味的过程,更重要的是,在进行备份时,我必须将用户排除在系统之外。

因此,我正在寻找满足以下要求的备份机制。

  1. 一次启动所有数据库的备份,并释放数据库以供使用。
  2. 由于数据库相互链接,我希望在备份文件中保持数据一致性。因此,由于此数据一致性要求,我不希望将更改提交到我的备份文件。

我想要的是 - 在给定时间备份所有数据库。

sql-server backup sql-server-2012

10
推荐指数
2
解决办法
3245
查看次数

哪种方式设计购物车表更好 - SQL Server

我想在网上商店中创建一个购物车。我有两种设计购物车的方法,但我不知道哪个更好。

解决方案1:创建一个如下表:

在此处输入图片说明

以这种方式为每个产品为用户添加新行。

注意UserId 和 ProductId 是唯一的

解决方案2:

使用两个表:购物车,cartItem

在此处输入图片说明

这样就为每个用户只在ShoopingcartTable 中创建了一条记录。

你有什么意见?

database-design sql-server

10
推荐指数
1
解决办法
3万
查看次数

获取存储过程结果列类型

我试图获取存储过程返回的任何内容,以及列名及其类型。我可以用表来做到这一点,但我无法弄清楚存储过程。我尝试过,sp_columns但只能使其适用于表格。

我也尝试过这样的事情,但我不确定我应该匹配什么。

SELECT * 
FROM SYS.PROCEDURES (NOLOCK) AS AA
INNER JOIN SYS.SCHEMAS (NOLOCK) AS BB ON (AA.schema_id = BB.schema_id)
INNER JOIN SYS.COLUMNS (NOLOCK) AS CC ON (AA.object_id = CC.object_id)
Run Code Online (Sandbox Code Playgroud)

例如:

USER_ID VARCHAR(200)
Run Code Online (Sandbox Code Playgroud)

我只需要存储过程返回的列名及其数据类型。如果重要的话,SQL Server 版本是 2014。

有任何想法吗?谢谢。

sql-server stored-procedures datatypes

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

SQL Server Management Studio (SSMS) 中活动监视器中的 SQLCLR 等待类型是什么?

当我检查我们的 SQL Prod 服务器时,每次打开活动监视器时,我总是SQLCLR在活动监视器的资源等待部分的第一个列表中看到。它总是有一个很高的数字。是SQLCLR为了什么?SQLCLR在活动监视器中具有高资源等待数的服务器是否有害?

sql-server activity-monitor sql-server-2012 sql-clr

10
推荐指数
1
解决办法
3万
查看次数

执行计划不使用 INDEX,它使用表扫描

我知道在使用索引或表扫描时,SQL Server 使用统计信息来查看哪个更好。

我有一个有 2000 万行的表。我在 (SnapshotKey, Measure) 和这个查询上有一个索引:

select Measure, SnapshotKey, MeasureBand
from t1
where Measure = 'FinanceFICOScore'
group by Measure, SnapshotKey, MeasureBand
Run Code Online (Sandbox Code Playgroud)

查询返回 500k 行。所以查询只选择了表中 2.5% 的行。

问题是为什么 SQL Server 不使用我拥有的非聚集索引,而是使用表扫描?

统计数据已更新。

值得一提的是,查询性能很好。

表扫描

表扫描

强制索引

力指数

表/索引结构

CREATE TABLE [t1](
    [SnapshotKey] [int] NOT NULL,
    [SnapshotDt] [date] NOT NULL,
    [Measure] [nvarchar](30) NOT NULL,
    [MeasureBand] [nvarchar](30) NOT NULL,
    -- and many more fields
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

表上没有PK,因为它是一个数据仓库。

CREATE NONCLUSTERED INDEX [nci_SnapshotKeyMeasure] ON [t1]
(
    [SnapshotKey] ASC,
    [Measure] ASC
)
Run Code Online (Sandbox Code Playgroud)

index sql-server optimization execution-plan sql-server-2012

10
推荐指数
3
解决办法
6846
查看次数

克服 SQL Server Express Edition 限制

Microsoft SQL Server 2014 Express 版的数据库大小限制为 10GB。现在,这只是针对单个实例还是版本允许的整体大小?或者这是否意味着如果每个数据库小于 10GB,我可以使用该版本拥有尽可能多的数据库?

database-design sql-server

10
推荐指数
1
解决办法
1390
查看次数

请解释行和页压缩的区别

我正在尝试确定应用哪个以及何时是应用压缩的合适时间。我发布这个问题是为了从这个社区获得洞察力。我已经阅读了几篇文章,但希望在 DB Administrators 中有一个解决此问题的地方。

sql-server compression

10
推荐指数
2
解决办法
9591
查看次数

为什么在调用函数时必须使用模式前缀 (dbo)?

当用户使用默认架构 (dbo) 映射时,我们可以选择 [dbo] 下的所有表,而无需为架构添加前缀。

如果它在默认模式下,我们可以执行没有前缀的存储过程。

鉴于此,为什么我们需要使用模式为函数添加前缀?

谢谢!

sql-server functions

10
推荐指数
2
解决办法
9224
查看次数

选择满足组条件的行(无临时表)

有 3 列的表:

ID  category    flag
1       A       1
2       A       0
3       A       0
4       B       0
5       C       0
Run Code Online (Sandbox Code Playgroud)

我想选择flag = 1每个类别至少有一次的所有行。

预期成绩:

ID  category    flag
1       A       1
2       A       0
3       A       0
Run Code Online (Sandbox Code Playgroud)

可以使用这样的临时表来解决:

select ID into #tempTable from someTable where flag = 1
select * from someTable join #tempTable on someTable.ID = #tempTable.ID
Run Code Online (Sandbox Code Playgroud)

但我更喜欢分组的解决方案,我很难想出。任何帮助将不胜感激。

sql-server group-by

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