简体   繁体   English

如何在具有不同数据类型的多列上搜索大量数据?

[英]How to search huge data on multiple column with different datatypes?

I have a DataElement table like this:我有一个这样的DataElement表:

 DataElement table 
 ValueAsBoolean : bit nullable
 ValueAsDatetime : datetime2 nullable
 ValueAsDecimal : decimal(10,3) nullable
 ValueAsInt : int nullable
 ValueAsString : nvarchar(100) nullable

The data will look like this:数据将如下所示:

ValueAsBoolean ValueAsBoolean ValueAsDateTime值作为日期时间 ValueAsDecimal十进制值 ValueAsInt ValueAsInt ValueAsString值作为字符串
1 1 NULL无效的 NULL无效的 NULL无效的 NULL无效的
NULL无效的 2022-09-03 12:30:01.210 2022-09-03 12:30:01.210 NULL无效的 NULL无效的 NULL无效的
NULL无效的 NULL无效的 23.000 23.000 NULL无效的 NULL无效的
NULL无效的 NULL无效的 NULL无效的 5 5 NULL无效的
NULL无效的 NULL无效的 NULL无效的 NULL无效的 MONTARY INC.蒙塔利公司

I want to search data across all columns that match the input search keyword.我想在与输入搜索关键字匹配的所有列中搜索数据。

  • for ValueAsDatetime can be searched by TIME ZONE and format show on UI可以通过 TIME ZONE 搜索ValueAsDatetime并在 UI 上显示格式
  • for ValueAsBoolean can be searched by text "TRUE", "FALSE" or part of "TRUE" or "FALSE"对于ValueAsBoolean可以通过文本“TRUE”、“FALSE”或“TRUE”或“FALSE”的一部分进行搜索
  • for ValueAsString , ValueAsInt , ValueAsDecimal can be search by part of input text对于ValueAsStringValueAsIntValueAsDecimal可以按输入文本的一部分进行搜索

For example given 2022-09-03 12:30:01.210 is Tue, 9 Sep 2022例如,给定 2022-09-03 12:30:01.210 是 2022 年 9 月 9 日星期二

User input "T".用户输入“T”。

Output will be rows输出将是行

  • 1 because "T" match with ValueAsBoolean 1 ( T RUE) 1 因为“T”与 ValueAsBoolean 1 ( T RUE) 匹配
  • 2 because "T" match with " T ue, 9 Sep 2022" 2 因为“ T ”与“Tue, 9 Sep 2022”匹配
  • 5 because "T" match with "MON T ARY INC." 5 因为“T”与“MON T ARY INC.”匹配

So, I create query base on EF core by:因此,我通过以下方式创建基于 EF 核心的查询:

  1. convert all column into String value将所有列转换为字符串值
  2. format the value格式化值
  3. check value contains the search keyword or not检查值是否包含搜索关键字

The query will look like:查询将如下所示:

SELECT *
FROM [DataElement]
WHERE 
    (([ValueAsBoolean] IS NOT NULL AND (('T' = N'')
    OR (CHARINDEX('T', LOWER( CASE WHEN ValueAsBoolean = 1 then 'true' else 'false' END)) > 0))) 
    OR ([ValueAsDateTime] IS NOT NULL AND (('T' = N'') 
    OR (CHARINDEX('T', LOWER( FORMAT(CONVERT(DATETIME, SWITCHOFFSET( [ValueAsDateTime], DATEPART(TZOFFSET, ValueAsDateTime AT TIME ZONE 'UTC' ))), 'ddd, d MMM yyyy H:mm:ss' ))) > 0)))) 
    OR ([ValueAsDecimal] IS NOT NULL AND (('T' = N'')
    OR (CHARINDEX('T', LOWER(CONVERT(VARCHAR(100), [ValueAsDecimal]))) > 0)))) 
    OR ([ValueAsInt] IS NOT NULL AND (('T' = N'')
    OR (CHARINDEX('T', LOWER(CONVERT(VARCHAR(11), [ValueAsInt]))) > 0)))) 
    OR ([ValueAsString] IS NOT NULL AND (('T' = N'')
    OR (CHARINDEX('T', LOWER([ValueAsString])) > 0)))

