簡體   English   中英

是否有有效的SQL查詢大表的一部分

[英]Is there efficient SQL to query a portion of a large table

選擇數據的典型方法是:

select * from my_table

但是,如果表包含一千萬條記錄,而您只希望記錄300,010到300,020怎么辦?

有沒有一種方法可以在Microsoft SQL上創建一次只能獲得10條記錄的SQL語句?

例如

select * from my_table from records 300,010 to 300,020

這將比通過網絡檢索1000萬條記錄,將它們存儲在IIS服務器中然后計算到所需的記錄要有效得多。

SELECT * FROM my_table只是冰山一角。 假設您正在談論一個帶有主鍵標識字段的表,您可以說:

SELECT * FROM my_table WHERE ID >= 300010 AND ID <= 300020

您還應該知道,在許多圈子中,選擇*被認為是較差的做法。 他們希望您指定確切的列列表。

我使用包裝器查詢選擇核心查詢,然后從查詢中分離出我希望獲取的ROW號-這使SQL Server可以在CORE查詢中完成所有繁重的工作,並且只散發少量的表我所要求的。 您需要做的就是將[start_row_variable]和[end_row_variable]傳遞到SQL查詢中。

注意:order子句在核心查詢[sql_order_clause]之外指定

w1和w2是由SQL Server創建的TEMPORARY表,作為包裝器表。

SELECT
    w1.*
FROM(   
    SELECT w2.*, 
    ROW_NUMBER() OVER ([sql_order_clause]) AS ROW
    FROM (

        <!--- CORE QUERY START --->
        SELECT [columns]
        FROM [table_name]
        WHERE [sql_string]
        <!--- CORE QUERY END --->

   ) AS w2
) AS w1
WHERE ROW BETWEEN [start_row_variable] AND [end_row_variable]

這種方法極大地優化了我的數據庫系統。 效果很好。

重要說明:確保始終只在核心查詢中僅明確指定要檢索的確切列,因為在這些CORE查詢中獲取不必要的數據會花費您大量的開銷

絕對。 在MySQL和PostgreSQL(我使用過的兩個數據庫)上,語法為

SELECT [columns] FROM table LIMIT 10 OFFSET 300010;

在MS SQL上,它類似於SELECT TOP 10 ... ; 我不知道偏移記錄列表的語法。

請注意,您永遠不想使用SELECT * ; 如果有任何變化,這是維護的噩夢。 但是,此查詢將非常慢,因為您的數據庫將必須掃描並丟棄前300,010條記錄才能獲得所需的10條記錄。 這也將是不可預測的,因為您沒有告訴數據庫想要記錄的順序。

這是SQL的核心:告訴它要在特定范圍內用鍵標識的10條記錄,數據庫將盡最大的努力以最少的工作獲取並返回這些記錄。 查找有關SQL的任何教程,以獲取有關其工作原理的更多信息。

嘗試查看有關分頁的信息。 這是針對SQL Server的簡短摘要。

使用大型表時,通常最好使用SQL Server中可用的分區技術。

分區功能的規則通常指示給定分區中只能駐留一定范圍的數據。 例如,您可以按日期范圍或ID划分分區。

為了從特定分區中進行選擇,您將使用類似於以下內容的查詢。

SELECT <Column Name1>…/* 
FROM <Table Name> 
WHERE $PARTITION.<Partition Function Name>(<Column Name>) = <Partition Number>

請查看以下白皮書,以獲取有關SQL Server 2005中分區的更詳細信息。

http://msdn.microsoft.com/en-us/library/ms345146.aspx

我希望這會有所幫助,但是請隨時提出其他問題。

干杯,約翰

使用TOP僅選擇有限的行,例如:

SELECT TOP 10 * FROM my_table WHERE ID> = 300010

如果您希望結果按特定順序添加,請添加ORDER BY。

為了提高效率,ID列上必須有一個索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM