我需要一些关于逗号分隔值和SQL性能的建议。
问:如果我在单个表上有1M个逗号分隔的记录,那么当我拆分值时会出现重大的性能影响吗? (显然,在1M记录上运行视图时会出现性能问题。)
问:如果逗号分隔不好,还有哪些其他选择来处理这种性质的信息? (此数据将用于过滤和显示管理仪表板上的其他信息。)任何建议都会很棒。
答案 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);