关于大量逗号分隔数据的一些建议

时间:2014-09-03 06:12:35

标签: sql-server tsql types

我需要一些关于逗号分隔值和SQL性能的建议。

问:如果我在单个表上有1M个逗号分隔的记录,那么当我拆分值时会出现重大的性能影响吗? (显然,在1M记录上运行视图时会出现性能问题。)

问:如果逗号分隔不好,还有哪些其他选择来处理这种性质的信息? (此数据将用于过滤和显示管理仪表板上的其他信息。)

任何建议都会很棒。

2 个答案:

答案 0 :(得分:0)

  

如果我在单个表上有1M个逗号分隔的记录,那么当我拆分值时会有重大的性能影响吗?

是的,你是对的。使用它不是一个好主意。尽量避免这种情况。

您可以使用表来逐行保存所有值,而不是以逗号分隔在一行中,而不是存储逗号分隔值。它将提高系统的性能,也将用于发明数据库的目的。

答案 1 :(得分:0)

我不确定你的意思"这种性质的信息"。如果信息一致,那么您应该使用标准关系表。另一方面,如果数据是异构的(混合的,不相同的),可能会根据需求逐行变化,那么您可以考虑使用可以编制索引的xml。例如;下面的两个csv行可以代表如xml列中所示。这只是一种方法,但它显示了一种以可索引的方式将xml用于结构化但异构数据的方法。

declare @csv table(
  [data]     [sysname]
  , [filter] [sysname]);
 insert into @csv
        ([data],[filter])
 values      (N'data that needs to be filtered',N'a,b,c,d'),
        (N'data that needs to be filtered',N'e,f,g,h');
 select [data]
   , [filter] -- some awfully slow filtering function applies here
 from   @csv;
 --
 declare @xml table (
   [data]     [sysname]
   , [filter] [xml]);
 insert into @xml
        ([data],[filter])
 values      (N'data that needs to be filtered',N'<data>
  <filter>a</filter>
  <filter>b</filter>
  <filter>c</filter>
  <filter>d</filter>
</data>'),
        (N'data that needs to be filtered',N'<data>
  <filter>a</filter>
  <filter>b</filter>
  <filter>c</filter>
  <filter>d</filter>
</data>');
select [data]
   , cast(t.c.query(N'./text()') as [sysname])
from   @xml
   cross apply [filter].nodes(N'/data/filter') as t(c);