【问题标题】:Trying to speed up a SQL query试图加速 SQL 查询
【发布时间】:2015-06-26 00:11:08
【问题描述】:

我仍处于完全了解 SQL Server 的过程中。我写了一个存储过程,如下图:

ALTER PROC [dbo].[Specific_Street_Lookup]
    @STR Varchar(50),
    @CNT int
AS
BEGIN
   SELECT DISTINCT TOP (@CNT) 
       street_desc, street_localitydesc, postcode_selected
   FROM 
       Full_Streets 
   INNER JOIN 
       Postcodes ON Full_Streets.street_postcodeid = postcodes.postcode_id
   WHERE 
       street_desc LIKE @STR+'%' 
       AND postcode_selected = 'TRUE'
  ORDER BY 
       street_desc, street_localitydesc
END

但返回结果最多可能需要 7 秒,我不确定我可以做些什么来加快查询速度。

  • full_street 表的行数为 856800
  • postcode 表的行数为 856208

两个表都有一个主键(street_id & postcode_id

查询的目的:在我的 VB.net 应用程序中,当用户在街道上键入以进行查找时,它会返回与部分字符串 (LIKE @STR'+%') 匹配的许多记录 (@CNT),并且仅当postcode_selected = 'TRUE'

我确信必须有更快/更好的方法来做到这一点,我们将不胜感激。

谢谢

【问题讨论】:

  • 您可以为street_descpostcode_selected 创建索引作为组合索引并尝试查询吗?
  • 您好 Arindam,感谢您的快速回复。如何创建组合索引?我是通过表设计还是实际在存储过程中做到这一点?
  • 右键单击左窗格中的索引选项(通过展开表显示)并为该索引选择那些列,命名并保存,然后重建索引并执行 sp。
  • 谢谢,我不想在这里听起来像个白痴,但是当我展开我的邮政编码表时,我有一个 indexes 文件夹,右键单击为我提供了新的索引选项,我可以在其中只选择非聚集索引(其余为灰色)这是正确的吗?出于某种原因,当我在我的 full_streets 表上执行相同的过程并右键单击索引时,新的索引选项是灰色的。知道为什么会这样吗?我以 sa 身份登录。感谢您对此的帮助。
  • 哪一列属于哪个表?

标签: sql-server vb.net stored-procedures inner-join


【解决方案1】:

你可以试试这个索引吗?

CREATE INDEX NCI_street_desc ON Full_Streets(street_desc) INCLUDE(street_localitydesc)

【讨论】:

  • 您好,感谢您的回复。这个创建索引行是否进入存储过程?如果是,是在 BEGIN 语句之后吗?
  • 不要在存储过程中添加这个脚本。单独运行,然后只执行过程。
  • 谢谢我这样做了,在我的机器上查询很快就回来了,没问题。在客户端机器上(我做了所有相同的更改)它只略有改进。两台机器的主要区别在于我有一个 SSD 驱动器,而另一台有一个 IDE 驱动器。所以我在想,如果查询无法获得更快的软件,我可以用 SSD 升级客户端 PC。尽管这看起来确实是一种加快查询速度的昂贵方式:)
  • @RichardSpademan,你的机器上的执行计划和客户端机器上的一样吗?您可以尝试添加 OPTION(RECOMPILE),因为最佳方案会因指定的值而异。
【解决方案2】:

LIKE 运算符在这么大的表中是邪恶的,我不认为你可以用普通索引优化这个查询。

考虑使用全文搜索功能。使用全文搜索,您无法搜索部分字符串(除非您制作一个特殊表,在其中预先保存字符串的所有可能部分),但性能比使用 LIKE 运算符所能达到的效果要好得多。

【讨论】:

    【解决方案3】:

    我会将 postcode_selected 列类型更改为位 (TRUE = 1, FALSE = 0),然后相应地修改 sp - 这将降低查询的时间复杂度。

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 2015-06-11
      • 1970-01-01
      相关资源
      最近更新 更多