用户定义的存储过程参数中使用的数据类型 [英] User defined data type used in stored procedure parameters

查看:67
本文介绍了用户定义的存储过程参数中使用的数据类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个存储过程,其参数使用

用户定义的数据类型定义。运行程序所需的时间可以花费10到50秒来取决于程序。

如果我将参数数据类型更改为实际数据类型,例如

varchar(10)等,存储过程需要少于一秒的时间才能返回记录。用户定义的类型大多是varchar,但有些是b $ b,其他如int。它们都是输入类型参数。

如果没有使用用户定义类型的
,存储过程为什么运行得更快的任何想法?


使用SQL Server 2000.


谢谢,

DW

I have several stored procedures with parameters that are defined with
user defined data types. The time it takes to run the procedures can
take 10 - 50 seconds depending on the procedure.
If I change the parameter data types to the actual data type such as
varchar(10), etc., the stored procedure takes less that a second to
return records. The user defined types are mostly varchar, but some
others such as int. They are all input type parameters.
Any ideas on why the stored procedure would run much faster if not
using user defined types?

Using SQL Server 2000.

Thanks,
DW

推荐答案

为什么使用UDT作为参数?我不知道是否有性能

的差异但UDT规则和默认值不适用于变量所以我

看到很少或没有任何好处使用它们。


UDT,规则和默认值是向后兼容性功能。转向

前进,强烈建议您使用约束 - 更多

更强大,更易于使用。


- -

David Portas

SQL Server MVP

-
Why do you use UDTs for parameters? I''ve no idea if there''s a performance
difference but UDT rules and defaults don''t get applied to variables so I
see little or no benefit in using them.

UDTs, rules and defaults are backwards compatibility features. Going
forward, it is highly recommended that you use constraints instead - much
more powerful and easier to use.

--
David Portas
SQL Server MVP
--


David Portas( RE****************************@acm.org)写道:
David Portas (RE****************************@acm.org) writes:
为什么使用UDT参数?我不知道是否存在性能差异,但UDT规则和默认值不适用于变量,所以我看到使用它们的好处很少或根本没有。

UDT,规则和默认值是向后兼容性功能。向前走,强烈建议您使用约束 - 更强大,更容易使用。
Why do you use UDTs for parameters? I''ve no idea if there''s a performance
difference but UDT rules and defaults don''t get applied to variables so I
see little or no benefit in using them.

UDTs, rules and defaults are backwards compatibility features. Going
forward, it is highly recommended that you use constraints instead - much
more powerful and easier to use.




对不起,但我认为这是非常糟糕的建议。


首先,用户定义的数据类型绝不是不推荐使用的功能。 (在
SQL 2005中,Microsoft添加了适当的DDL语法来创建它们。)用户 -

定义的数据tyepes对于域名来说并不是完全令人满意的替代品,

但它绝对是一个有用的功能。在我使用的数据库中,大约99%

的字符列是通过一些用户定义的数据类型定义的。


举一个例子:说出来你的数据库有一个代码,它出现在很多表中,并且存储了大量的参数和变量

程序等等。假设这段代码长度为5个字符,你现在找到你需要更长的

,比如八个字符。如果您使用UDT,那么

是您需要签出和更改的一个文件。如果你已经创建了所有的

列,因为varchar(5)声明了所有的参数和列等等,你

有大量的工作来查找所有引用,你永远不会真的很确定

你错过了某个地方的参考资料。 (为了让它变得更糟,假设你有几个不应该更改的其他varchar(5)实体。$

即使使用UDT,你也有很多努力撰写一个脚本来实现表格中的
更改。但是这是一个你可以运行和测试的脚本,并且你可以确定一旦它通过测试就可以了。如果您有一个

普通varchar(5),您可能会发现对您的客户的回复是

抱歉,我们无法安全地实施此更改。


其次,微软确实不赞成规则和默认值,但这是他们这边的愚蠢行为。假设您有一个类型列,它允许值为A,B和C的值为
,并且此类型列出现在多个表中。

如果定义规则并绑定对于类型,这是一个非常简单的问题,

也允许值D.如果你有约束,你在数据库中有许多

对象说同样的事情。绑定规则和默认值

到用户定义的数据类型是SQL Server中非常强大的功能。

(绑定规则和默认直接到列是另一回事;在这种情况下

约束更好。)

-

Erland Sommarskog,SQL Server MVP, es **** @ sommarskog.se


SQL Server SP3联机丛书
http://www.microsoft.com/sql/techinf...2000/books。 asp


(da ********* @ hotmail.com)写道:
(da*********@hotmail.com) writes:
我有几个存储使用用户定义的数据类型定义的参数的过程。运行程序所需的时间可能需要10-50秒,具体取决于程序。
如果我将参数数据类型更改为实际数据类型,例如
varchar(10),等等,存储过程需要少于一秒钟才能返回记录。用户定义的类型主要是varchar,但有些类似于int。它们都是输入类型参数。
如果没有使用用户定义的类型,存储过程为什么运行得更快的任何想法?
I have several stored procedures with parameters that are defined with
user defined data types. The time it takes to run the procedures can
take 10 - 50 seconds depending on the procedure.
If I change the parameter data types to the actual data type such as
varchar(10), etc., the stored procedure takes less that a second to
return records. The user defined types are mostly varchar, but some
others such as int. They are all input type parameters.
Any ideas on why the stored procedure would run much faster if not
using user defined types?




什么如果你换回来的话会发生什么?


SQL Server有一个称为参数嗅探的功能。这意味着在第一次运行过程时,
,优化器将输入值

作为构建计划的指导。如果第一次调用

具有非典型值,这会产生影响,这可能会导致计划中的计划不佳 -

a计划对于更典型的值而言较差, 那是。因此,根据这个理论,数据类型的变化并不重要,但是你从程序缓存中刷新查询计划这一事实仅仅是事实。 >
重要性。


如果有索引视图

或涉及索引计算列,则在同一主题上还有其他一些可能性。在这种情况下,可能是这样的情况

,该程序最初是使用QUOTED_IDENTIFIER和/或

ANSI_NULLS关闭创建的。这些设置使用hte过程保存,并且对于要使用的视图和计算列的索引,必须打开两个

。如果您从查询分析器重新创建了这个过程,那么很可能您已经在这些设置上进行了b / b
。 (因为默认情况下它们是从QA开始的。)


另一种可能性是,某些参数的类型不正确

类型,并且您替换为正确的类型。在这种情况下隐式

转换可能导致索引没有被使用。

我们在数据库中使用了很多用户定义的类型,而且我们从来没有

注意到它们之间存在任何问题。

-

Erland Sommarskog,SQL Server MVP, es **** @ sommarskog.se


SQL Server SP3的联机书籍
http://www.microsoft.com/sql/techinf...2000/books.asp


这篇关于用户定义的存储过程参数中使用的数据类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