标签: sql-server

ETL:从 200 个表中提取 - SSIS 数据流或自定义 T-SQL?

根据我的分析,我们数据仓库的完整维度模型需要从 200 多个源表中提取。其中一些表将作为增量加载的一部分提取,而其他表将作为完整加载。

需要注意的是,我们有大约 225 个具有相同架构的源数据库。

据我所知,在 SSIS 中构建一个带有 OLE DB 源和 OLE DB 目标的简单数据流需要在设计时确定列和数据类型。这意味着我最终会得到 200 多个数据流,仅用于提取。

从可维护性的角度来看,这对我来说是一个大问题。如果我需要对提取代码进行某种彻底的更改,我将不得不修改 200 个不同的数据流。

另一种选择是,我编写了一个小脚本,用于读取我想从一组元数据表中提取的源数据库、表名和列。代码在多个循环中运行,并使用动态 SQL 通过链接服务器和 OPENQUERY 从源表中提取。

根据我的测试,这仍然不如使用带有 OLEDB 源和目标的 SSIS 数据流快。所以我想知道我有什么样的选择。到目前为止的想法包括:

  1. 使用EZAPI以编程方式生成具有简单数据流的 SSIS 包。要提取的表和列将来自前面提到的相同元数据表。
  2. 购买第 3 方软件(动态数据流组件)

解决这个问题的最佳方法是什么?当谈到 .NET 编程时,我是一个初学者,所以仅仅学习基础知识所需的时间也是一个问题。

sql-server-2005 data-warehouse sql-server etl ssis

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

如何检查空或空的表值参数?

我有一个存储过程 (SS2k8),其中包含一些有时为 null 或为空的表值参数。我已经看到这个StackOverflow 帖子说空/空 TVP 应该简单地从调用参数列表中省略。我的问题是我无法弄清楚如何在存储过程中检查空或空值,因为“IF (@tvp IS NULL)”在过程创建时失败,并显示消息“必须声明标量变量“@tvp””。我是否必须在 TVP 上执行 SELECT COUNT(*) 并检查零?

代码摘录:

CREATE PROCEDURE [foo] (@tvp [TvpType] READONLY) AS

IF (@tvp IS NOT NULL) -- doesn't work
BEGIN
  -- lots of expensive processing
END
ELSE
BEGIN
  -- a little bit of cheap processing
END
...
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 null sql-server t-sql table-valued-parameters

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

我正在使用 SQL Server 代理来安排非数据库任务 - 这是一个坏主意吗?

由于我是一名 DBA(并且在许多情况下,事实上的系统管理员),SQL Server 安装在我必须定期使用的几乎每台服务器上。我最近意识到我在几乎所有情况下都使用 SQL 代理作为作业调度程序,而不是本机 Windows 任务调度程序。

从我的角度来看,SQL Agent 比原生的 Windows 任务计划程序有很多优势:

  • 远程(从我的工作站)启动/停止/监控任务
  • 共享计划(而不是每个任务单独执行)
  • 多个步骤和控制流程
  • 不同类型的任务
  • 失败/完成警报
  • 可以配置为不同的用户
  • (适度)描述性错误消息,而不仅仅是错误代码

但是,我无法逃避这是一种不好的做法 - SQL 代理应该只保留用于与数据库相关的任务,并且我应该让操作系统级别的任务在 Windows 任务计划程序中运行,尽管我不喜欢它的可用性。

这样依赖SQL Agent可以吗?如果没有,我是否应该考虑使用第三方 Windows 任务调度程序来获得我正在寻找的某些功能?

sql-server sql-server-agent windows-server scheduled-tasks

13
推荐指数
2
解决办法
3911
查看次数

在 SQL Server 中如何使用 ROW_NUMBER 进行分页?

我有一张Employee有 100 万条记录的表。我有以下 SQL 用于在 Web 应用程序中分页数据。它工作正常。但是,我认为的一个问题是 - 派生表tblEmployee选择表中的所有记录Employee(以创建 MyRowNumber值)。

我认为,这会导致选择Employee表中的所有记录。

真的那么有效吗?或者 SQL Server 是否也被优化为只从原始Employee表中选择 5 条记录?

DECLARE @Index INT;
DECLARE @PageSize INT;

SET @Index = 3;
SET @PageSize = 5;

SELECT *  FROM
  (SELECT  ROW_NUMBER() OVER (ORDER BY EmpID asc) as MyRowNumber,*
  FROM Employee) tblEmployee
WHERE MyRowNumber BETWEEN ( ((@Index - 1) * @PageSize )+ 1) AND @Index*@PageSize 
Run Code Online (Sandbox Code Playgroud)

performance sql-server query-performance

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

有没有办法确定 SQL Server 查询是在内存中运行还是在磁盘中运行?

我今天在一个应用程序中遇到了一组存储过程,它们在长时间运行的进程中被重复调用。在每个过程中,我发现了多个不同的 select 语句,其中一些在循环中;毫不奇怪,当前使用的这些例程需要几分钟才能运行,而直觉预计它们会在几秒钟内完成。

很明显,在编写这些程序时没有考虑性能,有多个实例只是“不是一个好主意”。

导入数据时处理每一行每行需要 300 毫秒,因此相对较小的导入需要几分钟来处理。

