RSS 2.0 Feed
2006-01 Entries
摘要:今天邹建问我一个问题,系统存储过程中的查询是在用户数据库中执行的,但是用户自己建立的存储过程却是在master中执行的(都是在master中建立的存储过程)。例如:use masterexec sp_helptext 'sp_spaceused'拿到sp_spaceused的代码,把名字改为sp_spaceused2,再执行一次建立这个存储过程。如:use masterGOSET QUOTED_IDENTIFIER ON GOSET ANSI_NULLS OFF GO create procedure sp_spaceused2 --- 1996/08/20 17:01@objname nvarchar(776) = null,  -- The object we want size on.@updateusage varchar(5) = false  -- Param. for specifying that     -- usage info. should be updated.as…… 然后在用户数据库中执行这两个存储过程。一样的代码,但是却得到不一样的结果。USE STSDWGOEXEC sp_spaceusedEXEC sp_spaceused2 database_name                                                                                                                    database_size      unallocated space  -------------------------------------------------------------------------------------------------------------------------------- ------------------ ------------------ STSDW                                                                                                                            13364.69 MB        7811.36 MB  reserved           data               index_size         unused             ------------------ ------------------ ------------------ ------------------ 3896848 KB         3779384 KB         70872 KB           46592 KB database_name                                                                                                                    database_size      unallocated space  -------------------------------------------------------------------------------------------------------------------------------- ------------------ ------------------ STSDW                                                                                                                            22.00 MB           -3788.58 MB  reserved           data               index_size         unused             ------------------ ------------------ ------------------ ------------------ 3896848 KB         3779384 KB         70872 KB           46592 KB 我们会发现其中database_size和unallocated space 的结果不一样,这是什么原因呢,SQL Server 的Bug? 原因是这样的,这是系统存储过程的特有功能,要想达到同样的功能,你除了名字要以sp_开头外(当然也必须是dbo的),还得使用sp_MS_marksystemobject 把你的存储过程标记为MS-shipped。如:sp_MS_marksystemobject 'sp_spaceused2' sp_MS_marksystemobject 也是一个未公开的存储过程,有兴趣可以自己看看它的代码,代码前一段如下:-- FOR......[阅读全文]

posted @ | Feedback (4) |

摘要:原作(Wei.Xiao)很多人都认为SQL Server的锁授予是FIFO(先进先出)以避免饥饿问题(又叫哲学家问题)的。想想吧,你在超市等待结帐的时候,如果别人可以随便插队的话,你还能离开超市吗? 我的朋友Santtu 是一个lock manager的专家,他告诉我SQL Server做得比这要聪明。FIFO有一个缺点,它并不总是允许最大的并发度。SQL Server 2005的lock manager就做到了在避免饥饿的情况下允许了尽可能大的并发度。 举个例子说明:Transaction T1在表Foo上有个IX lock,Transaction T2也在表Foo运行了一个查询并且指定了TABLOCK。显然T2会被T1所阻塞,S lock和IX lock是不能并存的。Transaction T3在表Foo上有个查询,但没有使用锁定提示。T3的IS请求就会在T2的S请求之前被授予,因为IS和IX, S都不冲突。但是如果Transaction T4要在表Foo上作一个update的话,就会被T2所阻塞,因为T4的IX lock和T2的S lock是不能并存的,T2先来,所以T2会先被执行。...[阅读全文]

posted @ | Feedback (3) |