我们正在将我们的数据库迁移到新模式,但想要验证数据是否已正确移动。
如果模式相同,传统的数据比较工具可以比较两个数据库的差异。在我们的例子中,表设计发生了变化,但旧模式中的所有数据都在新模式中,只是稍微移动了一下,我需要确保它是正确的。我们有数千万行,因此手动检查不是一种选择。
是否有任何工具可以帮助进行此类比较?
如果没有,是否有任何库/框架可以帮助启动自定义解决方案的开发?
如有必要,我很乐意使用特定于数据库的解决方案,在这种情况下用于 SQL Server 2008。
我的解决方案:我通过VIEW在旧数据库上创建一个与新数据库表具有相同字段的每个表来比较两个数据集。
然后,我使用此处描述的技术比较数据:在 SQL Server 中比较两个表的最短、最快和最简单的方法:UNION!
我在这次迁移中很幸运,因为整体表结构类似于旧数据库,字段从一个表移动到另一个表,删除或添加。在删除和添加的情况下,没有什么可比较的,对于已移动或聚合的字段,我会在视图中进行计算以提供正确的信息进行比较。
该UNION比较显示我只能用不同的行,所以只要数据是正确的,我得到一个空的结果集。
在 SQL Server 2005 上,如果所有数据库都处于完整模式(每小时事务日志备份),是否可以确定重建数据库的所有索引是否可以增加数据库的日志文件?它可以增长多少?
如果没有直接的答案,那么任何方向都将不胜感激。
提前致谢。
v$视图与其dba_等价物之间的一般区别是什么?举个例子来说,v$tablespace和dba_tablespaces。
为了诊断一些性能问题,我想更好地了解与系统性能相比调用某些过程的次数。有没有办法获得在特定时间跨度内每个过程被调用的次数?
在阿拉伯语中,我们有这样的字符?(alef) 和 ? (alef 与 hamza)。
用户可以互换地编写它们,我们希望可以互换地搜索它们。SQL Server 将它们视为单独的字符。如何让 SQL 将它们视为相同的字符?
我想更换任何?(alef 与 hamza)与 ? (alef) 在插入时,但我们有很多阿拉伯语的替代品,不仅仅是 ? (alef) 和 ? (alef 与 hamza)。
我试过了Arabic_CI_AS,Arabic_CI_AI但这并不能解决问题。
这是一个重新生成问题的脚本:
CREATE TABLE [dbo].[TestTable] (
[ArabicChars] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
(
[ArabicChars] ASC
)
) ON [PRIMARY];
INSERT INTO TestTable values (N'????');
INSERT INTO TestTable values (N'????');
SELECT *
FROM TestTable
WHERE ArabicChars like N'?%';
Run Code Online (Sandbox Code Playgroud)
结果是:
ArabicChars
????
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
所需的结果将是我们插入的两行。
我在一个表中插入了两条记录。
create table num(id int)
insert into num values(0023)
insert into num values(23)
select * from num
Run Code Online (Sandbox Code Playgroud)
当我查询它们时,它们都显示为23. 这意味着 SQL Server 忽略前导 0。这背后的机制是什么?我如何让 SQL Server 在我插入它们时返回值(即0023和23)?
我之前使用过完全外部联接来获得我想要的结果,但也许我不完全理解这个概念,因为我无法完成应该是简单的联接。
我有 2 个表(我称之为 t1 和 t2),每个表有 2 个字段:
t1
Policy_Number Premium
101 15
102 7
103 10
108 25
111 3
Run Code Online (Sandbox Code Playgroud)
t2
Policy_Number Loss
101 5
103 9
107 20
Run Code Online (Sandbox Code Playgroud)
我想要做的是从两个表以及 Policy_Number 中获取 Premium 和 Sum of Losses 的总和。我正在使用的代码是:
select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, t1.policynumber
from t1 full outer join t2 on t1.policynumber = t2.policynumber
group by t1.policynumber
Run Code Online (Sandbox Code Playgroud)
上面的代码将返回正确的总和,但它会将在“NULL”policy_number 下没有 policy_number 匹配的所有记录分组。
我希望我的结果看起来像这样
Policy_Number Prem_Sum Loss_Sum
107 NULL 20
111 3 NULL
101 15 5
Run Code Online (Sandbox Code Playgroud)
等等.....
我不想要显示 NULL policy_number …
一台装有 Oracle 8i 的旧电脑已经死了。我们有数据库的每日备份(C:\oradata)。我们无法在任何地方安装这个旧的 Oracle 版本,因为我们没有它的安装 CD。
我们可以使用例如 Oracle Express 读取此数据库吗?如果是,如何?
只是想知道统计数据是否保存在数据库中而不是内存中?如果我将数据库从生产服务器备份/恢复到开发服务器,它是否会保留相同的统计信息,以便在开发服务器上执行计划不会有太大不同?
我在 SQL Server 2008 中定义了以下索引视图(您可以从 gist下载工作架构以进行测试):
CREATE VIEW dbo.balances
WITH SCHEMABINDING
AS
SELECT
user_id
, currency_id
, SUM(transaction_amount) AS balance_amount
, COUNT_BIG(*) AS transaction_count
FROM dbo.transactions
GROUP BY
user_id
, currency_id
;
GO
CREATE UNIQUE CLUSTERED INDEX UQ_balances_user_id_currency_id
ON dbo.balances (
user_id
, currency_id
);
GO
Run Code Online (Sandbox Code Playgroud)
user_id、currency_id和transaction_amount都定义为 中的NOT NULL列dbo.transactions。但是,当我查看 Management Studio 的对象资源管理器中的视图定义时,它在视图中将balance_amount和都标记transaction_count为NULL可列。
我查看了几个讨论,这是其中最相关的一个,建议对函数进行一些改组可能有助于 SQL Server 识别视图列始终为NOT NULL. 但是,在我的情况下不可能进行这种改组,因为在索引视图中不允许 …
sql-server ×6
oracle ×2
view ×2
collation ×1
constraint ×1
index ×1
join ×1
maintenance ×1
metadata ×1
monitoring ×1
null ×1
oracle-8i ×1
performance ×1
statistics ×1
tools ×1
upgrade ×1