把以下索引改为聚集的
CREATE NONCLUSTERED INDEX [EVENT_GUID] ON [dbo].[EVENT]
(
[EVENT_GUID] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY] --〉
CREATE CLUSTERED INDEX [EVENT_GUID] ON [dbo].[EVENT]
(
[EVENT_GUID] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [EVENT_GUID] ON [dbo].[EVENT]
(
[EVENT_GUID] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY] --〉
CREATE CLUSTERED INDEX [EVENT_GUID] ON [dbo].[EVENT]
(
[EVENT_GUID] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
为什么用[char]?
将数据库备份.
将表中的数据删去十分之九,再执行该程序,看是否有问题.
如有,再删除现有的十分之九,再执行,看是否有问题.
如果某一次删除后,程序运行没问题了,再分析其原因.
另外,建议执行一下:
select * from Event where Event_GUID='9A3BC39F-213B-434C-8AB8-857CB9665946'
检查一下该行是否有什么问题,或许,你的表里有两个一模一样的行!
执行上述步骤看看是否有提高,同时请贴出执行计划。
1:EVENT_GUID现在不是主键。是一个不唯一,非聚集索引。
2:已经试过将该字段改成聚集索引,可效果不怎么好。
3:EVENT_GUID字段的类型是char(36)的,是固定的36位长度,是通过newid()函数获取的。
4:除了EVNET_GUID索引,其他的索引针对查询的时候是有效的。
谢谢楼上各位朋友
是做聚集索引,还是非聚集索引,我现在是将这个字段设置为不唯一,非聚集索引.
这个表需要做大量的更新,400万条数据做更新的话,要提高更新效率需要考虑哪些方面?谢谢16楼的朋友了,如果答案正确我将立刻给你全部分的。谢谢你了。
现在通过这个语句查询的结果是:Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
那说明我需要打什么补丁呢?
是做聚集索引,还是非聚集索引,我现在是将这个字段设置为不唯一,非聚集索引.
这个表需要做大量的更新,400万条数据做更新的话,要提高更新效率需要考虑哪些方面?谢谢16楼的朋友了,如果答案正确我将立刻给你全部分的。谢谢你了。-------------------保持原来的EVENT_GUID 索引不变。
分你给前面的那些朋友吧,分对我没用。
现在通过这个语句查询的结果是:Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
那说明我需要打什么补丁呢?---------------------------
1399是没有打补丁的sql2005。目前你可以打sql server 2005 sp3。你可以上google下 sql server 2005 sp3,就知道了。
那是否意味着我的数据库服务器sp1,sp2,sp3三个补丁都没打过啊???
那是否我这三个补丁都需要打上呢?
索引对嘛??还有其他的解决问题的方案吗?
SELECT * FROM
Event WHERE Event_GUID='9A3BC39F-213B-434C-8AB8-857CB9665946'
表 'EVENT'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
这里可以看到io只读取两个2个page,不应该超时硬盘什么配置?
看一下硬盘的磁盘队列是什么情况?
我提供的这个信息是我本机这个表的信息,现在我不在数据库服务器那里。
我的意思就是想知道如何去分析这个信息,比方现在我提供你的数据是:逻辑读取是2次,就说明是只读取了2个page,那如果明天我在数据库
服务器那看到是读取的是100多个或者200个page,那该如何处理呢???》?
Set statistics time on
Set statistics io onrun your sql
Set statistics profile off
Set statistics time off
Set statistics io off
然后把结果都贴出来。^O^
SET STATISTICS IO ON
UPDATE Event SET Event_GUID='C063BC64-74CD-4B48-B8E8-82AE4D36E4BE',CallType='1',Customer_GUID=NULL,TransferFrom=NULL,TransfterTo=NULL,CallStartTime='2009-06-15 13:53:03',CallEndTime='2009-06-15 13:53:03',HangupType='1',WorkStartTime='2009-06-15 13:53:03',WorkEndTime='2009-06-15 13:53:09',CallResult_ID='CANCEL',HandleBy_ID='95F2E5',HandleGroup_ID='SYSTEM',StringField1='NOCTI',StringField2='CANCEL' WHERE Event_GUID='C063BC64-74CD-4B48-B8E8-82AE4D36E4BE'表 'EVENT'。扫描计数 1,逻辑读取 2220 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 有办法解决吗?更新速度很慢啊.....
不会吧,一条记录能读2220个page ?那:
select * from Event WHERE Event_GUID='C063BC64-74CD-4B48-B8E8-82AE4D36E4BE'
逻辑读是多少?
这样试试:
UPDATE Event SET Event_GUID='C063BC64-74CD-4B48-B8E8-82AE4D36E4BE',CallType='1'
,Customer_GUID=NULL,TransferFrom=NULL,TransfterTo=NULL,CallStartTime='2009-06-15 13:53:03'
,CallEndTime='2009-06-15 13:53:03',HangupType='1',WorkStartTime='2009-06-15 13:53:03'
,WorkEndTime='2009-06-15 13:53:09',CallResult_ID='CANCEL',HandleBy_ID='95F2E5'
,HandleGroup_ID='SYSTEM',StringField1='NOCTI',StringField2='CANCEL'
FROM Event with(index=Event_GUID字段索引名称)
WHERE Event_GUID='C063BC64-74CD-4B48-B8E8-82AE4D36E4BE'加上FROM Event with(index=Event_GUID字段索引名称)试试