当我在浏览master数据库时,SSMS我注意到在Tables文件夹下还有一个名为的文件夹Systems Tables,里面有一堆表格。我们是否有可能Systems Tables在我们的数据库中创建一个类似的结构?
我希望将表和存储过程组织到项目特定的文件夹中。在新设置下 - 当我指的是我的表对象时,我将不得不使用以下语法(我在这里猜测):
[dbName].[projectName].[dbo].[tableName]
Run Code Online (Sandbox Code Playgroud)
此外,除了清理混乱之外,是否有人预见到由于这种重组而导致的任何性能改进/降级?我用Microsoft SQL Server 2008 R2.
我有一张表,其中包含家庭的详细信息,而另一个表则包含与这些家庭相关的所有人员的详细信息。对于家庭表,我使用其中的两列定义了一个主键 - [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个人记录。执行时间目前非常高。
现在,我的问题:
我已将SQL Server 2008 为整个脚本生成的执行计划上传到 SQLPerformance.com
一些背景:
我有一个样本人口数据文件。数据文件中的每条记录都有一个频率权重(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) 我有一个表格,其中包含未展开形式的记录。每条记录都有一个相关的整数权重,它基本上告诉我们应该复制多少次记录才能获得真实的人口。
说,我的表中有 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 存储过程可以实现这一点?
全部更新,谢谢解答!真的很棒的学习体验!对我的数据集执行扩展操作。保罗的辅助数字表的执行时间最好。