1. 程式人生 > >探索SQL Server元資料(三):索引元資料

探索SQL Server元資料(三):索引元資料

背景

在第一篇中我介紹瞭如何訪問元資料,元資料為什麼在資料庫裡面,以及如何使用元資料。介紹瞭如何查出各種資料庫物件的在資料庫裡面的名字。第二篇,我選擇了觸發器的主題,因為它是一個能提供很好例子的資料庫物件,並且在這個物件中能夠提出問題和解決問題。

本篇我將會介紹元資料中的索引,不僅僅是因為它們本身很重要,更重要的是它們是很好的元資料型別,比如列或者分佈統計,這些不是元資料中的物件。

索引對於任何關係資料庫表都是必不可少的。然而,就像吐司上的黃油一樣,過度使用它們可能會在資料庫中產生問題。有時,可以對錶進行過度索引或缺失索引,或者構建重複索引。有時問題是選擇一個壞的填充因子,錯誤地設定ignore_dup_key選項,建立一個永遠不會被使用(但必須被維護)的索引,丟失外來鍵上的索引,或者將GUID作為主鍵的一部分。簡而言之,任何頻繁使用的資料庫系統中的索引都需要定期維護和驗證,而目錄檢視是完成這些工作的最直接的方式之一。

都有哪些索引可以查到?

讓我們通過下面的簡單語句來看一下都有哪些索引在你的資料庫上,程式碼如下:

SELECT  convert(CHAR(50),object_schema_name(t.object_ID)+'.'
    +object_name(t.object_ID)) AS 'The Table', i.name AS index_name
FROM sys.indexes AS i
  INNER JOIN sys.tables t
    ON t.object_id=i.object_id
  WHERE is_hypothetical = 0 AND i.index_id <> 0
;

結果如下:

為什麼要去引用sys.tables?這是因為它是確保只獲得使用者表的最簡單方法。我們選擇index_id 的values大於0,因為如果不為表建立叢集索引,在sys中仍然有一個條目。索引,但它指向的是堆,不代表索引。每個表在sys中都有一行。索引值為0或1的索引。如果該表有一個聚集索引,則有一行資料且index_id值為1;如果該表是一個堆(這只是表示該表沒有聚集索引的另一種方式),則會有一行的index_id值為0。此外,無論該表是否有聚集索引,每個非聚集索引都有一行,其index_id值大於1。我們過濾了的索引,這些索引是由資料庫引擎優化顧問(DTA)建立的,目的僅僅是測試一個可能的索引是否有效。以防它們積累起來,最好把它們去掉。

如果你過一個多個指定的表,下面的這個查詢是更為合理的,需要在上面的例子中增加物件的指定:

AND t.object_id = OBJECT_ID('Production.BillOfMaterials');

每個表中有多少個索引,並展示他們的名字

前面的表並不特別有用,因為無法一眼看到每個表有多少索引,以及它們是什麼。下面這個語句可以實現:

SELECT  convert(CHAR(20),object_schema_name(t.object_ID)+'.'
    +object_name(t.object_ID)) AS 'The_Table',
sum(CASE WHEN i.object_ID IS NULL THEN 0 ELSE 1 END) AS The_Count,
coalesce(stuff(( 
     SELECT ', '+i2.name
       FROM sys.indexes i2
       WHERE t.object_ID = i2.object_ID
       ORDER BY i2.name
     FOR XML PATH(''), TYPE).value(N'(./text())[1]',N'varchar(8000)'),1,2,''),'') AS Index_List
  FROM sys.tables AS t
  LEFT OUTER JOIN sys.indexes i
    ON t.object_id=i.object_id
      AND is_hypothetical = 0 AND i.index_id > 0 
GROUP BY t.Object_ID;

我在老的測試資料庫上執行這個測試,物件名稱比較短。

