我有一个 SQL Server 2012 数据库。有一个表的行数超过 1 亿。我想将该表拆分为多个相似的表,每个表中有 100 万行。快速实现这一目标的最佳方法是什么?
我试过分页,但它花费了太多时间,有时在 SSMS 中会出现内存不足的异常。
有 12 列。11个是varchar,一个是datetime。表中没有可用的主键,也没有ID列。这是我们迁移到 SQL Server 2012 的一个非常旧的数据库表。
它的大小约为 20 GB。没有可用的索引。我不想更复杂,我只需要拆分它。
我的客户安装了 SQL Server 2012 默认实例。但是默认实例的文件夹和数据文件夹在同一个磁盘上。
我想将默认实例的文件夹移动到另一个磁盘 ( C:Program Files\Sql Server\)。
我可以在不卸载现有实例然后安装新实例的情况下执行此操作吗?
我正在寻找一种从现有数据库创建新模式的方法,只选择数据库对象的子集。即我想要一些“数据库表示”,它只包括明确指定的表的子集。创建包含/无法访问数据库中所有对象的模式的最简单方法是什么。有可能吗?
我正在尝试在 MS SQL Server 2012 R2 中执行此操作。
我有以下触发器:
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)
我在这里做错了什么?
假设我有一个分区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 不会并行。
有没有更好的分区方法,以便像上面那样的随机查询性能更好?(也许在主键上?)
第三个注意:上面的查询是组成的。我用它来表明我有许多查询命中了许多随机列(已正确编入索引)。
我最近了解了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) 我有一个要求,我必须插入很多行。对于插入,我们像这样使用
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 花费的时间少。如果我的猜测是真的,那么原因是什么?
我在 ExtJS 中开发了 SQL Server 2012 中查询结果的报告。
我将 Ext.Grid 与分页一起使用,因此我可以使用偏移量来限制查询将返回的记录数量。但是为了让这个 ExtJS 功能起作用,我仍然必须向它提供给定查询所具有的记录总数。
有些报告在白天使用过滤器和数据更改,因此我只能通过运行查询来知道总数。这导致运行它两次:一次使用 count(*) 获得总计数,再次获得正确的数据。
有没有办法找到查询的总数,即使它有偏移命令,而不必像我现在所做的那样运行它两次,也不必循环遍历所有记录?
在 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 是今天,但统计数据已经大约一周没有更新了。
为什么统计数据不会自动更新?
我正在对这个缓慢的存储过程进行故障排除,在检查实际执行计划时,我注意到一个可能缺少索引的警告。仔细看看,它反对其中一个观点,而不是实际的表格。这怎么可能?
当然,物理表正在使用,但实际视图不是!
视图是这样的:
CREATE VIEW [ws].[MyVIEWTable]
WITH SCHEMABINDING
AS
SELECT col1, col2
FROM [dbo].[MyTable]
Run Code Online (Sandbox Code Playgroud)
为什么 SQL Server 引擎使用视图来检索数据而不是实际的物理表,在这种情况下是dbo.MyTable?
sql-server-2012 ×10
sql-server ×4
performance ×3
t-sql ×2
insert ×1
instance ×1
optimization ×1
partitioning ×1
schema ×1
statistics ×1
view ×1