然而,程序中涉及的表格大部分都非常小。我在想,如果所有这些表都完全驻留在内存中,那么通过重写其中的任何一个,也许不会获得那么多。

我试图确定......对于这个明显效率低下的代码,它有多大的实际影响?值得修复吗?

所以问题是:
- 有没有办法确定哪些表完全固定在内存中?
- 有没有办法打开跟踪以监视嵌套存储过程以找到特别昂贵的部分?

注意:这是在 SQL Server 2008 R2 上

sql-server-2008 sql-server

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

为什么非数字是 LIKE [0-9]?

我的服务器的默认排序规则是 Latin1_General_CI_AS,由以下查询确定:

SELECT SERVERPROPERTY('Collation') AS Collation;
Run Code Online (Sandbox Code Playgroud)

我惊讶地发现,通过这种排序规则,我可以使用 predicate 匹配字符串中的非数字字符LIKE '[0-9]'

为什么在默认排序规则中会发生这种情况?我想不出这会有用的情况。我知道我可以使用二进制排序规则来解决该行为,但这似乎是实现默认排序规则的奇怪方法。

过滤数字产生非数字字符

我可以通过创建一个包含所有可能的单字节字符值的列并使用数字匹配谓词过滤值来演示该行为。

以下语句创建一个包含 256 行的临时表,当前代码页中的每个代码点对应一个行:

WITH P0(_) AS (SELECT 0 UNION ALL SELECT 0),
P1(_) AS (SELECT 0 FROM P0 AS L CROSS JOIN P0 AS R),
P2(_) AS (SELECT 0 FROM P1 AS L CROSS JOIN P1 AS R),
P3(_) AS (SELECT 0 FROM P2 AS L CROSS JOIN P2 AS R),
Tally(Number) AS (
  SELECT -1 + ROW_NUMBER() OVER (ORDER BY (SELECT 0))
  FROM P3 …
Run Code Online (Sandbox Code Playgroud)

sql-server collation

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

更新统计信息时抽样如何工作?

我有几个大桌子。我想通过每周维护计划确保他们的统计数据是最新的。

但是,这样做需要花费太多时间。

如果我指定

WITH SAMPLE 50 PERCENT
Run Code Online (Sandbox Code Playgroud)

SQL Server 然后采样:

  1. 前 50% 的页面
  2. 每隔一页
  3. 或其他一些策略?

BOL对此并不明确。

sql-server statistics

13
推荐指数
1
解决办法
2008
查看次数

如何在 SQL Server 中查询现有数据库快照?

我正在尝试创建一个 t-sql 查询,它可以确定给定的数据库是否具有从它创建的任何数据库快照。

例如,如果我要创建这样的快照:

CREATE DATABASE [DatabaseA_Snapshot] ON 
(NAME=DatabaseA, FileName='<whatever>') 
AS SNAPSHOT OF [DatabaseA]
Run Code Online (Sandbox Code Playgroud)

有没有办法稍后再次查询该快照的存在?我可以看到它出现在 sys.databases 中,但是我找不到任何信息可以帮助我确定它是从 DatabaseA 创建的数据库快照。

SQL Server Management Studio 的对象资源管理器将它放在“数据库快照”文件夹下,因此显然可以通过某种方式将它们与常规数据库区分开来。

sql-server snapshot

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

串联物理操作:是否保证执行顺序?

在标准 SQL 中,union all不保证a 的结果按任何顺序排列。所以,像这样:

select 'A' as c union all select 'B'
Run Code Online (Sandbox Code Playgroud)

可以以任何顺序返回两行(尽管实际上在我知道的任何数据库上,'A' 都会出现在 'B' 之前)。

在 SQL Server 中,这变成了使用“串联”物理操作的执行计划。

我可以很容易地想象连接操作会扫描它的输入,返回任何有可用记录的输入。但是,我在网络上发现了以下声明(此处):

Query Processor 将按照操作符出现在计划中的顺序执行这个计划,第一个是最上面的,最后一个是最后一个。

问题:这在实践中是真的吗?这能保证是真的吗?

我还没有在 Microsoft 文档中找到任何参考资料,说明按顺序扫描输入,从第一个到最后一个。另一方面,每当我尝试运行它时,结果表明输入确实是按顺序处理的。

有没有办法让引擎一次处理多个输入?我的测试(使用比常量更复杂的表达式)是在支持并行的 8 核机器上进行的,并且大多数查询确实利用了并行性。

sql-server execution-plan database-internals union

13
推荐指数
2
解决办法
1585
查看次数

如何从 Azure SQL 数据库中删除错误的执行计划?

DBCC FREEPROCCACHE在 Azure SQL DB 中不起作用。我还能如何强制计划以一种不会伤害生产系统的方式将自己踢出缓存(即我不能随意更改表)?这是专门为 Entity Framework 创建的 SQL,所以这些不是自我管理的存储过程 - 它是有效的动态 SQL。

(来源是糟糕的索引 -> 糟糕的统计数据等。这一切都已解决,但糟糕的计划不会消失。)

更新: 当他首先到达那里时,我选择了@mrdenny 的解决方案。然而,我成功地使用@Aaron Bertrand 的脚本来执行这项工作。感谢大家的帮助!!

sql-server execution-plan azure-sql-database

13
推荐指数
3
解决办法
8674
查看次数