The_Table            The_Count   Index_List
-------------------- ----------- --------------------------------------------------
dbo.publishers       1           UPKCL_pubind
dbo.titles           2           titleind, UPKCL_titleidind
dbo.titleauthor      3           auidind, titleidind, UPKCL_taind
dbo.stores           1           UPK_storeid
dbo.sales            2           titleidind, UPKCL_sales
dbo.roysched         1           titleidind
dbo.discounts        0           
dbo.jobs             1           PK__jobs__6E32B6A51A14E395
dbo.pub_info         1           UPKCL_pubinfo
dbo.employee         2           employee_ind, PK_emp_id
dbo.authors          2           aunmind, UPKCL_auidind

(11 row(s) affected)

查詢沒有聚集索引的表

關於索引,您可以找到很多有趣的東西。例如,這裡有一種快速查詢表的方法,無需使用聚集索引(堆)

-- 展示所有沒有聚集索引的表名稱
SELECT  object_schema_name(sys.tables.object_id)+'.'
    +object_name(sys.tables.object_id) AS 'Heaps'
      FROM sys.indexes /* see whether the table is a heap */
      INNER JOIN sys.tables ON sys.tables.object_ID=sys.indexes.object_ID
      WHERE sys.indexes.type = 0;

每個索引中有多少行在表裡面?

通過連線sys.partitions檢視,我們可以計算出索引中大約有多少行。我修改了一些程式碼,關聯了sys.extended_properties,這樣可以把備註的資訊帶出來。

--列出每個索引/堆的行數
SELECT 
  OBJECT_SCHEMA_NAME(t.object_id)+'.'+OBJECT_NAME(t.object_id) as 'Table',
  coalesce(i.NAME,'(IAM for heap)') as 'Index',
  Coalesce(
   (SELECT SUM(s.rows) FROM sys.partitions s WHERE s.object_id = i.object_id
        AND s.index_id = i.index_ID    
    ), 0) 'Rows',coalesce(ep.Value,'') as comments
 FROM sys.tables t
   INNER JOIN sys.indexes i ON i.object_id = t.object_id
   LEFT OUTER JOIN sys.Extended_Properties ep
   ON i.Object_Id = ep.Major_Id AND i.Index_Id = Minor_Id AND Class = 7;

然後,你可以修改這個程式碼,讓其只是展示每個在索引表中的表有多少行。

SELECT
  OBJECT_SCHEMA_NAME(t.object_id)+'.'+OBJECT_NAME(t.object_id) AS 'Table',  
  sum(rows) AS row_count
FROM sys.partitions p INNER JOIN sys.tables t 
   ON p.object_ID=t.object_ID 
WHERE index_id < 2 GROUP BY t.object_ID,Index_ID;

表中都有很多索引嗎?

如果您對某些表具有大量索引感到懷疑,那麼可以使用下面查詢,該查詢告訴您具有超過4個索引和索引計數超過列計數一半的表。它是一種任意選擇具有大量索引的表的方法。

--超過4個索引的表 
--索引個數超過列數一半

SELECT object_schema_name(TheIndexes.Object_ID) + '.'+ object_name(TheIndexes.Object_ID) AS TableName, Columns, Indexes FROM (SELECT count(*) AS indexes, t.object_ID FROM sys.indexes i INNER JOIN sys.tables t ON i.object_ID=t.object_ID GROUP BY t.object_ID) TheIndexes INNER JOIN (SELECT count(*) AS columns, t.object_ID FROM sys.columns c INNER JOIN sys.tables t ON c.object_ID=t.object_ID GROUP BY t.object_ID)TheColumns ON TheIndexes.object_ID=TheColumns.object_ID WHERE indexes>columns/2 AND indexes>4;

查詢更新過的索引缺沒有使用過有哪些?

總是有必要找出自上次啟動伺服器以來沒有使用的索引,特別是如果伺服器一直在做各種各樣的工作時。

