目前我正在设计一个供我们公司使用的数据库.我们正在使用SQL Server 2008.该数据库将保存从多个客户收集的数据.该数据库的目标是获取多个客户的总基准数.
最近,我特别担心一张桌子会变得非常大.每个客户拥有大约20.000.000行数据,数据库中很快就会有30个客户(如果不是更多).将在此表上进行大量查询.我已经注意到性能问题和暂时被锁定的用户.
我的问题是,我们将来能够处理这个表,还是将这个表拆分成每个客户的小表更好?
更新:自我们第一次创建表格以来,现在已经有半年了.按照下面的建议,我创建了一些巨大的表格.从那时起,我一直在试验索引,并决定在前两列(医院代码和部门代码)上的聚集索引,如果我们有企业版,我们将对表进行分区.直到最近,这种设置工作正常,正如Galwegian预测的那样,性能问题正在兴起.重建索引需要很长时间,用户互相锁定,查询经常花费的时间超过应有的时间,对于大多数查询,首先将相关部分数据复制到临时表中,在临时表上创建索引并运行查询.这不是应该的样子.因此,我们正在考虑购买企业版以使用分区表.如果购买无法完成,我计划使用变通方法在Standard Edition中完成分区.
我经常读到VIEW的一个目的是安全性:允许一些用户访问底层表,而其他用户只能访问派生视图.考虑到这一点,我设计了几个视图,为外部用户提供受限数据集.
一切都很好,但实际上这不起作用.在我授予SELECT
视图权限后,除非我同时授予SELECT
所有基础对象,否则用户无法访问它.存储过程的相同故事.最终结果是非功能性的,因为我最终仍然允许对错误用户访问敏感数据,并且令人讨厌,因为很容易忘记一个对象并且用户回过头来抱怨该视图"不工作".
有没有办法SELECT
在视图或存储过程上授予权限,而不必公开底层对象?
我们有一个存储过程,运行良好,直到10分钟前,然后它只是挂起后调用它.
观察:
还有什么可以继续?
UPDATE: I'm guessing it had to do with parameter sniffing. I used Adam Machanic's routine to find out which subquery was hanging. I found things wrong with the query plan thanks to the hint by Martin Smith. I learned about EXEC ... WITH RECOMPILE
, OPTION(RECOMPILE)
for subqueries within the SP, and OPTION (OPTIMIZE FOR (@parameter = 1))
in order to attack parameter sniffing. I still don't know …
要使用查询中的值填充一个变量,我可以编写如下:
SET @TargetID = (SELECT TOP 1 ID FROM @bigDataSet ORDER BY date DESC)
Run Code Online (Sandbox Code Playgroud)
要从此查询中填充多个变量,例如.就像是:
SET (@TargetID, @TargetName) = ....(SELECT TOP 1 ID, [Name] FROM @bigDataSet ORDER BY date DESC)
Run Code Online (Sandbox Code Playgroud)
我能写什么?
我的两个问题是:
详细说来,我有一个包含公司数据的几个非常大(在100-1000万行之间)的数据库.通常,在这样的表中存在大约20-40个公司的数据,每个公司都是由"CompanyIdentifier"(INT)标记的他们自己的"块".此外,每家公司都有大约20个部门,每个部门都有自己的"子块",标有"DepartmentIdentifier"(INT).
经常会发生从表中添加或删除整个"块"或"子块".我的第一个想法是在这些块上使用表分区,但由于我使用的是SQL Server 2008标准版,因此我无权使用它.尽管如此,我所拥有的大多数查询都是在"块"或"子块"上执行而不是在整个表格上执行.
我一直在努力为以下功能优化这些表:
对于1)和2)我没有遇到很多问题.我在关键字段上创建了几个索引(也包含有用的CompanyIdentifier和DepartmentIdentifier),查询运行正常.
但对于3)我一直在努力寻找一个好的解决方案.我的第一个策略是始终禁用索引,批量插入大块并重建索引.这在开始时非常快,但现在数据库中有很多公司,每次重建索引需要很长时间.
目前我的策略已经改为只是在插入时保持索引,因为现在这似乎更快.但我想进一步优化插入速度.
我似乎注意到通过添加在CompanyIdentifier + DepartmentIdentifier上定义的聚簇索引,将新的"块"加载到表中的速度更快.在我放弃这个策略以支持在IDENTITY列上添加聚簇索引之前,有几篇文章向我指出聚簇索引包含在所有其他索引中,因此聚簇索引应该尽可能小.但现在我正在考虑恢复这个旧策略来加速插入.我的问题,这是明智的,还是会在其他领域遇到性能打击?这真的会加速我的插入还是仅仅是我的想象力?
我也不确定在我的情况下是否确实需要IDENTITY列.我希望能够与其他表建立外键关系,但我是否也可以使用类似于CompanyIdentifier + DepartmentIdentifier + [uniquifier]方案的东西?或者它必须是一个表格,分散的IDENTITY数字?
非常感谢任何建议或解释.
database sql-server identity-column clustered-index sql-server-2008
我即将为客户开始一个PostgreSQL项目.他们希望开发一个包含许多复杂连接的庞大专业数据库,因此经过考虑后我选择使用PostgreSQL而不是MySQL.
一个重要的考虑因素是如何使用脚本有效地与数据库连接.目前,客户端使用大约一百万个脚本来根据需要导入和重塑数据,但不使用数据库(除非您将CSV文件视为数据库).随着带有查询和视图的数据库结构的到来,对脚本的需求将会减少,但仍需要经常进行导入,以及导出/报告.对我来说,理想的最终结果是一系列标准化脚本,最好是带有Web界面,这样客户端只需单击按钮即可快速无错地执行常规任务.
我的问题是哪种脚本方法最合适.可能任何使用Postgres或ODBC插件的脚本语言就足够了,但我希望从长远来看做出明智的选择.有没有人有这方面的经验?Postgres是否提供内部脚本语言,为此构建GUI是否容易?是否有可用于导入/导出的标准化工具,它们是否可以自定义以允许将任务标准化为单击级别?PHP或perl怎么样?
提前致谢.任何提示,资源,困惑的外表或可怜的手势都将得到真正的赞赏;-)
如何在jQuery中为表列的打开/关闭设置动画?
我目前有这段代码:
jQuery(function($){
$(".togglebutton").click(function(e){
if (cost_visible) {
$(".numbers").animate({width: 80}, 1500);
$(".costs").animate({width: 0}, 1500);
} else {
$(".numbers").animate({width: 0}, 1500);
$(".costs").animate({width: 60}, 1500);
}
});
});
Run Code Online (Sandbox Code Playgroud)
我的HTML包含标准TABLE/TR/TH/TD标签,TH和TD标签带有用于识别必须打开或关闭的类名的类名.
问题似乎是在jQuery触及表之后,受影响的单元突然感觉需要堆叠在彼此之上而不是整齐地保持连续.
我假设这与jQuery只能动画"块"元素有关,而不是显示"像表格"的元素.那么我可以用块元素制作一个表格吗?还是有另一种方法来动画表格式元素?我已经找到了这个建议的解决方案,但是将所有的表元素包装到DIV中只是为了动画似乎很麻烦......
我有一个存储过程,它将从特定查询中出现的数百万行批量插入到SQL数据库中.它有一个参数选择批次; 当省略此参数时,它将收集批处理列表并递归调用自身,以便迭代批处理.在(伪)代码中,它看起来像这样:
CREATE PROCEDURE spProcedure AS BEGIN
IF @code = 0 BEGIN
...
WHILE @@Fetch_Status=0 BEGIN
EXEC spProcedure @code
FETCH NEXT ... INTO @code
END
END
ELSE BEGIN
-- Disable indexes
...
INSERT INTO table
SELECT (...)
-- Enable indexes
...
Run Code Online (Sandbox Code Playgroud)
现在,无论出于何种原因,此过程都很慢:它无法获得锁定,其使用的索引之一是错误定义或禁用的.在这种情况下,我希望能够终止该过程,截断并重新创建结果表,然后再试一次.但是,当我尝试杀死该过程时,该过程经常渗入KILLED/ROLLBACK状态,似乎没有返回.从谷歌我学会了做sp_lock
,找到spid,然后杀了它KILL <spid>
.但当我试图杀死它时,它会告诉我
SPID 75:正在进行事务回滚.预计回滚完成率:0%.预计剩余时间:554秒.
我找到了一个论坛消息,暗示在另一个spid开始回滚之前应该杀死另一个spid.但这对我来说也不起作用,加上我不明白,为什么会出现这种情况......是不是因为我递归调用自己的存储过程?(但它应该有相同的spid,对吧?)
在任何情况下,我的过程只是坐在那里,死了,没有响应杀戮,并锁定桌子.这非常令人沮丧,因为我想继续开发我的查询,而不是在假装完成假定的回滚时等待我的服务器停滞不前的时间.
有什么方法可以告诉服务器不要为我的查询存储任何回滚信息?或者不允许任何其他查询干扰回滚,以便它不会花这么长时间?或者如何以更好的方式重写我的查询,或者如何在不重新启动服务器的情况下成功终止进程?
我有以下表格:
ID Data
1 A
2 A
2 B
3 A
3 B
4 C
5 D
6 A
6 B
Run Code Online (Sandbox Code Playgroud)
换句话说,我每个ID都有一组数据.您会注意到数据组(A,B)多次出现.我想要一个可以识别不同数据组并对其进行编号的查询,例如:
DataID Data
101 A
102 A
102 B
103 C
104 D
Run Code Online (Sandbox Code Playgroud)
因此,DataID 102将类似于数据(A,B),DataID 103将类似于数据(C)等.为了能够以这种形式重写我的原始表:
ID DataID
1 101
2 102
3 102
4 103
5 104
6 102
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
PS.用于生成第一个表的代码:
CREATE TABLE #t1 (id INT, data VARCHAR(10))
INSERT INTO #t1
SELECT 1, 'A'
UNION ALL SELECT 2, 'A'
UNION ALL SELECT 2, 'B'
UNION ALL SELECT 3, …
Run Code Online (Sandbox Code Playgroud) sql ×5
t-sql ×5
sql-server ×4
database ×3
html-table ×1
import ×1
jquery ×1
locking ×1
postgresql ×1
scripting ×1
security ×1