Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server中优化列中的值搜索_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 在SQL Server中优化列中的值搜索

Sql server 在SQL Server中优化列中的值搜索,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我是SQL Server的新手,我对这个非常大的表有这个问题,它是以一种相当笨拙的方式实现的。下面是设计外观的摘要图片 表A itemID uniqueidentifier PK name vchar(32) datecreated datetime dateprocessed datetime datereviewed datetime approvalstatus int workflowstatus int 表B fieldID uniqueidentifier PK itemID

我是SQL Server的新手,我对这个非常大的表有这个问题,它是以一种相当笨拙的方式实现的。下面是设计外观的摘要图片

表A

itemID uniqueidentifier PK
name   vchar(32)
datecreated datetime
dateprocessed datetime
datereviewed datetime
approvalstatus int
workflowstatus int
表B

fieldID uniqueidentifier PK
itemID  uniqueidentifier FK(referencing table A's itemID)
name    vchar(32)
value   vchar(32)
在表A中,我们有一些交易记录,其中一些字段被填充到表B中。例如,表A中的某个交易的say
AccountNumber
被填充到表B中,其名称=AccountNumber,值=“[实际账号]”以及所需的itemID。现在,表B非常大,因此使用视图查询特定事务的帐号需要花费很长时间

请注意,所有这些名称列以前都在表A中,但由于业务需求不断变化,需要添加更多列,因此团队以这种方式创建结构,以便添加新字段不需要向表A添加新列


优化此表的最佳方法是什么。

您的同事创建的是实体属性值(EAV)存储。不管那些是不是坏事,我都不说了

简单的回答是:您无法优化查询

较长的答案是:您可以在AV表B中插入一个(索引)类型字段,使事情稍微更有效率

根据存储内容的不同,一个稍微相关的选项可能是使用触发器在其中维护额外类型的字段,并对后者进行索引。例如,触发器可以维护一个
int
字段,该字段保存标记为具有
int
类型的字段的整数值

也就是说,不要指望这些解决方案会带来巨大的性能提升,因为您仍将进行大量不必要的连接。请记住,这两种技巧都会增加开销(额外的磁盘空间+与索引维护相关的时间)

正确的答案是:EAV存储应该只用于存储元信息

我所说的meta,指的是很少使用where子句的东西,更不用说非常有选择性的了

换句话说,识别经常被查询的关键字段,无论是where子句、join子句、order by子句等。将它们移回表A,并对它们进行适当的索引


当你在这里时,考虑从表A中移出大多数/所有行中的内容:由于表B中不再需要“<代码> >名称>代码>字段,所以你移动的每个字段将节省你的空间,并且你将得到适当类型的数据作为奖励。这是相当困难的,以帮助与这些信息量-尤其是优化。例如,我没有看到“accountnumber”和“transaction”字段或它们的值,我也不明白你为什么要在表B中查找“actual account number”-从你发布的信息来看,这似乎是一个简单的“insert”命令…@mark table a有一些事务数据,为什么剩余的字段被插入表B,表b现在非常大,根据插入到表b中的其他字段进行搜索需要花费很长时间。这就像将表拆分为2,并为插入到表b中的某些字段指定名称值。在这种情况下:不可能通过保持此模型来进行“高质量优化”。您需要做的是重新设计DB(这将是唯一好的解决方案)或快速而脏的“出来”:)在tableB中引入一个新的键字段,它是EAV表中定义的ID,告诉[name]字段的“类型”。所以EAV类似于“AccountNumber=1,Transaction=2,等等”。通过这种方式,您可以在开始在TableB中搜索之前过滤掉大量的记录