--Indexes updated but not read.
SELECT
    object_schema_name(i.Object_ID) + '.'+ object_name(i.Object_ID) as Thetable,
    i.name    AS 'Index'
  FROM sys.indexes i
    left outer join sys.dm_db_index_usage_stats s 
      ON s.object_id = i.object_id
       AND s.index_id = i.index_id
       AND s.database_id = DB_ID()
  WHERE OBJECTPROPERTY(i.object_id, 'IsUserTable') = 1
    AND i.index_id > 0  --Exclude heaps.
    AND i.is_primary_key = 0 --and Exclude primary keys.
    AND i.is_unique = 0    --and Exclude unique constraints.
    AND coalesce(s.user_lookups + s.user_scans + s.user_seeks,0) = 0 --No user reads.
    AND coalesce(s.user_updates,0) > 0; --Index is being updated.

注意:我已經在程式碼裡使用了動態管理檢視sys.dm_db_index_usage_stats,這裡起到了手機使用資訊的作用,之後我們會更詳盡的使用換這個物件來說明其作用。

這些索引佔用了多少空間?

如果打算知道索引佔了多少空間,有許多‘胖’索引,就是包含了很多列,有可能索引中有的列不會出現在任何查詢中,這就是浪費了空間。

SELECT 
  object_schema_name(i.Object_ID) + '.'+ object_name(i.Object_ID) AS Thetable,
  coalesce(i.name,'heap IAM')    AS 'Index',
  convert(DECIMAL(9,2),(sum(a.total_pages) * 8.00) / 1024.00)    AS 'Index_MB'
FROM sys.indexes i
INNER JOIN sys.partitions p 
  ON i.object_id = p.object_id
    AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a 
  ON p.partition_id = a.container_id
  WHERE objectproperty(i.object_id, 'IsUserTable') = 1
GROUP BY i.object_id, i.index_id, i.name;

計算表總的索引空間

讓我們看看每個表的總索引空間,以及表中的行數。

SELECT 
  object_schema_name(i.Object_ID) + '.'+ object_name(i.Object_ID) AS Thetable,
  convert(DECIMAL(9,2),(sum(a.total_pages) * 8.00) / 1024.00)    AS 'Index_MB',
  max(row_count) AS 'Rows',
  count(*) AS Index_count
FROM sys.indexes i
INNER JOIN
  (SELECT object_ID,Index_ID, sum(rows) AS Row_count 
     FROM sys.partitions GROUP BY object_ID,Index_ID)f
  ON f.object_ID=i.object_ID AND f.index_ID=i.index_ID
INNER JOIN sys.partitions p 
  ON i.object_id = p.object_id
    AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a 
  ON p.partition_id = a.container_id
  WHERE objectproperty(i.object_id, 'IsUserTable') = 1
GROUP BY i.object_id;

如何查詢表使用索引的各種方式?

發現關於索引的某些屬性,通常最好使用屬性函式作為快捷方式。

-- 查詢沒有主鍵的表
SELECT  object_schema_name(object_id)+'.'+object_name(object_id) as No_Primary_key
  FROM sys.tables/* see whether the table has a primary key */
  WHERE objectproperty(OBJECT_ID,'TableHasPrimaryKey') = 0;


-- 查詢沒有索引的表
SELECT  object_schema_name(object_id)+'.'+object_name(object_id) as No_Indexes  
  FROM sys.tables /* see whether the table has any index */
  WHERE objectproperty(OBJECT_ID,'TableHasIndex') = 0;


-- )查詢沒有候選鍵的表
SELECT  object_schema_name(object_id)+'.'+object_name(object_id) as No_Candidate_Key
  FROM sys.tables/* if no unique constraint then it isn't relational */
  WHERE objectproperty(OBJECT_ID,'TableHasUniqueCnst') = 0
    AND   objectproperty(OBJECT_ID,'TableHasPrimaryKey') = 0;


