我正在设计一组可能需要使用彼此的存储过程或表的数据库。我创建单独的数据库的原因是,将来我希望能够在需要时将这些数据库中的任何一个移动到自己的专用服务器上,并且只需创建一个链接服务器到其他服务器。但是这样做我还需要更改访问其他数据库的所有代码。
有没有人知道在使用链接服务器的情况下有什么方法可以避免以后的修改?
或者换句话说:
无论是否需要访问链接服务器或同一本地服务器,都可以使用存储过程吗?
例子 :
DatabaseA 和 DatabaseB 都位于 DatabaseB 上的 SQLInstantA Sp 上:
SELECT * FROM DataBaseA.dbo.tbx
Run Code Online (Sandbox Code Playgroud)
现在,如果我将 DatabaseB 移动到 SQLInstanceB,并为 SQLInstanceA 创建一个链接服务器,我必须将 SP 代码更改为以下内容:
SELECT * from linkedserverName.DatabaseA.dbo.tbx
Run Code Online (Sandbox Code Playgroud)
无论如何要避免在移动数据库的情况下进行这种更改?
考虑两种更新数据的方法:
Approach 1:
Update Table 1, commit
Update Table 2, commit
Update Table 3, commit
Approach 2:
Update Table 1, Table 2, Table 3, commit.
Run Code Online (Sandbox Code Playgroud)
现在方法 1 不是原子的并且使用三个事务。然而,可以说方法 2 会更长时间地挂在锁上,因此也不会扩展。在不需要真正原子性的场景中,是否可以论证方法 1 的性能会更好,因为它不会长时间挂在锁上。
问题是,您需要统计数据和证据来做出良好的架构决策,而不仅仅是推测。我想为 SqlServer 设置跟踪,以便我可以了解两种方法之间的性能差异有多大?我想知道是1ms还是500ms?
我猜不是那么多,但希望证实我的怀疑。
非常感谢。
我使用的是 sql express 2008 r2 express 版。
是否可以独立于导致触发器触发的语句的事务在触发器内部进行写入?
我有触发器用于对我的数据库中的某些表进行简单审计。我有一张用于保存审计数据的表(查看此处了解详细信息)它工作正常,除非我不希望在事务回滚时审计数据消失。所以我想将审计数据写入审计表,独立于导致我的审计触发器触发的语句的事务。
假设我有一个Stuff包含一列的表,但City没有包含该列的索引。我填充表格。然后我决定创建一个索引:
CREATE INDEX [StuffOnCityIndex] ON [dbo].[Stuff](City ASC);
Run Code Online (Sandbox Code Playgroud)
并且数据库确认CREATE INDEX成功。
新创建的索引会立即包含表中的所有现有条目还是会在“后台”缓慢构建?换句话说,如果我认为创建索引会提高性能,那么我会在CREATE INDEX完成后立即看到这种改进吗?
我需要从 SQL Server 2008 数据库备份中手动检索几行。通常我会创建一个新数据库,将数据库备份恢复到新数据库,然后运行我的查询。但是,数据库很大,因此需要很长时间才能恢复。
有没有更简单的方法来获取旧数据?
假设我有四个表:
TABLE: players
COLUMNS: id, first_name, last_name
TABLE: passing_stats
COLUMNS: id, year, passing_yards (several other passing columns)
TABLE: rushing_stats
COLUMNS: id, year, rushing_yards (several other rushing columns)
TABLE: receiving_stats
COLUMNS: id, year, receiving_yards (several other receiving columns)
Run Code Online (Sandbox Code Playgroud)
假设 Michael Vick 的 id 为 100。我想得到他的全名和他每年的所有统计数据(传球、冲球和接球)。
我不想要任何重复,这意味着 2011 年的快速统计数据应该与 2011 年的传递统计数据出现在同一行。
编写此查询的最优雅方式是什么?谢谢。
我有一个系统将批量查询写入事务(以保持一致性),每个事务可以是 30-100 个查询集。这些是在多个表上完成的
同时使用内部选择对同一张表进行读取查询 - SELECT FROM table1... IN (SELECT from table 2...)
为了清楚起见 - 有一个写入事务的写入线程(每个事务写入所有表)和许多读取线程。
我收到死锁错误。1.死锁会不会跟IN选择有关?2. 如何让读取查询只提供已提交的数据,而不必等待当前事务提交(这意味着它可以返回先前提交的数据) 3. 死锁是否可能是由于事务花费太长时间而导致的完全的?
谢谢!
我正在尝试向数据库添加一列。查询已经运行了 25 分钟,它锁定了对该表的 Web 访问并破坏了我们的网站:
alter table MyTable
add MyNewColumn varchar(max) not null
default ('')
Run Code Online (Sandbox Code Playgroud)
该表在不同的列中包含二进制数据并且非常大。
使用红色的“取消执行查询”按钮取消会导致其他问题吗?我只是想弄清楚此时是否应该尝试取消查询,以及它运行了这么长时间后会发生什么。
我们产品的数据库包含一个审计跟踪表:
CREATE TABLE gn_AuditTable(
gn_ObjectId int NULL,
gn_Action smallint NULL,
gn_Time datetime NULL,
gn_UserId int NULL,
gn_Login varbinary(16) NULL,
gn_ExtraObjectId int NULL,
gn_ExtraInfo int NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我们用一个简单的insert语句向这个表添加行- 没有存储过程:
insert into gn_AuditTable (
gn_ObjectId,gn_Time,gn_UserId,gn_Login,gn_Action,gn_ExtraObjectId,gn_ExtraInfo
) values (
?,?,?,?,?,?,?
)
Run Code Online (Sandbox Code Playgroud)
将列的值作为参数传递给查询;也没有触发器。
问题是有时这个插入是超慢的——在某些情况下需要超过 30 秒和超时。
我们对同一产品进行了多次安装,并且我们在其中一些(但不是全部)中遇到了问题。
审计表可能非常大——多达几百万行。非常慢的插入发生在具有大表的数据库中(很自然) - 但是我们有其他具有相似行数的其他数据库运行良好,甚至遇到问题的数据库也会间歇性地出现问题,在大多数情况下插入相当快(亚秒)。
该表有 6 个非聚集、非唯一索引:
gn_Login;
gn_ObjectId;
gn_Action和gn_ExtraInfo;
gn_ExtraObjectId;
gn_Time;
gn_UserId.
拥有所有这些索引可能会导致问题,但同样,我们到处都有相同的索引,而问题只是在某处/有时。
我们在只有一个用户的测试数据库上至少有一次插入超时,因此问题似乎与整体负载无关,而是与插入和表本身有关。
我们曾经在 上有一个聚集索引gn_ObjectId,但为了解决这个问题,我们去掉了它。gn_ObjectId不是顺序的,所以我们认为它是聚集索引的一个糟糕选择,迫使 SQL Server 在插入时重新排序行。可能gn_Time- …
我不是数据库管理员——只是一个软件工程师。我想知道是否可以减少以下 T-SQL 查询:
SELECT
SUM(Price * Quantity) as 'Total',
SUM(Price * Quantity) * 0.95,
FROM
SomeTables;
Run Code Online (Sandbox Code Playgroud)
对于这样的事情:
SELECT
SUM(Price * Quantity) as 'Total',
'Total' * 0.95,
FROM
SomeTables;
Run Code Online (Sandbox Code Playgroud)
注意:这只是澄清/支持我的问题的示例。我当前的 SQL 查询比这更大更复杂。
sql-server-2008 ×10
sql-server ×5
performance ×2
aggregate ×1
deadlock ×1
index ×1
insert ×1
mysql ×1
postgresql ×1
query ×1
restore ×1
syntax ×1
transaction ×1
trigger ×1