The problem is that when the data is huge (more than 500000 records) it takes a long time to process (more than 30 seconds) and exceeds the query timeout limit.问题是当数据很大时(超过 500000 条记录)需要很长时间来处理(超过 30 秒)并且超过查询超时限制。

My question is how to search huge data on multiple columns like this?我的问题是如何在这样的多个列上搜索大量数据?

The one option I think is to create new column as NVARCHAR(100), convert and save data on multiple COLUMN into this column, set the index to the column and search only that column, but I cannot apply search format for datetime.我认为的一个选择是将新列创建为 NVARCHAR(100),将多个 COLUMN 上的数据转换并保存到该列中,将索引设置为该列并仅搜索该列,但我不能为日期时间应用搜索格式。

Or is there another solution for this?或者有其他解决方案吗?

Try following code.试试下面的代码。 With this code, you can search in all the fields of all the database tables.使用此代码,您可以在所有数据库表的所有字段中进行搜索。 With a little change, you can add the table name as a filter and search only in the desired table:稍作改动,您可以将表名添加为过滤器并仅在所需表中搜索:

DECLARE @SearchStr nvarchar(100)
SET @SearchStr = 'Put Search String Here'
CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
SET NOCOUNT ON
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET  @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
WHILE @TableName IS NOT NULL
BEGIN
    SET @ColumnName = ''
    SET @TableName =
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM     INFORMATION_SCHEMA.TABLES
        WHERE         TABLE_TYPE = 'BASE TABLE'
            AND    QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
            AND    OBJECTPROPERTY(
                    OBJECT_ID(
                        QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                         ), 'IsMSShipped'
                           ) = 0
    )
    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
    BEGIN
        SET @ColumnName =
        (
            SELECT MIN(QUOTENAME(COLUMN_NAME))
            FROM     INFORMATION_SCHEMA.COLUMNS
            WHERE         TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                AND    TABLE_NAME    = PARSENAME(@TableName, 1)
                AND    DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal')
                AND    QUOTENAME(COLUMN_NAME) > @ColumnName
        )
        IF @ColumnName IS NOT NULL
        BEGIN
            INSERT INTO #Results
            EXEC
            (
                'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' +
                ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
            )
        END
    END  
END
SELECT ColumnName, ColumnValue FROM #Results
DROP TABLE #Results

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 DataGrid - 一列具有多种数据类型的模板字段 - DataGrid - TemplateFields with multiple datatypes for one column 如何首先在实体框架代码中映射不同数据类型的列和实体属性 - How to map column and entity propery of different datatypes in entity framework code first 如何搜索庞大的非文本数据集? - How to search over huge non-text based data sets? 如何动态绑定具有 ItemTemplateSelector 的 ListView 的 ItemSource,其中 ItemTemplateSelector 包含具有不同 DataTypes 的多个 DataTemplates? - How to dynamically bind the ItemSource of a ListView which has ItemTemplateSelector containing Multiple DataTemplates which have Different DataTypes? 如何在XAML中将不同的数据类型分配给静态HierarchicalDataTemplate? - How to assign different DataTypes to a static HierarchicalDataTemplate in XAML? 如何在C#中返回不同的数据类型? - how to return different datatypes in C#? 如何将项目添加到具有不同数据类型的列表 - How to add items to list with different datatypes 快速搜索巨大字符串中的多个部分字符串 - Swiftly search for multiple partial strings in a huge string 如何 select 大表中的某些列在某些行中包含 null 数据并在列中使用不同的 - How to select some column in huge table which contain null data in some row and use distinict in column 如何从巨大的 CSV 文件 (20Gb) C# ASP.NET 中搜索数据 - How to Search Data From Huge CSV Files (20Gb) C# ASP.NET
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM