标签: sql-server-2012

将一亿行表拆分成多个表

我有一个 SQL Server 2012 数据库。有一个表的行数超过 1 亿。我想将该表拆分为多个相似的表,每个表中有 100 万行。快速实现这一目标的最佳方法是什么?

我试过分页,但它花费了太多时间,有时在 SSMS 中会出现内存不足的异常。

有 12 列。11个是varchar,一个是datetime。表中没有可用的主键,也没有ID列。这是我们迁移到 SQL Server 2012 的一个非常旧的数据库表。

它的大小约为 20 GB。没有可用的索引。我不想更复杂,我只需要拆分它。

performance sql-server sql-server-2012

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

将 SQL Server 默认实例的文件夹移动到同一服务器上的另一个路径

我的客户安装了 SQL Server 2012 默认实例。但是默认实例的文件夹和数据文件夹在同一个磁盘上。

我想将默认实例的文件夹移动到另一个磁盘 ( C:Program Files\Sql Server\)。

我可以在不卸载现有实例然后安装新实例的情况下执行此操作吗?

instance sql-server-2012

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

SQL Server 2012 如何从现有数据库中创建新架构,仅选择数据库对象的子集?

我正在寻找一种从现有数据库创建新模式的方法,只选择数据库对象的子集。即我想要一些“数据库表示”,它只包括明确指定的表的子集。创建包含/无法访问数据库中所有对象的模式的最简单方法是什么。有可能吗?
我正在尝试在 MS SQL Server 2012 R2 中执行此操作。

schema sql-server-2012

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

在不应该触发的时候触发

我有以下触发器:

CREATE TRIGGER SalaryCannotDecrease ON Employees
AFTER UPDATE
AS
IF EXISTS (
            SELECT *
            FROM inserted, deleted
            WHERE inserted.Salary < deleted.Salary
            )
BEGIN
    RAISERROR 30002 'You cannot decrease salary';
    ROLLBACK TRANSACTION;
    RETURN
END;
Run Code Online (Sandbox Code Playgroud)

当我尝试执行以下操作时,此触发器正在触发:

UPDATE Employees
SET Salary = Salary * 1.05
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

sql-server-2012

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

如果您不查询分区值,分区是否有帮助?

假设我有一个分区orders.Order表(日期时间列设置为创建行时)。 CreatedWhenGetDate()

该表有超过 1000 万行,分区是每季度一次(或一些这样的固定时间间隔)。

如果我运行如下查询:

SELECT ord.OrderId, ord.ClientId, ord.ReceptId, ord.Cost, agt.State
FROM   orders.Order ord
       join personnel.Agent agt
          on ord.AgentId = agt.AgentId
WHERE  agt.FirstName = 'Bob'
       and LastName = 'Whiely'
       and ord.Cost > 135
Run Code Online (Sandbox Code Playgroud)

我会从这个查询的分区中看到任何好处吗?

我看不出有什么好处,因为我没有在查询中使用分区值,并且仍然需要搜索所有表。

注意:查询的结果都会在最近的分区中。但我看不出这会有什么帮助。

第二个注意事项:分区都在同一个 SAN 驱动器上(系统管理员不会让它以任何其他方式存在),因此磁盘 IO 不会并行。

有没有更好的分区方法,以便像上面那样的随机查询性能更好?(也许在主键上?)

第三个注意:上面的查询是组成的。我用它来表明我有许多查询命中了许多随机列(已正确编入索引)。

sql-server partitioning sql-server-2012

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

如果启用“行外大值类型”表选项,则表大小会增加

我最近了解了sp_tableoption,它使您能够为特定表存储“行外大值类型”。

我的一个同事告诉我,如果我启用它,每个字段至少存储在 8 KB 页面上,无论它有多大。我无法找到对此的确认,因此我运行了以下测试:

DROP TABLE Size

CREATE TABLE Size
(
    [ID] TINYINT
   ,[Text] NVARCHAR(MAX)
)


