Sql server 提高SQLServer数据库中select查询的性能

Sql server 提高SQLServer数据库中select查询的性能,sql-server,performance,relational-database,query-optimization,select-query,Sql Server,Performance,Relational Database,Query Optimization,Select Query,原始权益表: 我会在以下各项上加上索引: 表:原始股本 列:属性ID、AVM\U置信度\U分数 及 表:原始地址 列:SA_属性\u ID 包括:MM_FIPS_州代码、MM_FIPS_市政代码 您的查询可以简化,这可能会加快: CREATE TABLE [dbo].[RAW_Equity] ( [PROPERTY_ID] [int] NOT NULL, [SCM_ID] [int] NOT NULL, [MM_STATE_CODE] [varchar](2) NOT NULL, [MM_MUN

原始权益表:


我会在以下各项上加上索引:

表:原始股本

列:属性ID、AVM\U置信度\U分数

表:原始地址

列:SA_属性\u ID

包括:MM_FIPS_州代码、MM_FIPS_市政代码


您的查询可以简化,这可能会加快:

CREATE TABLE [dbo].[RAW_Equity]
(
[PROPERTY_ID] [int] NOT NULL,
[SCM_ID] [int] NOT NULL,
[MM_STATE_CODE] [varchar](2) NOT NULL,
[MM_MUNI_NAME] [varchar](24) NOT NULL,
[MM_FIPS_STATE_CODE] [int] NOT NULL,
[MM_FIPS_MUNI_CODE] [int] NOT NULL,
[MM_FIPS_COUNTY_NAME] [varchar](35) NOT NULL,
[AVM_FINAL_VALUE] [int] NULL,
[AVM_LOW_VALUE] [int] NULL,
[AVM_HIGH_VALUE] [int] NULL,
[AVM_CONFIDENCE_SCORE] [int] NULL,
[FINAL_VALUE] [float] NULL,
[FIRST_POSITION_SR_UNIQUE_ID] [int] NULL,
[FIRST_POSITION_LOAN_DATE] [int] NULL,
[FIRST_POSITION_DOC_NBR] [varchar](20) NULL,
[FIRST_POSITION_LOAN_VAL] [int] NULL,
[FIRST_POSITION_LENDER_CODE] [int] NULL,
[FIRST_POSITION_LNDR_LAST_NAME] [varchar](50) NULL,
[FIRST_POSITION_LNDR_FIRST_NAME] [varchar](50) NULL,
[FIRST_POSITION_LENDER_TYPE] [varchar](1) NULL,
[FIRST_POSITION_LOAN_TYPE] [varchar](1) NULL,
[FIRST_POSITION_INTEREST_RATE_TYPE] [varchar](1) NULL,
[FIRST_POSITION_ESTIMATED_INTEREST_RATE] [float] NULL,
[FIRST_POSITION_LNDR_CREDIT_LINE] [varchar](1) NULL,
[FIRST_POSITION_MODELED_MORTGAGE_TYPE] [varchar](1) NULL,
[SECOND_POSITION_SR_UNIQUE_ID] [int] NULL,
[SECOND_POSITION_LOAN_DATE] [int] NULL,
[SECOND_POSITION_DOC_NBR] [varchar](20) NULL,
[SECOND_POSITION_LOAN_VAL] [int] NULL,
[SECOND_POSITION_LENDER_CODE] [int] NULL,
[SECOND_POSITION_LNDR_LAST_NAME] [varchar](50) NULL,
[SECOND_POSITION_LNDR_FIRST_NAME] [varchar](50) NULL,
[SECOND_POSITION_LENDER_TYPE] [varchar](1) NULL,
[SECOND_POSITION_LOAN_TYPE] [varchar](1) NULL,
[SECOND_POSITION_INTEREST_RATE_TYPE] [varchar](1) NULL,
[SECOND_POSITION_ESTIMATED_INTEREST_RATE] [float] NULL,
[SECOND_POSITION_LNDR_CREDIT_LINE] [varchar](1) NULL,
[SECOND_POSITION_MODELED_MORTGAGE_TYPE] [varchar](1) NULL,
[THIRD_POSITION_SR_UNIQUE_ID] [int] NULL,
[THIRD_POSITION_LOAN_DATE] [int] NULL,
[THIRD_POSITION_DOC_NBR] [varchar](20) NULL,
[THIRD_POSITION_LOAN_VAL] [int] NULL,
[THIRD_POSITION_LENDER_CODE] [int] NULL,
[THIRD_POSITION_LNDR_LAST_NAME] [varchar](50) NULL,
[THIRD_POSITION_LNDR_FIRST_NAME] [varchar](50) NULL,
[THIRD_POSITION_LENDER_TYPE] [varchar](1) NULL,
[THIRD_POSITION_LOAN_TYPE] [varchar](1) NULL,
[THIRD_POSITION_INTEREST_RATE_TYPE] [varchar](1) NULL,
[THIRD_POSITION_ESTIMATED_INTEREST_RATE] [float] NULL,
[THIRD_POSITION_LNDR_CREDIT_LINE] [varchar](1) NULL,
[THIRD_POSITION_MODELED_MORTGAGE_TYPE] [varchar](1) NULL,
[TOTAL_OUTSTANDING_LOANS] [bigint] NULL,
[LTV] [int] NULL,
[AVAILABLE_EQUITY] [int] NULL,
[LENDABLE_EQUITY] [int] NULL,
[PROCESS_ID] [int] NOT NULL,
[FILLER] [varchar](4) NULL,
CONSTRAINT [PK_RAW_Equity] PRIMARY KEY CLUSTERED 
(
[PROPERTY_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =    OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
如果原始地址还没有将SA_PROPERTY_ID作为索引第一个键的聚集索引,那么这可能会有帮助:

select 
     REPLICATE('0',2-LEN(RTRIM(a.MM_FIPS_STATE_CODE))) 
         + RTRIM(a.MM_FIPS_STATE_CODE)
         + REPLICATE('0',3-LEN(RTRIM(a.MM_FIPS_MUNI_CODE))) 
         + RTRIM(a.MM_FIPS_MUNI_CODE) 
         AS COUNTY_FIPS
    ,COUNT(e.PROPERTY_ID) as house_count
    ,AVG(cast(e.AVM_FINAL_VALUE as bigint)) as avg_avm
    ,max(cast(e.AVM_FINAL_VALUE as bigint)) as max_avm
    ,min(cast(e.AVM_FINAL_VALUE as bigint)) as min_avm
from 
    RAW_Equity e
    left join RAW_Address a 
          ON a.SA_PROPERTY_ID = e.PROPERTY_ID
where 
    e.AVM_CONFIDENCE_SCORE >= 70
group by 
    a.MM_FIPS_STATE_CODE, a.MM_FIPS_MUNI_CODE
您可以这样尝试:- 愿意知道,这个有多大,对你有帮助

CREATE INDEX IX_RAW_Address_SA_PROPERTY_ID ON RAW_Address(SA_PROPERTY_ID) 
INCLUDE (MM_FIPS_STATE_CODE, MM_FIPS_MUNI_CODE)
第一次尝试不使用任何索引,然后创建如上所述的聚集索引,然后重试上述相同的查询

Declare @result Table
(
     RowId              Int Identity(1,1) Primary Key
    ,COUNTY_FIPS        Varchar(100)
    ,MM_FIPS_STATE_CODE Int
    ,MM_FIPS_MUNI_CODE  Int
    ,house_count        Int
    ,avg_avm            Int
    ,max_avm            Int
    ,min_avm            Int
)

Insert Into @result(MM_FIPS_STATE_CODE,MM_FIPS_MUNI_CODE,house_count,avg_avm,max_avm,min_avm)
Select   a.MM_FIPS_STATE_CODE
        ,a.MM_FIPS_MUNI_CODE
        ,Count(e.PROPERTY_ID) as house_count
        ,Avg(Cast(e.AVM_FINAL_VALUE as bigint)) as avg_avm
        ,Max(Cast(e.AVM_FINAL_VALUE as bigint)) as max_avm
        ,Min(Cast(e.AVM_FINAL_VALUE as bigint)) as min_avm
From    RAW_Equity As e With (Nolock)
        Left Join RAW_Address As a With (Nolock) On e.PROPERTY_ID = a.SA_PROPERTY_ID
Where   e.AVM_CONFIDENCE_SCORE >= 70
Group by a.MM_FIPS_STATE_CODE
        ,a.MM_FIPS_MUNI_CODE

Update  r
Set     r.COUNTY_FIPS = REPLICATE('0',2-LEN(RTRIM(r.MM_FIPS_STATE_CODE))) + RTRIM(r.MM_FIPS_STATE_CODE) + REPLICATE('0',3-LEN(RTRIM(r.MM_FIPS_MUNI_CODE))) + RTRIM(r.MM_FIPS_MUNI_CODE)
From    @result As r

Select   r.COUNTY_FIPS
        ,r.house_count
        ,r.avg_avm
        ,r.max_avm
        ,r.min_avm
From    @result As r

谢谢,我现在要试试这个。查询时间没有太大差别,但谢谢你的评论。伙计,这太棒了:查询时间是12分钟,最初是23分钟。您能解释一下您的查询吗?我们的本地数据库表和表将保留在磁盘上,而“@table”变量将驻留在Ram上,因此,首先我在“@table”变量中存储了所有必需的字段以及应用的filter where子句,所以一旦所有磁盘操作完成,然后,通过update语句对驻留在Ram中的有限过滤器数据执行字符串连接操作,并最终从“@table”变量检索最终结果。
CREATE INDEX IX_RAW_Address_SA_PROPERTY_ID ON RAW_Address(SA_PROPERTY_ID) 
INCLUDE (MM_FIPS_STATE_CODE, MM_FIPS_MUNI_CODE)
Declare @result Table
(
     RowId              Int Identity(1,1) Primary Key
    ,COUNTY_FIPS        Varchar(100)
    ,MM_FIPS_STATE_CODE Int
    ,MM_FIPS_MUNI_CODE  Int
    ,house_count        Int
    ,avg_avm            Int
    ,max_avm            Int
    ,min_avm            Int
)

Insert Into @result(MM_FIPS_STATE_CODE,MM_FIPS_MUNI_CODE,house_count,avg_avm,max_avm,min_avm)
Select   a.MM_FIPS_STATE_CODE
        ,a.MM_FIPS_MUNI_CODE
        ,Count(e.PROPERTY_ID) as house_count
        ,Avg(Cast(e.AVM_FINAL_VALUE as bigint)) as avg_avm
        ,Max(Cast(e.AVM_FINAL_VALUE as bigint)) as max_avm
        ,Min(Cast(e.AVM_FINAL_VALUE as bigint)) as min_avm
From    RAW_Equity As e With (Nolock)
        Left Join RAW_Address As a With (Nolock) On e.PROPERTY_ID = a.SA_PROPERTY_ID
Where   e.AVM_CONFIDENCE_SCORE >= 70
Group by a.MM_FIPS_STATE_CODE
        ,a.MM_FIPS_MUNI_CODE

Update  r
Set     r.COUNTY_FIPS = REPLICATE('0',2-LEN(RTRIM(r.MM_FIPS_STATE_CODE))) + RTRIM(r.MM_FIPS_STATE_CODE) + REPLICATE('0',3-LEN(RTRIM(r.MM_FIPS_MUNI_CODE))) + RTRIM(r.MM_FIPS_MUNI_CODE)
From    @result As r

Select   r.COUNTY_FIPS
        ,r.house_count
        ,r.avg_avm
        ,r.max_avm
        ,r.min_avm
From    @result As r
CREATE INDEX IX_RAW_Address_SA_PROPERTY_ID ON RAW_Address(SA_PROPERTY_ID)