SQL 服务器:查找和删除存储过程中的索引提示
SQL Server: Finding and Removing index hints in stored procedures
当我们生活在一个 "delivery first" 的世界时,我们现在发现自己的数据库被 大量索引提示感染.
我编写了一个查询,可能会帮助我找出数据库中的所有 WITH (INDEX=
:
SELECT
DB_NAME() AS DB_NAME,
name AS Object_Name,
type_desc AS Object_Type,
definition
FROM
sys.sql_modules
INNER JOIN
sys.objects ON sys.sql_modules.object_id = sys.objects.object_id
WHERE
definition LIKE '%(INDEX=%';
但由于 definition
列有时太长而无法阅读,我想从该列 select 开始,比方说,30 个字符之前 WITH (INDEX=
.
之后的 30 个字符
如何 select 只是字符串的那一部分?
基本上在那一栏我只想看到:
...INNER JOIN tblSession WITH (INDEX=indRealDateTime) ON ...
这是我感兴趣的查询部分。我想一眼看出索引提示有多痛苦。
演示示例,
declare @i varchar(500)='afgdfgdfgdfg dgfdgdfg dfgdfgdfg dfgdfgdfg cvxfsdfsdfdf erwererwer (index fgfdgdf weqweqweqwe dsadsads sfsfsdfd erewwerwer 6786787 35345dfsdfgsdfsdf sdfdsfsdfdf'
DECLARE @margin INT = 15 --try 15000
SELECT SUBSTRING(@i, charindex('index', @i) - @margin, charindex('index', @i) + @margin)
当我们生活在一个 "delivery first" 的世界时,我们现在发现自己的数据库被 大量索引提示感染.
我编写了一个查询,可能会帮助我找出数据库中的所有 WITH (INDEX=
:
SELECT
DB_NAME() AS DB_NAME,
name AS Object_Name,
type_desc AS Object_Type,
definition
FROM
sys.sql_modules
INNER JOIN
sys.objects ON sys.sql_modules.object_id = sys.objects.object_id
WHERE
definition LIKE '%(INDEX=%';
但由于 definition
列有时太长而无法阅读,我想从该列 select 开始,比方说,30 个字符之前 WITH (INDEX=
.
如何 select 只是字符串的那一部分?
基本上在那一栏我只想看到:
...INNER JOIN tblSession WITH (INDEX=indRealDateTime) ON ...
这是我感兴趣的查询部分。我想一眼看出索引提示有多痛苦。
演示示例,
declare @i varchar(500)='afgdfgdfgdfg dgfdgdfg dfgdfgdfg dfgdfgdfg cvxfsdfsdfdf erwererwer (index fgfdgdf weqweqweqwe dsadsads sfsfsdfd erewwerwer 6786787 35345dfsdfgsdfsdf sdfdsfsdfdf'
DECLARE @margin INT = 15 --try 15000
SELECT SUBSTRING(@i, charindex('index', @i) - @margin, charindex('index', @i) + @margin)