2012-03-16 23 views
1

我有一系列的我用T-SQL查询正在运行速度非常慢的。我怀疑引起一些问题的一部分查询是我必须对它们执行的一系列Cast。SQL铸造列组高效地协同

这是问题所在。我必须将4列合并为一个nvarchar/varchar,作为它们的组合形成另一个表(我知道这个可怕的想法,但我坚持使用它)中的条目的(半) - 唯一键。

四列为: t_orno,t_reno,t_pono,t_srnb:所有没有索引的INT列。

我一直在这样做的方式是像这样:

Cast(t_orno AS nvarchar(10)) + '-' + Cast(t_reno as nvarchar(10)) + 
    '-' + Cast(t_pono as nvarchar(5)) + '-' + Cast(t_srnb as nvarchar(5)) 

不幸的是我坚持与具有这些列合并到一起。有没有更好的方法来做到这一点?查询需要更高效,而且必须要比单独投射全部四种方法更好?

假设:数据库是完全不可改变的 - 这可悲的是......(不想去那个..)

感谢您的帮助。

编辑:由于每一个请求用于在表的更多信息:

正在从查询只含有一个指数这两个表,并且它是在PK柱。再次请注意,这些表上没有任何内容可以添加/更改。

表被接合包含这四个列的组合: BaanID> nvarchar的,没有索引。

+0

您可以在问题和查询的表使用的是加入他们的数据结构(包括索引)? – 2012-03-16 14:25:12

+0

@ MarkBannister嗯,我正在努力改进包含相当复杂的CTE的大约5种不同的查询。提供它们并解释发生的事情将非常困难 - 这就是为什么我只关注查询的这一方面。我会尝试添加更多信息。 – ImGreg 2012-03-16 14:29:18

+0

@MarkBannister不确定要包含哪些其他相关信息。让我知道是否还有其他感兴趣的东西。 – ImGreg 2012-03-16 14:35:53

回答

2

您是否尝试过反向的,即分裂的“在另一个表中的条目”,“ - ”字符和铸造各为int - 可能会产生更好的性能?

+0

有趣。我喜欢你的想法@BarryKaye。你能给出一个分裂和/或一些有用的链接的基本例子。 – ImGreg 2012-03-16 14:41:07

+1

@ImGreg:根据条目格式的复杂性,您可能只使用一系列['SUBSTRING()'](http://msdn.microsoft.com/zh-cn/library/ms187748.aspx “SUBSTRING(Transact-SQL)”)调用固定参数来删除整数部分,或者您可能需要另外使用['CHARINDEX()'函数](http://msdn.microsoft.com/en-us /library/ms186323.aspx“CHARINDEX(Transact-SQL)”)来查找条目中数字组件的正确位置。 (你可能会搜索字符串中的''-''s并计算它们之间的子字符串的长度)。 – 2012-03-16 18:05:36

1

我会尝试使用持久视图并在其上创建索引。这里有一篇文章可以帮助你:http://technet.microsoft.com/en-us/library/cc917715.aspx

或者你可以计算列含有T_ *列和索引此列的表中添加。

+0

这些索引视图对于非常大的数据库@Dan是否可行?包含这些关键4列的表格大约有400万行,并且每天扩展大约50k。 – ImGreg 2012-03-16 14:38:30

+0

我们有一个项目的相似数字,SQL Server 2008 R2 Standard很好地处理了这些查询。如果我是你,我会使用数据库的备份来创建测试环境,并检查插入/更新/删除/选择操作的性能。 – Dan 2012-03-16 14:42:54

+0

非常好。我一直在努力改进它们,但是数据库的糟糕设置使它具有挑战性。尚未充分了解查询的性能。 *正在进行中* – ImGreg 2012-03-16 14:46:23

0

我相信这是至关重要的一点:

表被加入包含这四个列的组合:BaanID> nvarchar的,没有索引

除非你是在处理相对小的表,将两个表格拼在一起列入未编制索引的列表可能代价很高。