--查詢帶有禁用索引的表
SELECT  distinct
  object_schema_name(object_id)+'.'+object_name(object_id) as Has_Disabled_indexes
  FROM sys.indexes /* don't leave these lying around */
  WHERE is_disabled=1;

那些是物件,那些不是?

你可能注意到了一些奇怪的事情。儘管表的一些屬性(如主鍵)本身就是物件,但列、統計或索引並非物件。讓我們弄清楚這一點,因為它不是完全直觀的體現在sys.objects,您可以找到關於所有公共資料庫元件的基本標準資訊,如表、檢視、同義詞、外來鍵、檢查約束、鍵約束、預設約束、服務佇列、觸發器和過程。我列出的所有這些元件都有其他屬性,這些屬性必須通過繼承相關基本屬性的檢視可見,但也包括與物件相關的資料列。最好使用這些特殊的檢視,因為它們有您需要的所有資訊,系統只過濾您感興趣的物件型別,比如表。各種物件(如約束和觸發器)在sys.objects中都有parent_ID,非零的物件表,顯示它們是子物件。

下面的查詢向您展示了一種檢視這些子物件並將其與父母關聯的簡單方法。

--查詢索引父物件(表名)和索引名稱
SELECT parent.name AS Parents_name, 
       child.name AS Childs_Name, 
       replace(lower(parent.type_desc),'_',' ') AS Parents_type, 
       replace(lower(child.type_desc),'_',' ') AS Childs_type
FROM sys.objects child
  INNER JOIN sys.objects parent
    ON parent.object_ID=child.parent_object_id
WHERE child.parent_object_id<>0
ORDER BY parents_name;

.

你會發現索引不是物件。在第一個查詢中,返回的object_ID是定義索引的表的ID。

這裡的問題是關係是複雜的。約束可以包含幾個列,也可以由索引強制。索引可以包含幾個列,但是順序很重要。統計資料還可以包含幾個列,也可以與索引相關聯。這意sys.indexes, sys.stats and sys.columns不從sys.objects繼承。引數和型別也是如此。

如何查詢每一個表的每一個索引的每一個列?

最簡單的查詢方式如下:

SELECT object_schema_name(t.object_ID)+'.'+t.name AS The_Table, --the name of the table
       i.name AS The_Index,  -- its index
       index_column_id,
       col_name(Ic.Object_Id, Ic.Column_Id) AS The_Column --the column
FROM sys.tables t
INNER JOIN sys.indexes i
    ON t.object_ID=i.object_ID
INNER JOIN sys.Index_columns  ic
    ON i.Object_ID=ic.Object_ID
    AND i.index_ID=ic.index_ID
ORDER BY t.name,i.index_id, index_column_id;

當然也可以指定特定表,例如:

  WHERE i.object_id = OBJECT_ID('Production.BillOfMaterials');

索引中有哪些列,順序又是什麼 ?

也可以彙總上面語句,每個索引彙總成一行,展示所有索引,具體程式碼如下:

