Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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视图速度较慢_Sql_Sql Server_Tsql - Fatal编程技术网

用于搜索的SQL视图速度较慢

用于搜索的SQL视图速度较慢,sql,sql-server,tsql,Sql,Sql Server,Tsql,我们正在尝试构建一个视图,该视图以扁平化的方式提供数据,支持简单的搜索 挑战在于,当我们显示诸如名称之类的字段时,我们需要在诸如地址之类的字段中搜索,这些字段我们没有显示,但仍然可以返回。地址存储在地址表中,每个客户机记录可以有多个地址 所以我最初想做一个视图,将主客户机记录和不同的地址放在一起。由于连接,这导致了重复的行 接下来,我编写了一个查询,将这些子表汇总并连接在一起。这使得搜索变得很容易,并且不会得到任何重复的结果。我把它放在一个视图中,但速度很慢。由于访问数据的组件的性质,我更愿意将

我们正在尝试构建一个视图,该视图以扁平化的方式提供数据,支持简单的搜索

挑战在于,当我们显示诸如名称之类的字段时,我们需要在诸如地址之类的字段中搜索,这些字段我们没有显示,但仍然可以返回。地址存储在地址表中,每个客户机记录可以有多个地址

所以我最初想做一个视图,将主客户机记录和不同的地址放在一起。由于连接,这导致了重复的行

接下来,我编写了一个查询,将这些子表汇总并连接在一起。这使得搜索变得很容易,并且不会得到任何重复的结果。我把它放在一个视图中,但速度很慢。由于访问数据的组件的性质,我更愿意将其保留为一个视图,但是,我并不完全反对它

这能加快速度吗?还是我走错了方向

下面是SQL(实际上是T-SQL):


创建索引视图并尽量避免不必要的distinct子句。

在客户端和addresshistory(addresshistory可以不同,所以不同)之间实现内部联接时,为什么要在视图定义中使用DISTINCT子句?为了加快搜索速度,重要的是要在要搜索的字段上添加索引,而不是创建视图。@Joe,由于联接的性质,最终会有重复的记录。“这些区别会把它们剔除掉。@Ben:我不完全确定我是否有选择的余地。”。前面的搜索前端与其说是一个搜索,不如说是一个美化的过滤器,而且没有任何方法来执行更具针对性的搜索。@kettch:但在字段列表中,您放置了addresshistory字段,因此明显失败。
WITH ClientBase
AS
(
    SELECT DISTINCT Client.ClientID, ClientNames.FirstName, ClientNames.LastName, ClientNames.MiddleName, 
        AddressHistory.Address1 + ' ' + AddressHistory.Address2 AS StreetAddress, 
        AddressHistory.City, ContactInfo.Contact AS Phone
    FROM Client
        INNER JOIN ClientNames ON ClientNames.ClientID = Client.ClientID
        INNER JOIN AddressHistory ON AddressHistory.ClientID = Client.ClientID
        INNER JOIN ContactInfo ON ContactInfo.ClientID = Client.ClientID
)
SELECT DISTINCT vcs.ClientID, vcs.FirstName, vcs.LastName, vcs.MiddleName,
                (SELECT STUFF ((SELECT DISTINCT TOP (100) PERCENT ';' + ClientBase.StreetAddress AS [text()]
                                FROM ClientBase
                                WHERE ClientBase.ClientID = vcs.ClientID
                                FOR XML PATH('')), 1, 1, '') AS StreetAddress) AS StreetAddress,
                (SELECT STUFF ((SELECT DISTINCT TOP (100) PERCENT ';' + ClientBase.City AS [text()]
                                FROM ClientBase
                                WHERE ClientBase.ClientID = vcs.ClientID
                                FOR XML PATH('')), 1, 1, '') AS City) AS City,
                (SELECT STUFF ((SELECT DISTINCT TOP (100) PERCENT ';' + ClientBase.Phone AS [text()]
                                FROM ClientBase
                                WHERE ClientBase.ClientID = vcs.ClientID
                                FOR XML PATH('')), 1, 1, '') AS Phone) AS Phone
FROM ClientBase AS vcs