sql-server - 在大型数据库中搜索特定 ID?

标签 sql-server database t-sql query-optimization

我需要在一个非常大的数据库中查找 ID。 ID 为:

0167a901-e343-4745-963c-404809b74dd9

数据库有数百个表,大表中有数百万行。

我可以将日期缩小到最近 2 或 3 个月内,但仅此而已。我正在寻找有关如何缩小此类搜索范围的任何线索。

我很好奇的一件事是使用 LIKE 搜索是否有帮助。

也就是说,做类似的事情有帮助

select top 10 * 
from BIG_TABLE
where DESIRED_ID like '016%'

非常感谢任何提示/建议。数据库正在被远程访问,因此这是挑战的一部分

最佳答案

我有一个几年前为类似目的构建的脚本,尽管带有文本字段。它找到符合条件的列,然后在这些列中搜索该值。由于您的范围是不确定的,因此您可能无法做得比这样更好。

您可能需要稍微调整一下以包含 uniqueidentifier 列 - 如果这实际上是数据类型 - 或者使用 equal 而不是 like 搜索。

如果这是您要定期重复使用的内容,您可以向其提供一个通用表或列的列表来查找这些内容,这样就不会花费很长时间来查找内容。

/*This script will find any text value in the database*/
/*Output will be directed to the Messages window. Don't forget to look there!!!*/

SET NOCOUNT ON
DECLARE @valuetosearchfor varchar(128), @objectOwner varchar(64)
SET @valuetosearchfor = '%putYourGuidHere%' --should be formatted as a like search 
SET @objectOwner = 'dbo'

DECLARE @potentialcolumns TABLE (id int IDENTITY, sql varchar(4000))

INSERT INTO @potentialcolumns (sql)
SELECT 
    ('if exists (select 1 from [' +
    [tabs].[table_schema] + '].[' +
    [tabs].[table_name] + 
    '] (NOLOCK) where [' + 
    [cols].[column_name] + 
    '] like ''' + @valuetosearchfor + ''' ) print ''SELECT * FROM [' +
    [tabs].[table_schema] + '].[' +
    [tabs].[table_name] + 
    '] (NOLOCK) WHERE [' + 
    [cols].[column_name] + 
    '] LIKE ''''' + @valuetosearchfor + '''''' +
    '''') as 'sql'
FROM information_schema.columns cols
    INNER JOIN information_schema.tables tabs
        ON cols.TABLE_CATALOG = tabs.TABLE_CATALOG
            AND cols.TABLE_SCHEMA = tabs.TABLE_SCHEMA
            AND cols.TABLE_NAME = tabs.TABLE_NAME
WHERE cols.data_type IN ('char', 'varchar', 'nvchar', 'nvarchar','text','ntext')
    AND tabs.table_schema = @objectOwner
    AND tabs.TABLE_TYPE = 'BASE TABLE'
    AND (cols.CHARACTER_MAXIMUM_LENGTH >= (LEN(@valueToSearchFor) - 2) OR cols.CHARACTER_MAXIMUM_LENGTH = -1)
ORDER BY tabs.table_catalog, tabs.table_name, cols.ordinal_position

DECLARE @count int
SET @count = (SELECT MAX(id) FROM @potentialcolumns)
PRINT 'Found ' + CAST(@count as varchar) + ' potential columns.'
PRINT 'Beginning scan...'
PRINT ''
PRINT 'These columns contain the values being searched for...'
PRINT ''
DECLARE @iterator int, @sql varchar(4000)
SET @iterator = 1
WHILE @iterator <= (SELECT Max(id) FROM @potentialcolumns)
BEGIN
    SET @sql = (SELECT [sql] FROM @potentialcolumns where [id] = @iterator)
    IF (@sql IS NOT NULL) and (RTRIM(LTRIM(@sql)) <> '')
    BEGIN
        --SELECT @sql --use when checking sql output
        EXEC (@sql)
    END
    SET @iterator = @iterator + 1
END

PRINT ''
PRINT 'Scan completed'

如果这看起来很奇怪,那么脚本正在执行这样的语句

if exists (select 1 from [schema].[table_name] (NOLOCK) 
                    where [column_name] LIKE '%yourValue%')
begin
   print select * from [schema].[table_name] (NOLOCK) 
                    where [column_name] LIKE '%yourValue%'
end

...只需替换 [schema][table_name][column_name]%yourValue% 循环。

正在过滤...

  • 特定架构中的表(可以删除过滤器)
  • 只有表格,没有 View (可以调整)
  • 仅包含搜索值的列
  • (n)char/(n)varchar/(n)text 数据类型(添加或更改为认识数据类型转换)

最后,输出不会进入结果网格。检查“消息”窗口(您会在其中看到“N 行受影响”)

关于sql-server - 在大型数据库中搜索特定 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11675669/

相关文章:

sql-server - SQL服务器: select the latest comment using the max date

sql - 无法访问azure sql数据库中的临时表

t-sql - 每行右连接

sql-server - 如何在 .cfc 文件中的一个 DELETE 语句中从多个表中删除?

sql - 在列中放置默认值有什么好处?

sql - sql:“扫描”中应有3个目标参数,在Golang中不是1个

sql - 根据字符范围选择字符串字段的最佳方法是什么?

mysql 第一次运行后工作正常

sql-server - 防止复制数据库文件

保存在字段中的 SQL 函数 - 如何执行 DATEADD()?