SELECT object_schema_name(t.object_ID)+'.'+t.name AS The_Table, --the name of the table
   coalesce(stuff (--get a list of indexes
     (SELECT ', '+i.name
     +' ( '
         +stuff (--get a list of columns
         (SELECT ', ' + col_name(Ic.Object_Id, Ic.Column_Id) 
         FROM  sys.Index_columns  ic
         WHERE ic.Object_ID=i.Object_ID
         AND ic.index_ID=i.index_ID
         ORDER BY index_column_ID ASC
         FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,2,'') +' )'
     FROM sys.indexes i 
     WHERE i.object_ID=t.object_ID
     FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,2,''),'') AS Indexes
 FROM sys.tables t;

效果如下:

如何查詢XML索引?

XML索引被視為索引的擴充套件。我發現檢視其細節的最好方法是為它們構建一個CREATE語句。

SELECT 'CREATE' + case when secondary_type is null then ' PRIMARY' else '' end
 + ' XML INDEX '+coalesce(xi.name,'')+ '  
    ON ' --what table and column is this XML index on?
 + object_schema_name(ic.Object_ID)+'.'+object_name(ic.Object_ID)
 +' ('+col_name(Ic.Object_Id, Ic.Column_Id)+' )  
    '+ coalesce('USING XML INDEX [' + Using.Name + '] FOR ' + Secondary_Type_DeSc
     COLLATE database_default,'')    
    +'  
'+      replace('WITH ( ' + 
   stuff(
  CASE WHEN xi.Is_Padded <> 0 THEN ', PAD_INDEX  = ON ' ELSE '' END 
  + CASE 
     WHEN xi.Fill_Factor NOT IN (0, 100) 
        THEN ', FILLFACTOR  =' + convert(VARCHAR(3), xi.Fill_Factor) + ''
        ELSE '' END 
  + CASE WHEN xi.Ignore_dUp_Key <> 0 THEN ', IGNORE_DUP_KEY = ON' ELSE '' END 
  + CASE WHEN xi.Allow_Row_Locks = 0 THEN ', ALLOW_ROW_LOCKS  = OFF' ELSE '' END 
  + CASE WHEN xi.Allow_Page_Locks = 0 THEN ', ALLOW_PAGE_LOCKS  = OFF' ELSE ' ' END
   , 1, 1, '')
 + ')', 'WITH ( )', '') --create the list of xml index options
+  coalesce('/* '+convert(varchar(8000),Value)+ '*/','')--and any comment
    AS BuildScript
FROM sys.xml_Indexes xi
      inner join sys.index_columns ic 
   ON ic.Index_Id = xi.Index_Id
   AND ic.Object_Id = xi.Object_Id   
  LEFT OUTER JOIN sys.Indexes [USING]
   ON [USING].Index_Id = xi.UsIng_xml_Index_Id
   AND [USING].Object_Id = xi.Object_Id
  LEFT OUTER JOIN sys.Extended_Properties ep
   ON ic.Object_Id = ep.Major_Id AND ic.Index_Id = Minor_Id AND Class = 7
WHERE object_schema_name(ic.Object_ID) <>'sys' AND ic.index_id>0;


上面的查詢結果將顯示所有基本的XML索引細節作為構建指令碼。

元資料中還有其他型別的索引嗎?

還有兩種比較特殊的索引,一是空間索引,其資訊在sys.spatial_index_tessellations 和 sys.spatial_indexes表中。另一個是全文索引,其資訊在fulltext_index_fragments, fulltext_index_catalog_usages, fulltext_index_columnsfulltext_indexes表中儲存。

探索索引統計資訊

現在,讓我們討論一下分佈統計資料或“stats”。每個索引都有一個附加的統計物件,以便查詢優化器能夠提供一個合適的查詢計劃。為此,它需要估計資料的“基數”,以確定為任何索引值返回多少行,並使用這些“stats”物件告訴它資料是如何分佈的。

可以查詢統計資訊物件是如何與表進行關聯的,語句如下:

SELECT object_schema_name(t.Object_ID) + '.'+ t.name AS The_table, 
    stats.name AS Stats_Name, sys.columns.name AS Column_Name
  FROM sys.stats
 INNER JOIN sys.stats_columns
    ON stats.object_id = stats_columns.object_id
   AND stats.stats_id = stats_columns.stats_id
 INNER JOIN sys.columns
    ON stats_columns.object_id = columns.object_id
   AND stats_columns.column_id = columns.column_id
 INNER JOIN sys.tables t
    ON stats.object_id = t.object_id;

當它們與索引相關聯時,統計資料繼承索引的名稱,並使用與索引相同的列。

檢查重複的統計資訊

通過比較與每個統計資訊相關聯的列號列表,您可以快速檢視同一列或一組列是否有多個統計資訊。

SELECT object_schema_name(Object_ID)+'.'+object_name(Object_ID) as tableName,
       count(*) as Similar, ColumnList as TheColumn, 
       max(name)+', '+min(name) as duplicates
FROM 
   (SELECT Object_ID, name,   
     stuff (--get a list of columns
         (SELECT ', ' + col_name(sc.Object_Id, sc.Column_Id)
         FROM  sys.stats_columns  sc
         WHERE sc.Object_ID=s.Object_ID
         AND sc.stats_ID=s.stats_ID
         ORDER BY stats_column_ID ASC
         FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,2,'') AS ColumnList
   FROM sys.stats s)f
GROUP BY Object_ID,ColumnList 
HAVING count(*) >1;

結果如下:

展示了包含重複的統計物件,在本例中是sales.customer表在AccountNumber列上有兩個類似的統計物件。

總結

相關推薦

探索SQL Server資料索引資料

背景 在第一篇中我介紹瞭如何訪問元資料,元資料為什麼在資料庫裡面,以及如何使用元資料。介紹瞭如何查出各種資料庫物件的在資料庫裡面的名字。第二篇,我選擇了觸發器的主題,因為它是一個能提供很好例子的資料庫物件,並且在這個物件中能夠提出問題和解決問題。 本篇我將會介紹元資料中的索引,不僅僅是因為它們本身很重要,更

SQL Server 到 MySQL 異構資料庫遷移

背景 滬江成立於 2001 年,作為較早期的教育學習網站, 當時技術選型範圍並不大: Java 的版本是 1.2,C# 尚未誕生,MySQL 還沒有被 Sun 收購, 版本號是 3.23。 工程師們選擇了當時最合適的微軟體系,並在日後的歲月裡, 逐步從 ASP 過度到 .net,資料庫也跟隨 SQL Ser

不耗電傳輸資料避免多餘的下載

避免多餘的下載 很多使用者間歇性的聯網並且有下載量的限制。你可以鼓勵使用者與應用互動的時候儘量降低下載量。 降低下載量最根本的方式就是隻下載有用的資料。這裡的資料指的是實現了REST API,允許你指定查詢標準,用引數比如上次下載時間來限制返回的資料。 相似的,當下載圖片時,最好在伺服器

高斯消用Python簡單實現順序消

# coding:utf-8 import numpy as np import sys # 設定矩陣 def set_matrix(): # 設定係數矩陣A matrix_a =np.mat([ [2.0, 1.0, 2.0],

實現物件的複用——享模式圍棋棋子的解決方案

14.3 完整解決方案 為了節約儲存空間,提高系統性能,Sunny公司開發人員使用享元模式來設計圍棋軟體中的棋子,其基本結構如圖14-4所示: 在圖14-4中,IgoChessman充當抽象享元類,BlackIgoChessman和WhiteIgoChe

Elasticsearch 通關教程 索引別名Aliases問題

業務問題 業務需求是不斷變化迭代的,也許我們之前寫的某個業務邏輯在下個版本就變化了,我們可能需要修改原來的設計,例如資料庫可能需要新增一個欄位或刪減一個欄位,而在搜尋中也會發生這件事,即使你認為現在的索引設計已經很完美了,在生產環境中,還是有可能需要做一些修改的,需要新增對映欄位或者需要修改欄位型別等等。

ElasticSearch原始碼解析索引建立

我們先來看看索引建立的事例程式碼: Directory directory = FSDirectory.getDirectory("/tmp/testindex"); // Use standard analyzer Analyzer analyzer = new

MySQL優化索引原理及索引優化

建立高效能索引索引是提高MySQL查詢效能的一個重要途徑,但過多的索引可能會導致過高的磁碟使用率以及過高的記憶體佔用,從而影響應用程式的整體效能。應當儘量避免事後才想起新增索引,因為事後可能需要監控大量的SQL才能定位到問題所在,而且新增索引的時間肯定是遠大於初始新增索引所需

SQL Server 2005中的分區表將普通表轉換成分區表

成了 insert 刪掉 -- pri light part ide 新建 在設計數據庫時,經常沒有考慮到表分區的問題,往往在數據表承重的負擔越來越重時,才會考慮到分區方式,這時,就涉及到如何將普通表轉換成分區表的問題了。 那麽,如何將一個普通表轉換成一個分區表 呢

ElasticSearch實踐系列探索資料

前言 經過前兩篇文章得實踐,我們已經瞭解了ElasticSearch的基礎知識,本篇文章讓我來操作一些更真實的資料集。我們可以利用www.json-generator.com/生成如下的文件結構: { "account_number": 1, "balance": 39225,

Kylin實踐--跨叢集資料遷移

Kylin跨叢集元資料遷移第一步:在待遷移叢集上備份元資料,命令如下:$KYLIN_HOME/bin/metastore.sh backup看到如下提示時即為備份成功:metadata store backed up to /opt/kylin/apache-kylin-2.

python列表、

python一、列表的定義1. 創建列表>>> name = [‘gao‘, ‘sam‘, ‘snow‘, ‘jey‘] >>> type(name) <type ‘list‘> >>> name=list([‘gao‘, ‘sam‘, ‘sn

python學習筆記列表和

python列表(list)是Python以及其他語言中最常用到的數據結構之一。Python使用使用中括號 [ ] 來解析列表。列表是可變的(mutable)——可以改變列表的內容。對應操作:1、查([]切片操作) name = [‘tom‘,‘張三‘,‘joker‘,‘李四‘] print(name[2])

在 Windows Server Container 中運行 Azure Storage Emulator運行在容器中

們的 x86 有關 doc fault ps1 count1 ora isn   上一節中,我們已經準備好了 SQL Server,那麽接下來,我們要把 ASE 放到容器裏了。   首先,新建 Start.ps1,內容如下: 1 param( 2 [Param

PL/SQL輕量版——遊標與異常處理

多個 次循環 指向 count dbms 都是 不能 weight acl 一、遊標   1.概念     遊標是一個 指向上下文的句柄( handle) 或指針。通過遊標,PL/SQL 可以控制上下文區和處理語句時上下文區會發生些什麽事情。   2.遊標處理   

Sql Service的藝術 SQL聚合函數的應用

包括 不同 過程 接下來 日期 p s 不可 tno 函數名 SQL提供的聚合函數有求和,最大值,最小值,平均值,計數函數等。 聚合函數及其功能: 函數名稱 函數功能 SUM() 返回選取結果集中所有值的總和 MAX() 返回選取結果集中所有值的最大值 M

Python基礎字符串和組常用方法

所有 列表 www. bsp 介紹 不改變 結果 範圍 target 字符串 在python中單引號和雙引號所表示的字符串並沒有區別,字符串具有不可變性,及所有操作均不改變原字符串的值。另外三個雙引號和單引號包起來的字符串可以換行寫入。 In [83]: ‘‘‘sss

Spark SQL筆記整理加載保存功能與Spark SQL函數

code ren maven依賴 append 關聯 dfs 取值 struct nal 加載保存功能 數據加載(json文件、jdbc)與保存(json、jdbc) 測試代碼如下: package cn.xpleaf.bigdata.spark.scala.sql.p1

PYTHON字典 祖 列表嘗試應用

插入元素 嘗試 想要 可用 .so 輸入 添加內容 控制 劃線 1、 使用 join 方法將下劃線添加到列表的每一個元素拼接成字符串,li = [‘alex‘, ‘eric‘, ‘rain‘] li = [‘boom‘, ‘TNT‘, ‘zhadan‘] dayin

SQL Server進階T-SQL查詢和編程的背景

.com src 編程 server 分享 bubuko 進階 分享圖片 img SQL Server進階(一)T-SQL查詢和編程的背景