我需要在一个非常大的数据库中查找ID。 ID是:
0167a901-e343-4745-963c-404809b74dd9
数据库有数百个表,大表中有数百万行。
我可以将日期缩短到最近2或3个月内,但就是这样。我正在寻找有关如何缩小此类搜索范围的任何线索。
我很好奇的一件事是使用LIKE
搜索是否有帮助。
即做
之类的事情是否有帮助select top 10 *
from BIG_TABLE
where DESIRED_ID like '016%'
非常感谢任何提示/建议。远程访问数据库,这是挑战的一部分
答案 0 :(得分:2)
首先,为什么你需要特定的价值形式whoel数据库是什么要求。它看起来像一次性工作来找到价值,并基于你将采取一些行动。但它可能是时间和资源消耗。
无论如何,它看起来像一个guid专栏。 除非所有guid列都有索引,否则无法加快速度。
无论如何这里是一个小查询,它将在所有具有任何guid列的表上生成select语句(如果这是一些varchar列,那么它非常困难,因为你必须在每个表的每一列上编写查询,你可以写下来,但我认为这不会有效。)
然而,最重要的是输出是基于以下顺序排序的。如果guid列上有索引和前导键,则首先列出这些表。 然后根据数据页列出表,以便查询使用最少的资源。因此,如果您的guid值在前几个表中,它将非常快。如果它将在最后一个表中,它将花费时间基于表的大小,因此可能需要很多时间。
此外,在这个查询上声明一个游标然后逐个执行该语句,一旦你发现值来自游标循环,因为guid是唯一值。这将非常有效。
select * from (
select 'select ' + ac.name +' from ' + OBJECT_SCHEMA_NAME(ac.object_id) + '.' + OBJECT_NAME(ac.object_id) + ' where ' + ac.name + '=''29490167a901-e343-4745-963c-404809b74dd9''' as querytext
--,*
,isnull(cnt,0) as numberofrows,
ROW_NUMBER() over(order by case when ic.key_ordinal = 0 then 0 else 1 end asc, isnull(si.dpages,si_1.dpages) asc) as rn,isnull(si.dpages,si_1.dpages) datapages
from sys.all_columns ac
inner join sys.all_objects ao on ac.object_id = ao.object_id
left join sys.index_columns ic on ac.object_id=ic.object_id
and ac.column_id =ic.column_id
left join sys.sysindexes si on ac.object_id = si.id and ic.index_id=si.indid
outer apply (select SUM(rows) from sys.partitions p where ac.object_id = p.object_id and index_id in (0,1) ) a(cnt)
left join sys.sysindexes si_1 on si_1.id =ac.object_id and si_1.indid in (0,1)
where system_type_id =36
and ao.type ='U'
) dta order by rn asc
go
答案 1 :(得分:2)
我有几年前为了类似目的而建立的脚本,尽管有文本字段。它找到符合条件的列,然后在这些列中搜索该值。由于你有一个非确定性的范围,你可能无法比这样做更好。
您可能需要稍微调整一下以包含uniqueidentifier列 - 如果它实际上是数据类型 - 或者使用相等而不是类似的搜索。
如果这是您定期重复使用的内容,您可以在其中提供常用表或列的列表以查找这些内容,因此查找内容的时间不长。
/*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%
。
过滤......
(n)char
/ (n)varchar
/ (n)text
数据类型(添加或更改,了解数据类型转换)最后,输出不会转到结果网格。查看消息窗口(您看到“N行受影响”)
答案 2 :(得分:1)
设置DESIRED_ID
的{{1}}部分。
如果此表中没有Index
,则数据库引擎执行Index
和Table scan
以检查reads every row
是否类似于'016'并确保正确{{} 1}}总是导致性能的显着提高
DESIRED_ID
实施indexing
将搜索从016开始直到017或类似02或类似1的记录。无论它先发现什么,然后停止搜索。
准备CREATE INDEX NameIndex ON TableName(ColumnName ASC)
INCLUDE (ColumnName2)
以在所有表中查找样本GUID值的数据。您可以使用以下查询在特定表格下的列名称中查找数据。
Index