我有一个大型SQL Server数据库,其中包含大约4500万条记录的表.我正在归档此表,并且需要删除两年多以前的所有条目.我插入到我的存档表工作正常,但我在删除时遇到效率问题.
我的问题在于当前表中的索引.我想在1000个记录块中删除(和存档插入).为此,我需要确定满足要求的"最高"1000条记录(大于两年).行上的DateTime标记是聚簇索引,因此这对于抓取行非常有用.但是SQL 2000不允许DELETE TOP 1000 ....所以我需要做类似的事情:
DELETE FROM <table> WHERE [UniqueID] IN
(SELECT TOP 1000 [UniqueID] FROM <table> WHERE [DateTime] < @TwoYearsAgo)
Run Code Online (Sandbox Code Playgroud)
如果将UniqueID编入索引,这将非常有用.由于它不是,这需要很长时间(它扫描表中要删除的1000条记录中的每一条).表上没有唯一标识记录的其他索引.我被告知在UniqueID上计算索引的成本太高,因为这是一个实时数据库.任何人都可以指出一种优化此查询的方法吗?
我有一个压缩的字符串值,我从导入文件中提取.我需要将其格式化为包裹编号,格式如下:##-##-##-###-###.因此,字符串"410151000640"应变为"41-01-51-000-640".我可以使用以下代码执行此操作:
String.Format("{0:##-##-##-###-###}", Convert.ToInt64("410151000640"));
Run Code Online (Sandbox Code Playgroud)
但是,字符串可能不是所有数字; 它可能有一两个字母,因此转换为int将失败.有没有办法在字符串上执行此操作,以便每个字符(无论是数字还是字母)都能正确地符合格式?
我正在尝试将记录从数据库中的表归档到归档数据库中的相同表.我需要能够为日期大于三年的所有记录执行插入操作,然后删除这些行.但是,这个表有数百万个实时记录,所以我希望一次以大约100到1000个块的循环运行它.到目前为止,我的存储过程执行整个insert语句,然后执行delete语句(在事务中),其中与insert语句具有基本相同的WHERE子句.我的WHILE循环正在查找表中最早的日期,以确定循环何时完成.其中一些似乎效率很低.有没有一种方法可以在记录块上进行插入和删除,而无需在同一循环执行中查找它们两次?有没有更好的方法来确定WHILE语句何时完成?运行MS SQL Server 2000.
这是我目前的程序(ISAdminDB是主数据库,ISArchive是存档数据库):
WHILE ( (SELECT MIN( [MyTable].[DateTime]) FROM [ISAdminDB].[dbo].[MyTable]) < DATEADD(d, -(3 * 365), GetDate()))
BEGIN
INSERT INTO [ISArchive].[dbo].[MyTable]
(<Fields>)
SELECT TOP 1000 (<Fields>)
FROM [ISAdminDB].[dbo].[MyTable]
WHERE
[MyTable].[DateTime] < DATEADD(d, -(3 * 365), GetDate())
AND UniqueID in (SELECT TOP 1000 UniqueID FROM [ISAdminDB].[dbo].[MyTable] ORDER BY [MyTable].[DateTime] ASC )
BEGIN TRAN
DELETE FROM [ISAdminDB].[dbo].[MyTable]
WHERE [MyTable].[DateTime] < DATEADD(d, -(3 * 365), GetDate())
AND (UniqueID in (SELECT TOP 1000 UniqueID FROM [ISAdminDB].[dbo].[MyTable] ORDER BY [MyTable].[DateTime] ASC))
COMMIT
END
Run Code Online (Sandbox Code Playgroud) 我有一个包含两个div的ASP.NET页面.两者都有搜索字段和每个搜索按钮.当我第一次来到这个页面时,Div A有"SearchDiv"类,而Div B有"SearchDivDisabled".这些类会更改外观,以便用户知道他们当前启用的搜索类型.
单击Div B时,JavaScript会将其类更改为"SearchDiv",并将Div A更改为"SearchDivDisabled".这一切都像一个魅力.我遇到的问题是当用户更改为Div B时,单击Div B的搜索按钮(显然会重定向到结果页面),然后使用浏览器的后退按钮.当他们返回搜索页面时,Div A再次启用,Div B被禁用,即使他们上次使用Div B.在搜索按钮事件处理程序中,我在重定向之前设置了Div的class属性,希望这会更新服务器上的页面,所以当用户返回时,它们的最后启用的Div仍然会被启用(无论在第一次访问该页面时启用了哪一个).
我相信这涉及到ViewState,但我不确定为什么没有保存class属性,因此当用户返回到页面时它将被恢复.有没有我在这里缺少的东西,或者一些简单的方法来保证我想要的行为?谢谢!
编辑:这是按钮事件处理程序代码:
protected void RedirectToResults(int searchEnum, string resultPage)
{
ShowContainer(searchEnum);
Response.Redirect(resultPage + this.webParams.getAllVariablesString(null));
}
protected void ShowContainer(int searchContainerToShow)
{
if (searchContainerToShow < 0 || searchContainerToShow > SearchContainers.Count || SearchContainers.Count == 0)
return;
//disable all search panels
foreach (SearchContainer container in SearchContainers.Values)
{
container.searchDiv.Attributes.Add("class", "SearchDivDisabled");
}
//enable selected panel
SearchContainers[searchContainerToShow].searchDiv.Attributes.Add("class", "SearchDiv");
}
Run Code Online (Sandbox Code Playgroud)
RedirectToResults()从实际的按钮事件处理程序调用,枚举代表所选的搜索面板和结果页面URL.SearchContainers是一个将整数映射到搜索Div的字典.重要的代码是最后一行,我用"主动"搜索类更新所选搜索容器,而不是禁用的(我分配给其他div)
补充更新:过去几天我一直在与这个问题作斗争.我有点能够使用以下代码(在page_load中):
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); …Run Code Online (Sandbox Code Playgroud) 我有一个在sql server 2008上运行的存储过程循环遍历大约5000万行的表,一次删除一天的记录(每天大约25,000条记录).我希望能够在流程通过print语句运行到消息窗口时观察到这种情况.我希望每次每天都有一次删除操作时能够看到一条消息.有没有办法做这样的事情?程序大致如下:
WHILE EXISTS(<query statement>)
BEGIN
BEGIN TRAN
DELETE
FROM <table>
WHERE <condition>
AND <condition>
--need some sort of "rows affected" statement here
COMMIT
END
Run Code Online (Sandbox Code Playgroud) 我正在运行一个归档脚本,它根据输入的日期从大型(~50m记录DB)中删除行.日期字段是表上的聚集索引,因此我正在应用我的条件语句.
我在while循环中运行此删除,尝试批量处理1000到100,000条记录.无论批量大小,它都非常缓慢; 像10,000条记录一样被删除一分钟.查看执行计划,"索引删除"花费了大量时间.表中大约有15个字段,其中大约有10个字段具有某种索引.有什么方法可以解决这个问题吗?我甚至不确定为什么每个索引删除都需要这么长时间,有人可以了解到这里发生了什么?这是我执行计划的一个示例:
alt text http://img94.imageshack.us/img94/1006/indexdelete.png
(序列指向删除命令)
这个数据库是实时的,并且经常被插入,这就是为什么我对使用修剪大小的复制和截断方法犹豫不决.我在这里还有其他选择吗?
我不是css的专家,所以这有点令人沮丧.我有一个充满转发器的网格.我希望每行在底部有一个1px边框,以便在视觉上分隔行.我还希望桌子两边都有深灰色边框.使用此表的以下CSS:
#repeaterTable
{
border-left: 1px solid #A3A3A3;
border-right: 1px solid #A3A3A3;
border-collapse: collapse;
}
repeaterTable.td
{
border-bottom: 1px solid white;
}
Run Code Online (Sandbox Code Playgroud)
我在FF(表右边缘的SS)中得到这个结果:
alt text http://img251.imageshack.us/img251/9278/borderff.png
这在IE8中:
alt text http://img412.imageshack.us/img412/7092/borderie.png
我需要的是让深灰色边框保持稳定,而不是每个行边界打破.该表中有两列,但cellspacing为0px,因此设置tr上的border-bottom会形成一个连续的边框.任何人都可以建议对css进行一些更改以使其正常工作吗?
我是一个相对较新的程序员; 在大学毕业大约2年的CS学士学位,主要在C#中使用.NET.我对SQL交互/脚本非常熟练,并且已经完成了一些ASP.NET工作(主要是维护现有站点).
我有兴趣在我的空闲时间创建一个网站,我能描述的最接近的是一个社交网站.非常友好的用户界面和成员之间的沟通非常重要.
我想知道我是否应该通过ASP.NET从头开始尝试,因为我有使用C#,. NET和SQL Server的经验,还是应该尝试学习像RoR这样的框架?或者像Drupal或Joomla这样的CMS?真的,任何方向,如文章,书籍等都会非常有帮助.谢谢!
编辑:应该注意我有一台Windows Server 2008计算机,我计划托管该网站,虽然这不是绝对必要的.
我无法正常运行用户定义的功能.我在SQL Server 2000上运行.
我试图在"BillingTransactions"表中返回所有具有均衡余额的用户的表.我们的交易由RecordType字段指定; 0表示购买,1表示付款.所以我要做的是获取所有用户的列表,其中每个事务与RecordType 0的总和等于每个事务与RecordType 1的总和.这就是我的函数的内部部分现在看起来像:
SELECT DISTINCT UserName FROM BillingTransactions
WHERE (SELECT SUM(AMOUNT)
FROM BillingTransactions
WHERE [BillingTransactions].[RecordType]= 0
AND
[BillingTransactions].[UserName]= UserName)
=
(SELECT SUM(AMOUNT)
FROM BillingTransactions
WHERE [BillingTransactions].[RecordType]= 1
AND
[BillingTransactions].[UserName]= UserName)
Run Code Online (Sandbox Code Playgroud)
我觉得这不是最有效的方法...有没有其他方法你可以看到如何去做?谢谢!
我有一个存储过程,它将所需月份和年份的int作为参数.它使用这些来比较我从中拉出的表中的一些日期时间值.我需要将它们转换为DateTime值.我正在尝试做这样的事情:
CONVERT(DATETIME, CONVERT(varchar(4), @year) + '-' + Convert(varchar(2),@month) + '-01 00:00:00', 102))
Run Code Online (Sandbox Code Playgroud)
它构建"2009-6-1 00:00:00"字符串(对于那些参数值).这似乎不起作用,任何其他建议如何做到这一点?我想我会像程序员一样对待这个......
这是Sql Server 2008.
我们有兴趣将他们的Sql 2008数据发送给使用SQL 2000的其他客户.现在显然这当前不起作用,所以我试图创建一个"通用"备份过程,允许我们在Server 2000上备份和恢复我们的数据以及(因为SQL2000是所有客户或客户的最小公分母).现在我们以这种方式生成备份(C#):
Server server = new Server( GetServerConnection( serverName, userName, password ) );
Backup backup = new Backup();
backup.Action = BackupActionType.Database;
backup.Database = GetDatabasePrefix() + databaseName;
backup.Devices.AddDevice( fileName, DeviceType.File );
backup.Initialize = true;
backup.SqlBackup( server );
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是,有没有办法"强制"备份作为SQL 2000运行,即使数据库是SQL 2005或2008?
此外,我们考虑通过在数据库上使用bcp过程来打包和解包表并将它们压缩在一起来避免这种情况.在zip过程中,我将一个标题标志声明为"通用"备份.这看起来是否合理,或者有更简单的方法吗?由于应用程序与服务器无关,因此所有列和表都应相同.谢谢您的帮助!
sql-server ×6
.net ×3
sql ×3
asp.net ×2
css ×2
optimization ×2
sql-delete ×2
border ×1
c# ×1
css-tables ×1
datetime ×1
frameworks ×1
javascript ×1
performance ×1
printing ×1
viewstate ×1