EXEC sp_tableoption 'Size' ,'large value types out of row' ,0

TRUNCATE TABLE Size

INSERT INTO Size
SELECT 1, N'in row text'
UNION ALL
SELECT 2, N'' -- add here very large string

SELECT [ID], DATALENGTH([Text]) Size, LEN([Text]) [Len]
FROM [dbo].[Size]

EXEC sp_spaceused Size;


DROP TABLE Size

CREATE TABLE Size
(
    [ID] TINYINT
   ,[Text] NVARCHAR(MAX)
)

EXEC sp_tableoption 'Size' ,'large value types …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2012

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

插入多个查询是否与单个查询花费相同的时间?

我有一个要求,我必须插入很多行。对于插入,我们像这样使用

insert into emp(name,age) values('abc',12);
Run Code Online (Sandbox Code Playgroud)

这将只插入一行。对于插入多行,我们可以多次编写插入查询或编写具有多个值的单个查询。例如

条件 1

insert into emp(name,age) values('abc1',121);
insert into emp(name,age) values('abc2',122);
insert into emp(name,age) values('abc3',12);
Run Code Online (Sandbox Code Playgroud)

条件2

insert into emp(name,age) values('abc',12),('abc2',122),('abc3',12);
Run Code Online (Sandbox Code Playgroud)

我的问题是上面的(条件 1 和条件 2)都需要时间吗?我猜条件 2 比条件 2 花费的时间少。如果我的猜测是真的,那么原因是什么?

performance sql-server insert t-sql sql-server-2012

3
推荐指数
2
解决办法
5151
查看次数

事先找出查询有多少条记录

我在 ExtJS 中开发了 SQL Server 2012 中查询结果的报告。

我将 Ext.Grid 与分页一起使用,因此我可以使用偏移量来限制查询将返回的记录数量。但是为了让这个 ExtJS 功能起作用,我仍然必须向它提供给定查询所具有的记录总数。

有些报告在白天使用过滤器和数据更改,因此我只能通过运行查询来知道总数。这导致运行它两次:一次使用 count(*) 获得总计数,再次获得正确的数据。

有没有办法找到查询的总数,即使它有偏移命令,而不必像我现在所做的那样运行它两次,也不必循环遍历所有记录?

sql-server optimization sql-server-2012 query-performance

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

为什么此统计信息不针对过滤索引自动更新?

在 SQL Server 2012 SP1 实例中,我在表的 PK 列上有一个筛选索引,如下所示:

CREATE INDEX [RF_IXF_Orders_OrderNumber] ON [dbo].[Orders]
(
    [OrderNumber] ASC
)
WHERE [OrderSource]='MO'
AND [Cancelled]=(0)
AND [NumItems]>(0)
AND [OrderDate]>'2014-05-15';
Run Code Online (Sandbox Code Playgroud)

索引的 Row Count (dm_db_partition_stats.row_count) 为 8416,Rows Changed (sysindexes.rowmodctr) 为 16803 (193.6%),Auto Update Statistics 为 True。有 8400 个 user_scans 和 50,088 个 user_updates。上次 user_scan 是今天,但统计数据已经大约一周没有更新了。

为什么统计数据不会自动更新?

statistics sql-server-2012

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

使用视图的 SQL Server 执行计划,但存储过程中没有视图

我正在对这个缓慢的存储过程进行故障排除,在检查实际执行计划时,我注意到一个可能缺少索引的警告。仔细看看,它反对其中一个观点,而不是实际的表格。这怎么可能?

当然,物理表正在使用,但实际视图不是!

视图是这样的:

CREATE VIEW [ws].[MyVIEWTable]
WITH SCHEMABINDING
AS
SELECT col1, col2
  FROM [dbo].[MyTable]
Run Code Online (Sandbox Code Playgroud)

为什么 SQL Server 引擎使用视图来检索数据而不是实际的物理表,在这种情况下是dbo.MyTable

performance view sql-server-2012 query-performance

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