小编sri*_*amn的帖子

在 Management Studio 中创建表组子文件夹

当我在浏览master数据库时,SSMS我注意到在Tables文件夹下还有一个名为的文件夹Systems Tables,里面有一堆表格。我们是否有可能Systems Tables在我们的数据库中创建一个类似的结构?

我希望将表和存储过程组织到项目特定的文件夹中。在新设置下 - 当我指的是我的表对象时,我将不得不使用以下语法(我在这里猜测):

[dbName].[projectName].[dbo].[tableName] 
Run Code Online (Sandbox Code Playgroud)

此外,除了清理混乱之外,是否有人预见到由于这种重组而导致的任何性能改进/降级?我用Microsoft SQL Server 2008 R2.

database-design sql-server ssms

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

使用 JOIN 有效地更新表

我有一张表,其中包含家庭的详细信息,而另一个表则包含与这些家庭相关的所有人员的详细信息。对于家庭表,我使用其中的两列定义了一个主键 - [tempId,n]。对于 person 表,我有一个使用其 3 列定义的主键[tempId,n,sporder]

使用主键上的聚集索引所指示的排序,我为每个家庭[HHID]和每个人的[PERID]记录生成了一个唯一 ID (下面的代码片段用于生成 PERID]:

 ALTER TABLE dbo.persons
 ADD PERID INT IDENTITY
 CONSTRAINT [UQ dbo.persons HHID] UNIQUE;
Run Code Online (Sandbox Code Playgroud)

现在,我的下一步是将每个人与相应的家庭相关联,即;将 a 映射[PERID]到 a [HHID]。两个表之间的人行横道基于两列[tempId,n]。为此,我有以下内部连接语句。

UPDATE t1
  SET t1.HHID = t2.HHID
  FROM dbo.persons AS t1
  INNER JOIN dbo.households AS t2
  ON t1.tempId = t2.tempId AND t1.n = t2.n;
Run Code Online (Sandbox Code Playgroud)

我总共有1928783个户籍记录和5239842个人记录。执行时间目前非常高。

现在,我的问题:

  1. 是否可以进一步优化此查询?更一般地说,优化连接查询的拇指规则是什么?
  2. 是否有另一个查询构造可以以更好的执行时间实现我想要的结果?

我已将SQL Server 2008 为整个脚本生成的执行计划上传到 SQLPerformance.com

join sql-server optimization execution-plan

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

按字段分割的频率分布

一些背景: 我有一个样本人口数据文件。数据文件中的每条记录都有一个频率权重(FIELD NAME: wgt),指示需要复制多少次记录才能获得真正的总体。数据在 Microsoft SQL 2008 R2 中设置。生成权重的频率分布以查看某种特定类型的记录是否以任何方式过度表示通常是一种很好的做法 - 从而帮助识别趋势/异常值。这个任务在 SQL 中很简单:

SELECT wgt, COUNT(*) FROM tablename 
GROUP BY wgt
Run Code Online (Sandbox Code Playgroud)

挑战: 我想根据其他值进一步分离这些频率。假设不同家庭规模的权重频率分布。实现此目的的一种方法是在上述语句中使用不同的 where 条件:

SELECT wgt, COUNT(*) FROM tablename 
WHERE household_size=x --x being the desired segment
GROUP BY wgt
Run Code Online (Sandbox Code Playgroud)

但是有没有办法用所有不同的段创建一个表?像这样的东西:

WGT |   SIZE1       SIZE2       SIZE3       SIZE4 
--------------------------------------------------
1   |    2,034      1,025       502         234 
2   |    215        253         142         23 
3   |    31         25          21          34 
4   |    7          1           3           7 
5   |    5          NULL        2           5 
6 …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures statistics view

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

基于权重字段扩展数据集

我有一个表格,其中包含未展开形式的记录。每条记录都有一个相关的整数权重,它基本上告诉我们应该复制多少次记录才能获得真实的人口。

说,我的表中有 3 条记录。sampnid 是唯一记录,weight是频率权重。未扩展的数据集如下所示:

sampn   weight  attrib1 attrib2 attrib3
    1       2       23      32      65
    2       1       32      56      75
    3       3       54      25      87
Run Code Online (Sandbox Code Playgroud)

展开后,数据集将如下所示(注意 - 我删除了该weight字段 - 但这不是必需的):

sampn   attrib1 attrib2 attrib3
    1       23      32      65
    1       23      32      65
    2       32      56      75
    3       54      25      87
    3       54      25      87
    3       54      25      87
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用游标来做到这一点,但执行起来需要很长时间。有没有一种聪明的方法可以真正快速地做到这一点?任何预定义的 T-SQL 存储过程可以实现这一点?


全部更新,谢谢解答!真的很棒的学习体验!对我的数据集执行扩展操作。保罗的辅助数字表的执行时间最好。

sql-server sql-server-2008-r2

5
推荐指数
3
解决办法
237
查看次数